http: change client/server to support LF and CRLF delimited headers.
							parent
							
								
									24232cb095
								
							
						
					
					
						commit
						46f8225f7a
					
				| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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 -- )
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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 ;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			@ -27,3 +28,13 @@ IN: http.server.tests
 | 
			
		|||
    <response>
 | 
			
		||||
    unparse-content-type
 | 
			
		||||
] 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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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 )
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue