http: change client/server to support LF and CRLF delimited headers.

db4
John Benediktsson 2011-10-12 12:51:49 -07:00
parent 24232cb095
commit 46f8225f7a
5 changed files with 31 additions and 10 deletions

View File

@ -1,5 +1,5 @@
USING: accessors http.client http.client.private http tools.test
namespaces urls ;
USING: accessors http.client http.client.private http
io.streams.string kernel namespaces sequences tools.test urls ;
IN: http.client.tests
[ "localhost" f ] [ "localhost" parse-host ] unit-test
@ -43,3 +43,13 @@ IN: http.client.tests
[ "TRACE" ] [ "http://concatenative.org" <trace-request> method>> ] unit-test
[ "OPTIONS" ] [ "http://factorcode.org" <options-request> method>> ] unit-test
[ t ] [
{
"HTTP/1.1 200 Document follows"
"connection: close"
"content-type: text/html; charset=UTF-8"
"date: Wed, 12 Oct 2011 18:57:49 GMT"
"server: Factor http.server"
} [ "\n" join ] [ "\r\n" join ] bi
[ [ read-response ] with-string-reader ] bi@ =
] unit-test

View File

@ -56,7 +56,7 @@ ERROR: too-many-redirects ;
drop ;
: read-response-line ( response -- response )
read-crlf parse-response-line first3
read-?crlf parse-response-line first3
[ >>version ] [ >>code ] [ >>message ] tri* ;
: detect-encoding ( response -- encoding )
@ -98,14 +98,14 @@ SYMBOL: redirects
] [ too-many-redirects ] if ; inline recursive
: read-chunk-size ( -- n )
read-crlf ";" split1 drop [ blank? ] trim-tail
read-?crlf ";" split1 drop [ blank? ] trim-tail
hex> [ "Bad chunk size" throw ] unless* ;
: read-chunked ( quot: ( chunk -- ) -- )
read-chunk-size dup zero?
[ 2drop ] [
read [ swap call ] [ drop ] 2bi
read-crlf B{ } assert= read-chunked
read-?crlf B{ } assert= read-chunked
] if ; inline recursive
: read-response-body ( quot response -- )

View File

@ -11,7 +11,7 @@ IN: http
CONSTANT: max-redirects 10
: (read-header) ( -- alist )
[ read-crlf dup f like ] [ parse-header-line ] produce nip ;
[ read-?crlf dup f like ] [ parse-header-line ] produce nip ;
: collect-headers ( assoc -- assoc' )
H{ } clone [ '[ _ push-at ] assoc-each ] keep ;

View File

@ -1,5 +1,6 @@
USING: http http.server math sequences continuations tools.test
io.encodings.utf8 io.encodings.binary accessors ;
USING: accessors continuations http http.server
io.encodings.utf8 io.encodings.binary io.streams.string kernel
math sequences tools.test ;
IN: http.server.tests
[ t ] [ [ \ + first ] [ <500> ] recover response? ] unit-test
@ -26,4 +27,14 @@ IN: http.server.tests
[ "application/octet-stream" ] [
<response>
unparse-content-type
] unit-test
] unit-test
[ t ] [
{
"GET / HTTP/1.1"
"connection: close"
"host: 127.0.0.1:55532"
"user-agent: Factor http.client"
} [ "\n" join ] [ "\r\n" join ] bi
[ [ read-request ] with-string-reader ] bi@ =
] unit-test

View File

@ -37,7 +37,7 @@ IN: http.server
dup path>> "/" head? [ "Bad request: URL" throw ] unless ; inline
: read-request-line ( request -- request )
read-crlf parse-request-line first3
read-?crlf parse-request-line first3
[ >>method ] [ >url check-absolute >>url ] [ >>version ] tri* ;
: read-request-header ( request -- request )