]> gitweb.factorcode.org Git - factor.git/blobdiff - basis/http/parsers/parsers.factor
factor: trim using lists
[factor.git] / basis / http / parsers / parsers.factor
index 2a5b77874a43f678dbd15e2b1625473a294ebcd4..3499ee6ca34b8337b866c454d570e8d445863f53 100644 (file)
@@ -1,8 +1,7 @@
 ! Copyright (C) 2008 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: combinators.short-circuit math math.order math.parser
-kernel sequences sequences.deep peg peg.parsers assocs arrays
-hashtables strings namespaces make ascii ;
+USING: arrays ascii combinators.short-circuit kernel make
+math.parser peg peg.parsers sequences sequences.deep strings ;
 IN: http.parsers
 
 : except ( quot -- parser )
@@ -11,9 +10,15 @@ IN: http.parsers
 : except-these ( quots -- parser )
     [ 1|| ] curry except ; inline
 
+: cookie-key-disallow? ( ch -- ? )
+    " \t,;=" member? ;
+
 : tspecial? ( ch -- ? )
     "()<>@,;:\\\"/[]?={} \t" member? ;
 
+: cookie-key-parser ( -- parser )
+    { [ control? ] [ cookie-key-disallow? ] } except-these repeat1 ;
+
 : token-parser ( -- parser )
     { [ control? ] [ tspecial? ] } except-these repeat1 ;
 
@@ -30,7 +35,7 @@ IN: http.parsers
     [ token ] map choice ;
 
 : http-method-parser ( -- parser )
-    { "OPTIONS" "GET" "HEAD" "POST" "PUT" "DELETE" "TRACE" "CONNECT" } one-of ;
+    { "OPTIONS" "GET" "HEAD" "POST" "PUT" "DELETE" "TRACE" "CONNECT" "PATCH" } one-of ;
 
 : url-parser ( -- parser )
     [ " \t\r\n" member? ] except repeat1 case-sensitive ;
@@ -67,7 +72,7 @@ IN: http.parsers
     ] seq* [ "1.0" suffix! ] action ;
 
 PEG: parse-request-line ( string -- triple )
-    #! Triple is { method url version }
+    ! Triple is { method url version }
     full-request-parser simple-request-parser 2array choice ;
 
 : text-parser ( -- parser )
@@ -80,7 +85,7 @@ PEG: parse-request-line ( string -- triple )
     text-parser repeat0 case-sensitive ;
 
 PEG: parse-response-line ( string -- triple )
-    #! Triple is { version code message }
+    ! Triple is { version code message }
     [
         space-parser ,
         http-version-parser ,
@@ -97,7 +102,7 @@ PEG: parse-response-line ( string -- triple )
     [ " \t" member? ] satisfy repeat1 ;
 
 : qdtext-parser ( -- parser )
-    { [ CHAR: " = ] [ control? ] } except-these ;
+    { [ CHAR: \" = ] [ control? ] } except-these ;
 
 : quoted-char-parser ( -- parser )
     "\\" token hide any-char 2seq ;
@@ -120,8 +125,8 @@ PEG: parse-response-line ( string -- triple )
     2choice ;
 
 PEG: parse-header-line ( string -- pair )
-    #! Pair is either { name value } or { f value }. If f, its a
-    #! continuation of the previous header line.
+    ! Pair is either { name value } or { f value }. If f, its a
+    ! continuation of the previous header line.
     [
         field-name-parser ,
         space-parser ,
@@ -144,7 +149,7 @@ PEG: parse-header-line ( string -- pair )
     2choice case-sensitive ;
 
 : attr-parser ( -- parser )
-    token-parser case-sensitive ;
+    cookie-key-parser case-sensitive ;
 
 : av-pair-parser ( -- parser )
     [