-
Notifications
You must be signed in to change notification settings - Fork 128
Expand file tree
/
Copy pathhttp.pxi
More file actions
49 lines (39 loc) · 1.38 KB
/
http.pxi
File metadata and controls
49 lines (39 loc) · 1.38 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
(ns pixie.parser.http
(:require [pixie.parser :refer :all]))
(defn merge-rf
([] {})
([acc] acc)
([acc itm]
(merge acc itm)))
(defparser HTTP-REQUEST []
NEWLINE (and (eat \space)
(maybe \return)
\newline)
NOT-NEWLINE (parse-if (complement #{\newline \return}))
TO-END-OF-LINE (one+chars NOT-NEWLINE)
TO-COLON (one+chars (parse-if (complement #{\newline \return \:})))
WHITESPACE? (eat \space)
NOT-WHITESPACE (parse-if (complement #{\space \newline \return}))
REQUEST-LINE (and (one+chars NOT-WHITESPACE) -> method
WHITESPACE?
(one+chars NOT-WHITESPACE) -> path
WHITESPACE?
(one+chars NOT-WHITESPACE) -> protocol
NEWLINE
<- {:method method
:path path
:protocol protocol})
HEADER (and TO-COLON -> k
\:
WHITESPACE?
TO-END-OF-LINE -> v
NEWLINE
<- {k v})
REQUEST (and REQUEST-LINE -> request
(zero+ HEADER merge-rf) -> headers
; \return
; \newline
<- (assoc request :headers headers)))
(def test-request
"GET /foo/bar http/1.1\r\nHost: foo.bar.com\r\n\r\n")
( (:REQUEST HTTP-REQUEST) (string-cursor test-request))