diff --git a/basis/http/parsers/parsers.factor b/basis/http/parsers/parsers.factor index 99c346f2dec..4d8c8bd568d 100644 --- a/basis/http/parsers/parsers.factor +++ b/basis/http/parsers/parsers.factor @@ -46,8 +46,7 @@ IN: http.parsers { "0" "1" } one-of , ] seq* [ "" concat-as ] action ; -PEG: parse-request-line ( string -- triple ) - #! Triple is { method url version } +: 'full-request' ( -- parser ) [ 'space' , 'http-method' , @@ -56,7 +55,20 @@ PEG: parse-request-line ( string -- triple ) 'space' , 'http-version' , 'space' , - ] seq* just ; + ] seq* ; + +: 'simple-request' ( -- parser ) + [ + 'space' , + "GET" token , + 'space' , + 'url' , + 'space' , + ] seq* [ "1.0" suffix! ] action ; + +PEG: parse-request-line ( string -- triple ) + #! Triple is { method url version } + 'full-request' 'simple-request' 2array choice ; : 'text' ( -- parser ) [ control? ] except ; diff --git a/basis/http/server/server-tests.factor b/basis/http/server/server-tests.factor index cfadfeb217e..bdf6cf26fdd 100644 --- a/basis/http/server/server-tests.factor +++ b/basis/http/server/server-tests.factor @@ -63,6 +63,23 @@ IN: http.server.tests [ read-request ] with-string-reader ] unit-test +! RFC 1945; Section 4.1 +! Implement a version of Simple-Request, although rather than +! parse version 0.9, we parse 1.0 to return a Full-Response. +[ + T{ request + { method "GET" } + { url URL" /" } + { version "1.0" } + { header H{ } } + { cookies V{ } } + { redirects 10 } + } +] [ + "\r\n\r\n\r\nGET /\r\n\r\n" + [ read-request ] with-string-reader +] unit-test + ! Don't rethrow parse-errors with an empty request string. They are ! expected from certain browsers when the server serves a certificate ! that the browser can't verify.