git.iko.soy/typeable/attoparsec
on master help sign in
Update examples

--HG-- rename : examples/TestRFC2616.hs => examples/Atto_RFC2616.hs extra : rebase_source : 803b55f30cbd34d19a5e4ac0266d5d2210089216

commitbfaa3500ffde0674168600a2ede1c974f76b45b5 authorBryan O'Sullivan <bos@serpentine.com> dateFri 23 May 2014, 11:13 (12 years ago) parent96d929f
8 files changed+590−41
.hgignore+4−1 examples/TestRFC2616.hs → examples/Atto_RFC2616.hs+16−8 examples/Makefile+6−2 examples/Parsec_RFC2616.hs+9−6 examples/RFC2616.hs+3−3 examples/attoparsec-examples.cabal+31 examples/http-requests.txt+494 examples/rfc2616.c+27−21
.hgignore+4−1
@@ -1,11 +1,14 @@
1−^(?:\.cabal-sandbox|benchmarks/\.cabal-sandbox|cabal-dev|dist)$
21\.(?:aux|eventlog|h[ip]|hs.html|log|[mt]ix|[oa]|orig|prof|ps|rej|swp)$
32~$
3+^(?:.+/|)\.cabal-sandbox/
4+^(?:.+/|)dist/
45benchmarks/Arse
56benchmarks/dist
67benchmarks/med.txt
78benchmarks/tiny
89cabal.sandbox.config
10+examples/c-http
11+examples/http_parser.[ch]
912hpc.*\.html$
1013
1114syntax: glob
examples/TestRFC2616.hs → examples/Atto_RFC2616.hsrenamed+16−8
@@ -1,21 +1,28 @@
11{-# LANGUAGE BangPatterns #-}
2−import RFC2616
3−import Control.Monad (forM_)
4−import System.IO
2+
3+module Main (main) where
4+
5+import Control.Applicative
56import Control.Exception (bracket)
7+import Control.Monad (forM_)
8+import Data.Attoparsec.ByteString
9+import RFC2616
610import System.Environment
11+import System.IO
712import qualified Data.ByteString.Char8 as B
8−import Data.Attoparsec
913
10−refill h = B.hGet h (4*1024)
14+refill :: Handle -> IO B.ByteString
15+refill h = B.hGet h (80*1024)
1116
17+listy :: FilePath -> Handle -> IO ()
1218listy file h = do
1319 r <- parseWith (refill h) (many request) =<< refill h
1420 case r of
1521 Fail _ _ msg -> hPutStrLn stderr $ file ++ ": " ++ msg
1622 Done _ reqs -> print (length reqs)
17−
18−incrementy file h = go 0 =<< refill h
23+
24+incrementy :: FilePath -> Handle -> IO ()
25+incrementy file h = go (0::Int) =<< refill h
1926 where
2027 go !n is = do
2128 r <- parseWith (refill h) request is
@@ -28,7 +35,8 @@ incrementy file h = go 0 =<< refill h
2835 then print (n+1)
2936 else go (n+1) s
3037 | otherwise -> go (n+1) bs
31−
38+
39+main :: IO ()
3240main = do
3341 args <- getArgs
3442 forM_ args $ \arg ->
examples/Makefile+6−2
@@ -1,4 +1,4 @@
1−CC := gcc
1+CC := cc
22CFLAGS := -O3 -Wall
33# To make the code about 6% faster:
44# CFLAGS += -fwhole-program --combine
@@ -12,4 +12,8 @@ c-http: rfc2616.c http_parser.c
1212clean:
1313 rm -f *.hi *.o c-http
1414
15−vpath %.c $(HOME)/hg/http-parser
15+http_parser.c: http_parser.h
16+ curl -O https://raw.githubusercontent.com/joyent/http-parser/master/http_parser.c
17+
18+http_parser.h:
19+ curl -O https://raw.githubusercontent.com/joyent/http-parser/master/http_parser.h
examples/Parsec_RFC2616.hs+9−6
@@ -23,15 +23,16 @@ token :: Stream s m Char => ParsecT s u m Char
2323token = satisfy $ \c -> S.notMember (fromEnum c) set
2424 where set = S.fromList . map fromEnum $ ['\0'..'\31'] ++ "()<>@,;:\\\"/[]?={} \t" ++ ['\128'..'\255']
2525
26+isHorizontalSpace :: Char -> Bool
2627isHorizontalSpace c = c == ' ' || c == '\t'
2728
2829skipHSpaces :: Stream s m Char => ParsecT s u m ()
2930skipHSpaces = skipMany1 (satisfy isHorizontalSpace)
3031
3132data Request = Request {
32− requestMethod :: String
33− , requestUri :: String
34− , requestProtocol :: String
33+ _requestMethod :: String
34+ , _requestUri :: String
35+ , _requestProtocol :: String
3536 } deriving (Eq, Ord, Show)
3637
3738requestLine :: Stream s m Char => ParsecT s u m Request
@@ -47,8 +48,8 @@ endOfLine :: Stream s m Char => ParsecT s u m ()
4748endOfLine = (string "\r\n" *> pure ()) <|> (char '\n' *> pure ())
4849
4950data Header = Header {
50− headerName :: String
51− , headerValue :: [String]
51+ _headerName :: String
52+ , _headerValue :: [String]
5253 } deriving (Eq, Ord, Show)
5354
5455messageHeader :: Stream s m Char => ParsecT s u m Header
@@ -61,14 +62,16 @@ messageHeader = do
6162request :: Stream s m Char => ParsecT s u m (Request, [Header])
6263request = (,) <$> requestLine <*> many messageHeader <* endOfLine
6364
65+listy :: FilePath -> IO ()
6466listy arg = do
6567 r <- parseFromFile (many request) arg
6668 case r of
6769 Left err -> putStrLn $ arg ++ ": " ++ show err
6870 Right rs -> print (length rs)
6971
72+chunky :: FilePath -> IO ()
7073chunky arg = bracket (openFile arg ReadMode) hClose $ \h ->
71− loop 0 =<< B.hGetContents h
74+ loop (0::Int) =<< B.hGetContents h
7275 where
7376 loop !n bs
7477 | B.null bs = print n
examples/RFC2616.hs+3−3
@@ -16,9 +16,9 @@ module RFC2616
1616 ) where
1717
1818import Control.Applicative
19−import Data.Attoparsec as P
20−import qualified Data.Attoparsec.Char8 as P8
21−import Data.Attoparsec.Char8 (char8, endOfLine, isDigit_w8)
19+import Data.Attoparsec.ByteString as P
20+import qualified Data.Attoparsec.ByteString.Char8 as P8
21+import Data.Attoparsec.ByteString.Char8 (char8, endOfLine, isDigit_w8)
2222import Data.Word (Word8)
2323import qualified Data.ByteString.Char8 as B hiding (map)
2424import qualified Data.ByteString as B (map)
examples/attoparsec-examples.cabalnew file+31
@@ -0,0 +1,31 @@
1+-- These examples are not intended to be installed.
2+-- So don't install 'em.
3+
4+name: attoparsec-examples
5+version: 0
6+cabal-version: >=1.6
7+build-type: Simple
8+
9+executable atto-rfc2616
10+ main-is: Atto_RFC2616.hs
11+ hs-source-dirs: .. .
12+ ghc-options: -O2 -Wall -rtsopts
13+ build-depends:
14+ array,
15+ base == 4.*,
16+ bytestring >= 0.10.4.0,
17+ deepseq >= 1.1,
18+ scientific >= 0.3.1,
19+ text >= 1.1.1.0
20+
21+executable parsec-rfc2616
22+ main-is: Parsec_RFC2616.hs
23+ hs-source-dirs: .
24+ ghc-options: -O2 -Wall -rtsopts
25+ build-depends:
26+ array,
27+ base == 4.*,
28+ containers,
29+ bytestring >= 0.10.4.0,
30+ parsec,
31+ text >= 1.1.1.0
examples/http-requests.txtnew file+494
@@ -0,0 +1,494 @@
1+GET / HTTP/1.1
2+Host: www.reddit.com
3+User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101 Firefox/15.0.1
4+Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
5+Accept-Language: en-us,en;q=0.5
6+Accept-Encoding: gzip, deflate
7+Connection: keep-alive
8+
9+GET /reddit.v_EZwRzV-Ns.css HTTP/1.1
10+Host: www.redditstatic.com
11+User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101 Firefox/15.0.1
12+Accept: text/css,*/*;q=0.1
13+Accept-Language: en-us,en;q=0.5
14+Accept-Encoding: gzip, deflate
15+Connection: keep-alive
16+Referer: http://www.reddit.com/
17+
18+GET /reddit-init.en-us.O1zuMqOOQvY.js HTTP/1.1
19+Host: www.redditstatic.com
20+User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101 Firefox/15.0.1
21+Accept: */*
22+Accept-Language: en-us,en;q=0.5
23+Accept-Encoding: gzip, deflate
24+Connection: keep-alive
25+Referer: http://www.reddit.com/
26+
27+GET /reddit.en-us.31yAfSoTsfo.js HTTP/1.1
28+Host: www.redditstatic.com
29+User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101 Firefox/15.0.1
30+Accept: */*
31+Accept-Language: en-us,en;q=0.5
32+Accept-Encoding: gzip, deflate
33+Connection: keep-alive
34+Referer: http://www.reddit.com/
35+
36+GET /kill.png HTTP/1.1
37+Host: www.redditstatic.com
38+User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101 Firefox/15.0.1
39+Accept: image/png,image/*;q=0.8,*/*;q=0.5
40+Accept-Language: en-us,en;q=0.5
41+Accept-Encoding: gzip, deflate
42+Connection: keep-alive
43+Referer: http://www.reddit.com/
44+
45+GET /icon.png HTTP/1.1
46+Host: www.redditstatic.com
47+User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101 Firefox/15.0.1
48+Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
49+Accept-Language: en-us,en;q=0.5
50+Accept-Encoding: gzip, deflate
51+Connection: keep-alive
52+
53+GET /favicon.ico HTTP/1.1
54+Host: www.redditstatic.com
55+User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101 Firefox/15.0.1
56+Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
57+Accept-Language: en-us,en;q=0.5
58+Accept-Encoding: gzip, deflate
59+Connection: keep-alive
60+
61+GET /AMZM4CWd6zstSC8y.jpg HTTP/1.1
62+Host: b.thumbs.redditmedia.com
63+User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101 Firefox/15.0.1
64+Accept: image/png,image/*;q=0.8,*/*;q=0.5
65+Accept-Language: en-us,en;q=0.5
66+Accept-Encoding: gzip, deflate
67+Connection: keep-alive
68+Referer: http://www.reddit.com/
69+
70+GET /jz1d5Nm0w97-YyNm.jpg HTTP/1.1
71+Host: b.thumbs.redditmedia.com
72+User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101 Firefox/15.0.1
73+Accept: image/png,image/*;q=0.8,*/*;q=0.5
74+Accept-Language: en-us,en;q=0.5
75+Accept-Encoding: gzip, deflate
76+Connection: keep-alive
77+Referer: http://www.reddit.com/
78+
79+GET /aWGO99I6yOcNUKXB.jpg HTTP/1.1
80+Host: a.thumbs.redditmedia.com
81+User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101 Firefox/15.0.1
82+Accept: image/png,image/*;q=0.8,*/*;q=0.5
83+Accept-Language: en-us,en;q=0.5
84+Accept-Encoding: gzip, deflate
85+Connection: keep-alive
86+Referer: http://www.reddit.com/
87+
88+GET /rZ_rD5TjrJM0E9Aj.css HTTP/1.1
89+Host: e.thumbs.redditmedia.com
90+User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101 Firefox/15.0.1
91+Accept: text/css,*/*;q=0.1
92+Accept-Language: en-us,en;q=0.5
93+Accept-Encoding: gzip, deflate
94+Connection: keep-alive
95+Referer: http://www.reddit.com/
96+
97+GET /tmsPwagFzyTvrGRx.jpg HTTP/1.1
98+Host: a.thumbs.redditmedia.com
99+User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101 Firefox/15.0.1
100+Accept: image/png,image/*;q=0.8,*/*;q=0.5
101+Accept-Language: en-us,en;q=0.5
102+Accept-Encoding: gzip, deflate
103+Connection: keep-alive
104+Referer: http://www.reddit.com/
105+
106+GET /KYgUaLvXCK3TCEJx.jpg HTTP/1.1
107+Host: a.thumbs.redditmedia.com
108+User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101 Firefox/15.0.1
109+Accept: image/png,image/*;q=0.8,*/*;q=0.5
110+Accept-Language: en-us,en;q=0.5
111+Accept-Encoding: gzip, deflate
112+Connection: keep-alive
113+Referer: http://www.reddit.com/
114+
115+GET /81pzxT5x2ozuEaxX.jpg HTTP/1.1
116+Host: e.thumbs.redditmedia.com
117+User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101 Firefox/15.0.1
118+Accept: image/png,image/*;q=0.8,*/*;q=0.5
119+Accept-Language: en-us,en;q=0.5
120+Accept-Encoding: gzip, deflate
121+Connection: keep-alive
122+Referer: http://www.reddit.com/
123+
124+GET /MFqCUiUVPO5V8t6x.jpg HTTP/1.1
125+Host: a.thumbs.redditmedia.com
126+User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101 Firefox/15.0.1
127+Accept: image/png,image/*;q=0.8,*/*;q=0.5
128+Accept-Language: en-us,en;q=0.5
129+Accept-Encoding: gzip, deflate
130+Connection: keep-alive
131+Referer: http://www.reddit.com/
132+
133+GET /TFpYTiAO5aEowokv.jpg HTTP/1.1
134+Host: e.thumbs.redditmedia.com
135+User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101 Firefox/15.0.1
136+Accept: image/png,image/*;q=0.8,*/*;q=0.5
137+Accept-Language: en-us,en;q=0.5
138+Accept-Encoding: gzip, deflate
139+Connection: keep-alive
140+Referer: http://www.reddit.com/
141+
142+GET /eMWMpmm9APNeNqcF.jpg HTTP/1.1
143+Host: e.thumbs.redditmedia.com
144+User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101 Firefox/15.0.1
145+Accept: image/png,image/*;q=0.8,*/*;q=0.5
146+Accept-Language: en-us,en;q=0.5
147+Accept-Encoding: gzip, deflate
148+Connection: keep-alive
149+Referer: http://www.reddit.com/
150+
151+GET /S-IpsJrOKuaK9GZ8.jpg HTTP/1.1
152+Host: c.thumbs.redditmedia.com
153+User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101 Firefox/15.0.1
154+Accept: image/png,image/*;q=0.8,*/*;q=0.5
155+Accept-Language: en-us,en;q=0.5
156+Accept-Encoding: gzip, deflate
157+Connection: keep-alive
158+Referer: http://www.reddit.com/
159+
160+GET /3V6dj9PDsNnheDXn.jpg HTTP/1.1
161+Host: c.thumbs.redditmedia.com
162+User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101 Firefox/15.0.1
163+Accept: image/png,image/*;q=0.8,*/*;q=0.5
164+Accept-Language: en-us,en;q=0.5
165+Accept-Encoding: gzip, deflate
166+Connection: keep-alive
167+Referer: http://www.reddit.com/
168+
169+GET /wQ3-VmNXhv8sg4SJ.jpg HTTP/1.1
170+Host: c.thumbs.redditmedia.com
171+User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101 Firefox/15.0.1
172+Accept: image/png,image/*;q=0.8,*/*;q=0.5
173+Accept-Language: en-us,en;q=0.5
174+Accept-Encoding: gzip, deflate
175+Connection: keep-alive
176+Referer: http://www.reddit.com/
177+
178+GET /ixd1C1njpczEWC22.jpg HTTP/1.1
179+Host: c.thumbs.redditmedia.com
180+User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101 Firefox/15.0.1
181+Accept: image/png,image/*;q=0.8,*/*;q=0.5
182+Accept-Language: en-us,en;q=0.5
183+Accept-Encoding: gzip, deflate
184+Connection: keep-alive
185+Referer: http://www.reddit.com/
186+
187+GET /nGsQj15VyOHMwmq8.jpg HTTP/1.1
188+Host: c.thumbs.redditmedia.com
189+User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101 Firefox/15.0.1
190+Accept: image/png,image/*;q=0.8,*/*;q=0.5
191+Accept-Language: en-us,en;q=0.5
192+Accept-Encoding: gzip, deflate
193+Connection: keep-alive
194+Referer: http://www.reddit.com/
195+
196+GET /zT4yQmDxQLbIxK1b.jpg HTTP/1.1
197+Host: c.thumbs.redditmedia.com
198+User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101 Firefox/15.0.1
199+Accept: image/png,image/*;q=0.8,*/*;q=0.5
200+Accept-Language: en-us,en;q=0.5
201+Accept-Encoding: gzip, deflate
202+Connection: keep-alive
203+Referer: http://www.reddit.com/
204+
205+GET /L5e1HcZLv1iu4nrG.jpg HTTP/1.1
206+Host: f.thumbs.redditmedia.com
207+User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101 Firefox/15.0.1
208+Accept: image/png,image/*;q=0.8,*/*;q=0.5
209+Accept-Language: en-us,en;q=0.5
210+Accept-Encoding: gzip, deflate
211+Connection: keep-alive
212+Referer: http://www.reddit.com/
213+
214+GET /WJFFPxD8X4JO_lIG.jpg HTTP/1.1
215+Host: f.thumbs.redditmedia.com
216+User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101 Firefox/15.0.1
217+Accept: image/png,image/*;q=0.8,*/*;q=0.5
218+Accept-Language: en-us,en;q=0.5
219+Accept-Encoding: gzip, deflate
220+Connection: keep-alive
221+Referer: http://www.reddit.com/
222+
223+GET /hVMVTDdjuY3bQox5.jpg HTTP/1.1
224+Host: f.thumbs.redditmedia.com
225+User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101 Firefox/15.0.1
226+Accept: image/png,image/*;q=0.8,*/*;q=0.5
227+Accept-Language: en-us,en;q=0.5
228+Accept-Encoding: gzip, deflate
229+Connection: keep-alive
230+Referer: http://www.reddit.com/
231+
232+GET /rnWf8CjBcyPQs5y_.jpg HTTP/1.1
233+Host: f.thumbs.redditmedia.com
234+User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101 Firefox/15.0.1
235+Accept: image/png,image/*;q=0.8,*/*;q=0.5
236+Accept-Language: en-us,en;q=0.5
237+Accept-Encoding: gzip, deflate
238+Connection: keep-alive
239+Referer: http://www.reddit.com/
240+
241+GET /gZJL1jNylKbGV4d-.jpg HTTP/1.1
242+Host: d.thumbs.redditmedia.com
243+User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101 Firefox/15.0.1
244+Accept: image/png,image/*;q=0.8,*/*;q=0.5
245+Accept-Language: en-us,en;q=0.5
246+Accept-Encoding: gzip, deflate
247+Connection: keep-alive
248+Referer: http://www.reddit.com/
249+
250+GET /aNd2zNRLXiMnKUFh.jpg HTTP/1.1
251+Host: c.thumbs.redditmedia.com
252+User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101 Firefox/15.0.1
253+Accept: image/png,image/*;q=0.8,*/*;q=0.5
254+Accept-Language: en-us,en;q=0.5
255+Accept-Encoding: gzip, deflate
256+Connection: keep-alive
257+Referer: http://www.reddit.com/
258+
259+GET /droparrowgray.gif HTTP/1.1
260+Host: www.redditstatic.com
261+User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101 Firefox/15.0.1
262+Accept: image/png,image/*;q=0.8,*/*;q=0.5
263+Accept-Language: en-us,en;q=0.5
264+Accept-Encoding: gzip, deflate
265+Connection: keep-alive
266+Referer: http://www.redditstatic.com/reddit.v_EZwRzV-Ns.css
267+
268+GET /sprite-reddit.an0Lnf61Ap4.png HTTP/1.1
269+Host: www.redditstatic.com
270+User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101 Firefox/15.0.1
271+Accept: image/png,image/*;q=0.8,*/*;q=0.5
272+Accept-Language: en-us,en;q=0.5
273+Accept-Encoding: gzip, deflate
274+Connection: keep-alive
275+Referer: http://www.redditstatic.com/reddit.v_EZwRzV-Ns.css
276+
277+GET /ga.js HTTP/1.1
278+Host: www.google-analytics.com
279+User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101 Firefox/15.0.1
280+Accept: */*
281+Accept-Language: en-us,en;q=0.5
282+Accept-Encoding: gzip, deflate
283+Connection: keep-alive
284+Referer: http://www.reddit.com/
285+If-Modified-Since: Tue, 29 Oct 2013 19:33:51 GMT
286+
287+GET /reddit/ads.html?sr=-reddit.com&bust2 HTTP/1.1
288+Host: static.adzerk.net
289+User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101 Firefox/15.0.1
290+Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
291+Accept-Language: en-us,en;q=0.5
292+Accept-Encoding: gzip, deflate
293+Connection: keep-alive
294+Referer: http://www.reddit.com/
295+
296+GET /pixel/of_destiny.png?v=hOlmDALJCWWdjzfBV4ZxJPmrdCLWB%2Ftq7Z%2Ffp4Q%2FxXbVPPREuMJMVGzKraTuhhNWxCCwi6yFEZg%3D&r=783333388 HTTP/1.1
297+Host: pixel.redditmedia.com
298+User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101 Firefox/15.0.1
299+Accept: image/png,image/*;q=0.8,*/*;q=0.5
300+Accept-Language: en-us,en;q=0.5
301+Accept-Encoding: gzip, deflate
302+Connection: keep-alive
303+Referer: http://www.reddit.com/
304+
305+GET /UNcO-h_QcS9PD-Gn.jpg HTTP/1.1
306+Host: c.thumbs.redditmedia.com
307+User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101 Firefox/15.0.1
308+Accept: image/png,image/*;q=0.8,*/*;q=0.5
309+Accept-Language: en-us,en;q=0.5
310+Accept-Encoding: gzip, deflate
311+Connection: keep-alive
312+Referer: http://e.thumbs.redditmedia.com/rZ_rD5TjrJM0E9Aj.css
313+
314+GET /welcome-lines.png HTTP/1.1
315+Host: www.redditstatic.com
316+User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101 Firefox/15.0.1
317+Accept: image/png,image/*;q=0.8,*/*;q=0.5
318+Accept-Language: en-us,en;q=0.5
319+Accept-Encoding: gzip, deflate
320+Connection: keep-alive
321+Referer: http://www.redditstatic.com/reddit.v_EZwRzV-Ns.css
322+
323+GET /welcome-upvote.png HTTP/1.1
324+Host: www.redditstatic.com
325+User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101 Firefox/15.0.1
326+Accept: image/png,image/*;q=0.8,*/*;q=0.5
327+Accept-Language: en-us,en;q=0.5
328+Accept-Encoding: gzip, deflate
329+Connection: keep-alive
330+Referer: http://www.redditstatic.com/reddit.v_EZwRzV-Ns.css
331+
332+GET /__utm.gif?utmwv=5.5.1&utms=1&utmn=720496082&utmhn=www.reddit.com&utme=8(site*srpath*usertype*uitype)9(%20reddit.com*%20reddit.com-GET_listing*guest*web)11(3!2)&utmcs=UTF-8&utmsr=2560x1600&utmvp=1288x792&utmsc=24-bit&utmul=en-us&utmje=1&utmfl=13.0%20r0&utmdt=reddit%3A%20the%20front%20page%20of%20the%20internet&utmhid=2129416330&utmr=-&utmp=%2F&utmht=1400862512705&utmac=UA-12131688-1&utmcc=__utma%3D55650728.585571751.1400862513.1400862513.1400862513.1%3B%2B__utmz%3D55650728.1400862513.1.1.utmcsr%3D(direct)%7Cutmccn%3D(direct)%7Cutmcmd%3D(none)%3B&utmu=qR~ HTTP/1.1
333+Host: www.google-analytics.com
334+User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101 Firefox/15.0.1
335+Accept: image/png,image/*;q=0.8,*/*;q=0.5
336+Accept-Language: en-us,en;q=0.5
337+Accept-Encoding: gzip, deflate
338+Connection: keep-alive
339+Referer: http://www.reddit.com/
340+
341+GET /ImnpOQhbXUPkwceN.png HTTP/1.1
342+Host: a.thumbs.redditmedia.com
343+User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101 Firefox/15.0.1
344+Accept: image/png,image/*;q=0.8,*/*;q=0.5
345+Accept-Language: en-us,en;q=0.5
346+Accept-Encoding: gzip, deflate
347+Connection: keep-alive
348+Referer: http://www.reddit.com/
349+
350+GET /ajax/libs/jquery/1.7.1/jquery.min.js HTTP/1.1
351+Host: ajax.googleapis.com
352+User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101 Firefox/15.0.1
353+Accept: */*
354+Accept-Language: en-us,en;q=0.5
355+Accept-Encoding: gzip, deflate
356+Connection: keep-alive
357+Referer: http://static.adzerk.net/reddit/ads.html?sr=-reddit.com&bust2
358+
359+GET /__utm.gif?utmwv=5.5.1&utms=2&utmn=1493472678&utmhn=www.reddit.com&utmt=event&utme=5(AdBlock*enabled*false)(0)8(site*srpath*usertype*uitype)9(%20reddit.com*%20reddit.com-GET_listing*guest*web)11(3!2)&utmcs=UTF-8&utmsr=2560x1600&utmvp=1288x792&utmsc=24-bit&utmul=en-us&utmje=1&utmfl=13.0%20r0&utmdt=reddit%3A%20the%20front%20page%20of%20the%20internet&utmhid=2129416330&utmr=-&utmp=%2F&utmht=1400862512708&utmac=UA-12131688-1&utmni=1&utmcc=__utma%3D55650728.585571751.1400862513.1400862513.1400862513.1%3B%2B__utmz%3D55650728.1400862513.1.1.utmcsr%3D(direct)%7Cutmccn%3D(direct)%7Cutmcmd%3D(none)%3B&utmu=6R~ HTTP/1.1
360+Host: www.google-analytics.com
361+User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101 Firefox/15.0.1
362+Accept: image/png,image/*;q=0.8,*/*;q=0.5
363+Accept-Language: en-us,en;q=0.5
364+Accept-Encoding: gzip, deflate
365+Connection: keep-alive
366+Referer: http://www.reddit.com/
367+
368+GET /ados.js?q=43 HTTP/1.1
369+Host: secure.adzerk.net
370+User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101 Firefox/15.0.1
371+Accept: */*
372+Accept-Language: en-us,en;q=0.5
373+Accept-Encoding: gzip, deflate
374+Connection: keep-alive
375+Referer: http://static.adzerk.net/reddit/ads.html?sr=-reddit.com&bust2
376+
377+GET /fetch-trackers?callback=jQuery111005268222517967478_1400862512407&ids%5B%5D=t3_25jzeq-t8_k2ii&_=1400862512408 HTTP/1.1
378+Host: tracker.redditmedia.com
379+User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101 Firefox/15.0.1
380+Accept: */*
381+Accept-Language: en-us,en;q=0.5
382+Accept-Encoding: gzip, deflate
383+Connection: keep-alive
384+Referer: http://www.reddit.com/
385+
386+GET /ados?t=1400862512892&request={%22Placements%22:[{%22A%22:5146,%22S%22:24950,%22D%22:%22main%22,%22AT%22:5},{%22A%22:5146,%22S%22:24950,%22D%22:%22sponsorship%22,%22AT%22:8}],%22Keywords%22:%22-reddit.com%22,%22Referrer%22:%22http%3A%2F%2Fwww.reddit.com%2F%22,%22IsAsync%22:true,%22WriteResults%22:true} HTTP/1.1
387+Host: engine.adzerk.net
388+User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101 Firefox/15.0.1
389+Accept: */*
390+Accept-Language: en-us,en;q=0.5
391+Accept-Encoding: gzip, deflate
392+Connection: keep-alive
393+Referer: http://static.adzerk.net/reddit/ads.html?sr=-reddit.com&bust2
394+
395+GET /pixel/of_doom.png?id=t3_25jzeq-t8_k2ii&hash=da31d967485cdbd459ce1e9a5dde279fef7fc381&r=1738649500 HTTP/1.1
396+Host: pixel.redditmedia.com
397+User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101 Firefox/15.0.1
398+Accept: image/png,image/*;q=0.8,*/*;q=0.5
399+Accept-Language: en-us,en;q=0.5
400+Accept-Encoding: gzip, deflate
401+Connection: keep-alive
402+Referer: http://www.reddit.com/
403+
404+GET /Extensions/adFeedback.js HTTP/1.1
405+Host: static.adzrk.net
406+User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101 Firefox/15.0.1
407+Accept: */*
408+Accept-Language: en-us,en;q=0.5
409+Accept-Encoding: gzip, deflate
410+Connection: keep-alive
411+Referer: http://static.adzerk.net/reddit/ads.html?sr=-reddit.com&bust2
412+
413+GET /Extensions/adFeedback.css HTTP/1.1
414+Host: static.adzrk.net
415+User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101 Firefox/15.0.1
416+Accept: text/css,*/*;q=0.1
417+Accept-Language: en-us,en;q=0.5
418+Accept-Encoding: gzip, deflate
419+Connection: keep-alive
420+Referer: http://static.adzerk.net/reddit/ads.html?sr=-reddit.com&bust2
421+
422+GET /reddit/ads-load.html?bust2 HTTP/1.1
423+Host: static.adzerk.net
424+User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101 Firefox/15.0.1
425+Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
426+Accept-Language: en-us,en;q=0.5
427+Accept-Encoding: gzip, deflate
428+Connection: keep-alive
429+Referer: http://www.reddit.com/
430+
431+GET /Advertisers/a774d7d6148046efa89403a8db635a81.jpg HTTP/1.1
432+Host: static.adzerk.net
433+User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101 Firefox/15.0.1
434+Accept: image/png,image/*;q=0.8,*/*;q=0.5
435+Accept-Language: en-us,en;q=0.5
436+Accept-Encoding: gzip, deflate
437+Connection: keep-alive
438+Referer: http://static.adzerk.net/reddit/ads.html?sr=-reddit.com&bust2
439+
440+GET /i.gif?e=eyJhdiI6NjIzNTcsImF0Ijo1LCJjbSI6MTE2MzUxLCJjaCI6Nzk4NCwiY3IiOjMzNzAxNSwiZGkiOiI4NmI2Y2UzYWM5NDM0MjhkOTk2ZTg4MjYwZDE5ZTE1YyIsImRtIjoxLCJmYyI6NDE2MTI4LCJmbCI6MjEwNDY0LCJrdyI6Ii1yZWRkaXQuY29tIiwibWsiOiItcmVkZGl0LmNvbSIsIm53Ijo1MTQ2LCJwYyI6MCwicHIiOjIwMzYyLCJydCI6MSwicmYiOiJodHRwOi8vd3d3LnJlZGRpdC5jb20vIiwic3QiOjI0OTUwLCJ1ayI6InVlMS01ZWIwOGFlZWQ5YTc0MDFjOTE5NWNiOTMzZWI3Yzk2NiIsInRzIjoxNDAwODYyNTkzNjQ1fQ&s=lwlbFf2Uywt7zVBFRj_qXXu7msY HTTP/1.1
441+Host: engine.adzerk.net
442+User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101 Firefox/15.0.1
443+Accept: image/png,image/*;q=0.8,*/*;q=0.5
444+Accept-Language: en-us,en;q=0.5
445+Accept-Encoding: gzip, deflate
446+Connection: keep-alive
447+Referer: http://static.adzerk.net/reddit/ads.html?sr=-reddit.com&bust2
448+Cookie: azk=ue1-5eb08aeed9a7401c9195cb933eb7c966
449+
450+GET /BurstingPipe/adServer.bs?cn=tf&c=19&mc=imp&pli=9994987&PluID=0&ord=1400862593644&rtu=-1 HTTP/1.1
451+Host: bs.serving-sys.com
452+User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101 Firefox/15.0.1
453+Accept: image/png,image/*;q=0.8,*/*;q=0.5
454+Accept-Language: en-us,en;q=0.5
455+Accept-Encoding: gzip, deflate
456+Connection: keep-alive
457+Referer: http://static.adzerk.net/reddit/ads.html?sr=-reddit.com&bust2
458+
459+GET /Advertisers/63cfd0044ffd49c0a71a6626f7a1d8f0.jpg HTTP/1.1
460+Host: static.adzerk.net
461+User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101 Firefox/15.0.1
462+Accept: image/png,image/*;q=0.8,*/*;q=0.5
463+Accept-Language: en-us,en;q=0.5
464+Accept-Encoding: gzip, deflate
465+Connection: keep-alive
466+Referer: http://static.adzerk.net/reddit/ads-load.html?bust2
467+
468+GET /BurstingPipe/adServer.bs?cn=tf&c=19&mc=imp&pli=9962555&PluID=0&ord=1400862593645&rtu=-1 HTTP/1.1
469+Host: bs.serving-sys.com
470+User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101 Firefox/15.0.1
471+Accept: image/png,image/*;q=0.8,*/*;q=0.5
472+Accept-Language: en-us,en;q=0.5
473+Accept-Encoding: gzip, deflate
474+Connection: keep-alive
475+Referer: http://static.adzerk.net/reddit/ads-load.html?bust2
476+Cookie: S_9994987=6754579095859875029; A4=01fmFvgRnI09SF00000; u2=d1263d39-874b-4a89-86cd-a2ab0860ed4e3Zl040
477+
478+GET /i.gif?e=eyJhdiI6NjIzNTcsImF0Ijo4LCJjbSI6MTE2MzUxLCJjaCI6Nzk4NCwiY3IiOjMzNzAxOCwiZGkiOiI3OTdlZjU3OWQ5NjE0ODdiODYyMGMyMGJkOTE4YzNiMSIsImRtIjoxLCJmYyI6NDE2MTMxLCJmbCI6MjEwNDY0LCJrdyI6Ii1yZWRkaXQuY29tIiwibWsiOiItcmVkZGl0LmNvbSIsIm53Ijo1MTQ2LCJwYyI6MCwicHIiOjIwMzYyLCJydCI6MSwicmYiOiJodHRwOi8vd3d3LnJlZGRpdC5jb20vIiwic3QiOjI0OTUwLCJ1ayI6InVlMS01ZWIwOGFlZWQ5YTc0MDFjOTE5NWNiOTMzZWI3Yzk2NiIsInRzIjoxNDAwODYyNTkzNjQ2fQ&s=OjzxzXAgQksbdQOHNm-bjZcnZPA HTTP/1.1
479+Host: engine.adzerk.net
480+User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101 Firefox/15.0.1
481+Accept: image/png,image/*;q=0.8,*/*;q=0.5
482+Accept-Language: en-us,en;q=0.5
483+Accept-Encoding: gzip, deflate
484+Connection: keep-alive
485+Referer: http://static.adzerk.net/reddit/ads-load.html?bust2
486+Cookie: azk=ue1-5eb08aeed9a7401c9195cb933eb7c966
487+
488+GET /subscribe?host_int=1042356184&ns_map=571794054_374233948806,464381511_13349283399&user_id=245722467&nid=1399334269710011966&ts=1400862514 HTTP/1.1
489+Host: notify8.dropbox.com
490+Accept-Encoding: identity
491+Connection: keep-alive
492+X-Dropbox-Locale: en_US
493+User-Agent: DropboxDesktopClient/2.7.54 (Macintosh; 10.8; ('i32',); en_US)
494+
examples/rfc2616.c+27−21
@@ -1,21 +1,22 @@
11/*
2− * This is a simple driver for Ryan Dahl's hand-bummed C http-parser
3− * package. It is intended to read one HTTP request after another
4− * from a file, nothing more.
2+ * This is a simple driver for the http-parser package. It is
3+ * intended to read one HTTP request after another from a file,
4+ * nothing more.
55 *
66 * For "feature parity" with the Haskell code in RFC2616.hs, we
77 * allocate and populate a simple structure describing each request,
88 * since that's the sort of thing that many real applications would
99 * themselves do and the library doesn't do this for us.
1010 *
11− * For the http-parser source, see http://github.com/ry/http-parser/
11+ * For the http-parser source, see
12+ * https://github.com/joyent/http-parser/blob/master/http_parser.c
1213 */
1314
1415/*
1516 * Turn off this preprocessor symbol to have the callbacks do nothing
1617 * at all, which "improves performance" by about 50%.
1718 */
18−#define LOOK_BUSY
19+/*#define LOOK_BUSY*/
1920
2021#include <assert.h>
2122#include <fcntl.h>
@@ -27,18 +28,18 @@
2728#include <unistd.h>
2829
2930#include "http_parser.h"
30−
31+
3132struct http_string {
3233 size_t len;
3334 char value[0];
3435};
35−
36+
3637struct http_header {
3738 struct http_string *name;
3839 struct http_string *value;
3940 struct http_header *next;
4041};
41−
42+
4243struct http_request {
4344 struct http_string *method;
4445 struct http_string *uri;
@@ -49,7 +50,7 @@ struct data {
4950 size_t count;
5051 struct http_request req;
5152};
52−
53+
5354static void *xmalloc(size_t size)
5455{
5556 void *ptr;
@@ -78,7 +79,7 @@ static void xstrcat(struct http_string **dst, const char *src, size_t len)
7879 *dst = xstrdup(src, len, 0);
7980 return;
8081 }
81−
82+
8283 p = xstrdup((*dst)->value, (*dst)->len, len);
8384 memcpy(p->value + (*dst)->len, src, len);
8485 p->len += len;
@@ -98,7 +99,7 @@ static int begin(http_parser *p)
9899static int url(http_parser *p, const char *at, size_t len)
99100{
100101#ifdef LOOK_BUSY
101− struct data *data = p->data;
102+ struct data *data = p->data;
102103
103104 xstrcat(&data->req.uri, at, len);
104105#endif
@@ -119,7 +120,7 @@ static int header_field(http_parser *p, const char *at, size_t len)
119120 hdr->name = xstrdup(at, len, 0);
120121 hdr->value = NULL;
121122 hdr->next = NULL;
122−
123+
123124 if (data->req.last != NULL)
124125 data->req.last->next = hdr;
125126 data->req.last = hdr;
@@ -150,7 +151,7 @@ static int complete(http_parser *p)
150151
151152 free(data->req.method);
152153 free(data->req.uri);
153−
154+
154155 for (hdr = data->req.headers; hdr != NULL; hdr = next) {
155156 next = hdr->next;
156157 free(hdr->name);
@@ -164,7 +165,7 @@ static int complete(http_parser *p)
164165 data->req.headers = NULL;
165166 data->req.last = NULL;
166167#endif
167−
168+
168169 /* Bludgeon http_parser into understanding that we really want to
169170 * keep parsing after a request that in principle ought to close
170171 * the "connection". */
@@ -180,16 +181,21 @@ static int complete(http_parser *p)
180181static void parse(const char *path, int fd)
181182{
182183 struct data data;
184+ http_parser_settings s;
183185 http_parser p;
184186 ssize_t nread;
185187
186− http_parser_init(&p, HTTP_REQUEST);
187− p.on_message_begin = begin;
188− p.on_url = url;
189− p.on_header_field = header_field;
190− p.on_header_value = header_value;
191− p.on_message_complete = complete;
188+ memset(&s, 0, sizeof(s));
189+ s.on_message_begin = begin;
190+ s.on_url = url;
191+ s.on_header_field = header_field;
192+ s.on_header_value = header_value;
193+ s.on_message_complete = complete;
194+
192195 p.data = &data;
196+
197+ http_parser_init(&p, HTTP_REQUEST);
198+
193199 data.count = 0;
194200 data.req.method = NULL;
195201 data.req.uri = NULL;
@@ -202,7 +208,7 @@ static void parse(const char *path, int fd)
202208
203209 nread = read(fd, buf, sizeof(buf));
204210
205− np = http_parser_execute(&p, buf, nread);
211+ np = http_parser_execute(&p, &s, buf, nread);
206212 if (np != nread) {
207213 fprintf(stderr, "%s: parse failed\n", path);
208214 break;