http_parser.rb 0.5.2 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/linux.yml +23 -0
  3. data/.github/workflows/windows.yml +23 -0
  4. data/.gitignore +5 -4
  5. data/.gitmodules +4 -4
  6. data/Gemfile +1 -1
  7. data/README.md +52 -47
  8. data/Rakefile +1 -0
  9. data/bench/standalone.rb +23 -0
  10. data/bench/thin.rb +1 -0
  11. data/ext/ruby_http_parser/extconf.rb +1 -1
  12. data/ext/ruby_http_parser/org/ruby_http_parser/RubyHttpParser.java +139 -83
  13. data/ext/ruby_http_parser/ruby_http_parser.c +40 -41
  14. data/ext/ruby_http_parser/vendor/http-parser-java/AUTHORS +32 -0
  15. data/ext/ruby_http_parser/vendor/http-parser-java/LICENSE-MIT +5 -1
  16. data/ext/ruby_http_parser/vendor/http-parser-java/README.md +133 -1
  17. data/ext/ruby_http_parser/vendor/http-parser-java/TODO +6 -0
  18. data/ext/ruby_http_parser/vendor/http-parser-java/http_parser.c +1202 -671
  19. data/ext/ruby_http_parser/vendor/http-parser-java/http_parser.gyp +79 -0
  20. data/ext/ruby_http_parser/vendor/http-parser-java/http_parser.h +172 -51
  21. data/ext/ruby_http_parser/vendor/http-parser-java/src/Http-parser.java.iml +22 -0
  22. data/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/FieldData.java +41 -0
  23. data/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPMethod.java +8 -3
  24. data/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPParserUrl.java +76 -0
  25. data/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/ParserSettings.java +35 -102
  26. data/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/Util.java +6 -6
  27. data/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/lolevel/HTTPParser.java +775 -682
  28. data/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/lolevel/ParserSettings.java +8 -4
  29. data/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Message.java +70 -20
  30. data/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/ParseUrl.java +51 -0
  31. data/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Requests.java +1 -1
  32. data/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Responses.java +1 -0
  33. data/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Test.java +2 -1
  34. data/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/TestHeaderOverflowError.java +1 -0
  35. data/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/TestLoaderNG.java +6 -17
  36. data/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/TestNoOverflowLongBody.java +1 -0
  37. data/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/UnitTest.java +1 -0
  38. data/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Upgrade.java +1 -0
  39. data/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Url.java +127 -0
  40. data/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Util.java +80 -9
  41. data/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/WrongContentLength.java +2 -1
  42. data/ext/ruby_http_parser/vendor/http-parser-java/test.c +1637 -280
  43. data/ext/ruby_http_parser/vendor/http-parser-java/tests.dumped +230 -71
  44. data/ext/ruby_http_parser/vendor/http-parser/AUTHORS +68 -0
  45. data/ext/ruby_http_parser/vendor/http-parser/LICENSE-MIT +1 -1
  46. data/ext/ruby_http_parser/vendor/http-parser/README.md +113 -38
  47. data/ext/ruby_http_parser/vendor/http-parser/bench.c +128 -0
  48. data/ext/ruby_http_parser/vendor/http-parser/contrib/parsertrace.c +157 -0
  49. data/ext/ruby_http_parser/vendor/http-parser/contrib/url_parser.c +47 -0
  50. data/ext/ruby_http_parser/vendor/http-parser/http_parser.c +1576 -780
  51. data/ext/ruby_http_parser/vendor/http-parser/http_parser.gyp +111 -0
  52. data/ext/ruby_http_parser/vendor/http-parser/http_parser.h +308 -58
  53. data/ext/ruby_http_parser/vendor/http-parser/test.c +2964 -460
  54. data/http_parser.rb.gemspec +14 -7
  55. data/spec/parser_spec.rb +196 -102
  56. data/spec/support/requests.json +236 -24
  57. data/spec/support/responses.json +202 -36
  58. data/tasks/compile.rake +2 -2
  59. data/tasks/fixtures.rake +8 -2
  60. data/tasks/spec.rake +1 -1
  61. metadata +141 -134
  62. data/Gemfile.lock +0 -32
  63. data/ext/ruby_http_parser/vendor/http-parser-java/compile +0 -1
  64. data/ext/ruby_http_parser/vendor/http-parser-java/test_permutations +0 -1
  65. data/ext/ruby_http_parser/vendor/http-parser-java/test_unit +0 -1
  66. data/ext/ruby_http_parser/vendor/http-parser-java/test_utf8 +0 -1
  67. data/ext/ruby_http_parser/vendor/http-parser/CONTRIBUTIONS +0 -4
@@ -13,7 +13,6 @@ header_0 :{ "User-Agent": "curl/7.18.0 (i486-pc-linux-gnu) libcurl/7.18.0 OpenSS
13
13
  header_1 :{ "Host": "0.0.0.0=5000"}
14
14
  header_2 :{ "Accept": "*/*"}
15
15
  should_keep_alive :1
16
- upgrade :0
17
16
  http_major :1
18
17
  http_minor :1
19
18
 
@@ -37,7 +36,6 @@ header_5 :{ "Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7"}
37
36
  header_6 :{ "Keep-Alive": "300"}
38
37
  header_7 :{ "Connection": "keep-alive"}
39
38
  should_keep_alive :1
40
- upgrade :0
41
39
  http_major :1
42
40
  http_minor :1
43
41
 
@@ -54,7 +52,6 @@ body :""
54
52
  body_size :0
55
53
  header_0 :{ "aaaaaaaaaaaaa": "++++++++++"}
56
54
  should_keep_alive :1
57
- upgrade :0
58
55
  http_major :1
59
56
  http_minor :1
60
57
 
@@ -70,7 +67,6 @@ query_string:page=1
70
67
  body :""
71
68
  body_size :0
72
69
  should_keep_alive :1
73
- upgrade :0
74
70
  http_major :1
75
71
  http_minor :1
76
72
 
@@ -86,7 +82,6 @@ query_string:
86
82
  body :""
87
83
  body_size :0
88
84
  should_keep_alive :1
89
- upgrade :0
90
85
  http_major :1
91
86
  http_minor :1
92
87
 
@@ -103,7 +98,6 @@ body :""
103
98
  body_size :0
104
99
  header_0 :{ "Accept": "*/*"}
105
100
  should_keep_alive :1
106
- upgrade :0
107
101
  http_major :1
108
102
  http_minor :1
109
103
 
@@ -120,7 +114,6 @@ body :"HELLO"
120
114
  body_size :0
121
115
  header_0 :{ "conTENT-Length": "5"}
122
116
  should_keep_alive :0
123
- upgrade :0
124
117
  http_major :1
125
118
  http_minor :0
126
119
 
@@ -139,7 +132,6 @@ header_0 :{ "Accept": "*/*"}
139
132
  header_1 :{ "Transfer-Encoding": "identity"}
140
133
  header_2 :{ "Content-Length": "5"}
141
134
  should_keep_alive :1
142
- upgrade :0
143
135
  http_major :1
144
136
  http_minor :1
145
137
 
@@ -156,7 +148,6 @@ body :"all your base are belong to us"
156
148
  body_size :0
157
149
  header_0 :{ "Transfer-Encoding": "chunked"}
158
150
  should_keep_alive :1
159
- upgrade :0
160
151
  http_major :1
161
152
  http_minor :1
162
153
 
@@ -173,7 +164,6 @@ body :"hello world"
173
164
  body_size :0
174
165
  header_0 :{ "Transfer-Encoding": "chunked"}
175
166
  should_keep_alive :1
176
- upgrade :0
177
167
  http_major :1
178
168
  http_minor :1
179
169
 
@@ -192,7 +182,6 @@ header_0 :{ "Transfer-Encoding": "chunked"}
192
182
  header_1 :{ "Vary": "*"}
193
183
  header_2 :{ "Content-Type": "text/plain"}
194
184
  should_keep_alive :1
195
- upgrade :0
196
185
  http_major :1
197
186
  http_minor :1
198
187
 
@@ -209,7 +198,6 @@ body :"hello world"
209
198
  body_size :0
210
199
  header_0 :{ "Transfer-Encoding": "chunked"}
211
200
  should_keep_alive :1
212
- upgrade :0
213
201
  http_major :1
214
202
  http_minor :1
215
203
 
@@ -225,7 +213,6 @@ query_string:foo="bar"
225
213
  body :""
226
214
  body_size :0
227
215
  should_keep_alive :1
228
- upgrade :0
229
216
  http_major :1
230
217
  http_minor :1
231
218
 
@@ -244,7 +231,6 @@ header_0 :{ "Host": "0.0.0.0:5000"}
244
231
  header_1 :{ "User-Agent": "ApacheBench/2.3"}
245
232
  header_2 :{ "Accept": "*/*"}
246
233
  should_keep_alive :0
247
- upgrade :0
248
234
  http_major :1
249
235
  http_minor :0
250
236
 
@@ -260,7 +246,6 @@ query_string:foo=bar?baz
260
246
  body :""
261
247
  body_size :0
262
248
  should_keep_alive :1
263
- upgrade :0
264
249
  http_major :1
265
250
  http_minor :1
266
251
 
@@ -276,12 +261,11 @@ query_string:
276
261
  body :""
277
262
  body_size :0
278
263
  should_keep_alive :1
279
- upgrade :0
280
264
  http_major :1
281
265
  http_minor :1
282
266
 
283
267
  name :upgrade request
284
- raw :"GET /demo HTTP/1.1\r\nHost: example.com\r\nConnection: Upgrade\r\nSec-WebSocket-Key2: 12998 5 Y3 1 .P00\r\nSec-WebSocket-Protocol: sample\r\nUpgrade: WebSocket\r\nSec-WebSocket-Key1: 4 @1 46546xW%0l 1 5\r\nOrigin: http://example.com\r\n\r\n"
268
+ raw :"GET /demo HTTP/1.1\r\nHost: example.com\r\nConnection: Upgrade\r\nSec-WebSocket-Key2: 12998 5 Y3 1 .P00\r\nSec-WebSocket-Protocol: sample\r\nUpgrade: WebSocket\r\nSec-WebSocket-Key1: 4 @1 46546xW%0l 1 5\r\nOrigin: http://example.com\r\n\r\nHot diggity dogg"
285
269
  type :HTTP_REQUEST
286
270
  method: HTTP_GET
287
271
  status_code :0
@@ -299,17 +283,17 @@ header_4 :{ "Upgrade": "WebSocket"}
299
283
  header_5 :{ "Sec-WebSocket-Key1": "4 @1 46546xW%0l 1 5"}
300
284
  header_6 :{ "Origin": "http://example.com"}
301
285
  should_keep_alive :1
302
- upgrade :1
286
+ upgrade :"Hot diggity dogg"
303
287
  http_major :1
304
288
  http_minor :1
305
289
 
306
290
  name :connect request
307
- raw :"CONNECT home0.netscape.com:443 HTTP/1.0\r\nUser-agent: Mozilla/1.1N\r\nProxy-authorization: basic aGVsbG86d29ybGQ=\r\n\r\n"
291
+ raw :"CONNECT 0-home0.netscape.com:443 HTTP/1.0\r\nUser-agent: Mozilla/1.1N\r\nProxy-authorization: basic aGVsbG86d29ybGQ=\r\n\r\nsome data\r\nand yet even more data"
308
292
  type :HTTP_REQUEST
309
293
  method: HTTP_CONNECT
310
294
  status_code :0
311
295
  request_path:
312
- request_url :home0.netscape.com:443
296
+ request_url :0-home0.netscape.com:443
313
297
  fragment :
314
298
  query_string:
315
299
  body :""
@@ -317,7 +301,7 @@ body_size :0
317
301
  header_0 :{ "User-agent": "Mozilla/1.1N"}
318
302
  header_1 :{ "Proxy-authorization": "basic aGVsbG86d29ybGQ="}
319
303
  should_keep_alive :0
320
- upgrade :1
304
+ upgrade :"some data\r\nand yet even more data"
321
305
  http_major :1
322
306
  http_minor :0
323
307
 
@@ -333,7 +317,6 @@ query_string:
333
317
  body :""
334
318
  body_size :0
335
319
  should_keep_alive :1
336
- upgrade :0
337
320
  http_major :1
338
321
  http_minor :1
339
322
 
@@ -349,7 +332,6 @@ query_string:
349
332
  body :""
350
333
  body_size :0
351
334
  should_keep_alive :0
352
- upgrade :0
353
335
  http_major :0
354
336
  http_minor :9
355
337
 
@@ -368,24 +350,23 @@ header_0 :{ "HOST": "239.255.255.250:1900"}
368
350
  header_1 :{ "MAN": ""ssdp:discover""}
369
351
  header_2 :{ "ST": ""ssdp:all""}
370
352
  should_keep_alive :1
371
- upgrade :0
372
353
  http_major :1
373
354
  http_minor :1
374
355
 
375
- name :utf-8 path request
376
- raw :"GET /δ¶/δt/pope?q=1#narf HTTP/1.1\r\nHost: github.com\r\n\r\n"
356
+ name :line folding in header value
357
+ raw :"GET / HTTP/1.1\r\nLine1: abc\r\n def\r\n ghi\r\n jkl\r\n mno \r\n qrs\r\nLine2: line2 \r\n\r\n"
377
358
  type :HTTP_REQUEST
378
359
  method: HTTP_GET
379
360
  status_code :0
380
- request_path:/δ¶/δt/pope
381
- request_url :/δ¶/δt/pope?q=1#narf
382
- fragment :narf
383
- query_string:q=1
361
+ request_path:/
362
+ request_url :/
363
+ fragment :
364
+ query_string:
384
365
  body :""
385
366
  body_size :0
386
- header_0 :{ "Host": "github.com"}
367
+ header_0 :{ "Line1": "abcdefghijklmno qrs"}
368
+ header_1 :{ "Line2": "line2 "}
387
369
  should_keep_alive :1
388
- upgrade :0
389
370
  http_major :1
390
371
  http_minor :1
391
372
 
@@ -401,7 +382,6 @@ query_string:hail=all
401
382
  body :""
402
383
  body_size :0
403
384
  should_keep_alive :1
404
- upgrade :0
405
385
  http_major :1
406
386
  http_minor :1
407
387
 
@@ -417,7 +397,6 @@ query_string:hail=all
417
397
  body :""
418
398
  body_size :0
419
399
  should_keep_alive :1
420
- upgrade :0
421
400
  http_major :1
422
401
  http_minor :1
423
402
 
@@ -433,7 +412,96 @@ query_string:
433
412
  body :""
434
413
  body_size :0
435
414
  should_keep_alive :1
436
- upgrade :0
415
+ http_major :1
416
+ http_minor :1
417
+
418
+ name :PATCH request
419
+ raw :"PATCH /file.txt HTTP/1.1\r\nHost: www.example.com\r\nContent-Type: application/example\r\nIf-Match: \"e0023aa4e\"\r\nContent-Length: 10\r\n\r\ncccccccccc"
420
+ type :HTTP_REQUEST
421
+ method: UNKNOWN
422
+ status_code :0
423
+ request_path:/file.txt
424
+ request_url :/file.txt
425
+ fragment :
426
+ query_string:
427
+ body :"cccccccccc"
428
+ body_size :0
429
+ header_0 :{ "Host": "www.example.com"}
430
+ header_1 :{ "Content-Type": "application/example"}
431
+ header_2 :{ "If-Match": ""e0023aa4e""}
432
+ header_3 :{ "Content-Length": "10"}
433
+ should_keep_alive :1
434
+ http_major :1
435
+ http_minor :1
436
+
437
+ name :connect caps request
438
+ raw :"CONNECT HOME0.NETSCAPE.COM:443 HTTP/1.0\r\nUser-agent: Mozilla/1.1N\r\nProxy-authorization: basic aGVsbG86d29ybGQ=\r\n\r\n"
439
+ type :HTTP_REQUEST
440
+ method: HTTP_CONNECT
441
+ status_code :0
442
+ request_path:
443
+ request_url :HOME0.NETSCAPE.COM:443
444
+ fragment :
445
+ query_string:
446
+ body :""
447
+ body_size :0
448
+ header_0 :{ "User-agent": "Mozilla/1.1N"}
449
+ header_1 :{ "Proxy-authorization": "basic aGVsbG86d29ybGQ="}
450
+ should_keep_alive :0
451
+ upgrade :""
452
+ http_major :1
453
+ http_minor :0
454
+
455
+ name :eat CRLF between requests, no "Connection: close" header
456
+ raw :"POST / HTTP/1.1\r\nHost: www.example.com\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: 4\r\n\r\nq=42\r\n"
457
+ type :HTTP_REQUEST
458
+ method: HTTP_POST
459
+ status_code :0
460
+ request_path:/
461
+ request_url :/
462
+ fragment :
463
+ query_string:
464
+ body :"q=42"
465
+ body_size :0
466
+ header_0 :{ "Host": "www.example.com"}
467
+ header_1 :{ "Content-Type": "application/x-www-form-urlencoded"}
468
+ header_2 :{ "Content-Length": "4"}
469
+ should_keep_alive :1
470
+ http_major :1
471
+ http_minor :1
472
+
473
+ name :eat CRLF between requests even if "Connection: close" is set
474
+ raw :"POST / HTTP/1.1\r\nHost: www.example.com\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: 4\r\nConnection: close\r\n\r\nq=42\r\n"
475
+ type :HTTP_REQUEST
476
+ method: HTTP_POST
477
+ status_code :0
478
+ request_path:/
479
+ request_url :/
480
+ fragment :
481
+ query_string:
482
+ body :"q=42"
483
+ body_size :0
484
+ header_0 :{ "Host": "www.example.com"}
485
+ header_1 :{ "Content-Type": "application/x-www-form-urlencoded"}
486
+ header_2 :{ "Content-Length": "4"}
487
+ header_3 :{ "Connection": "close"}
488
+ should_keep_alive :0
489
+ http_major :1
490
+ http_minor :1
491
+
492
+ name :PURGE request
493
+ raw :"PURGE /file.txt HTTP/1.1\r\nHost: www.example.com\r\n\r\n"
494
+ type :HTTP_REQUEST
495
+ method: UNKNOWN
496
+ status_code :0
497
+ request_path:/file.txt
498
+ request_url :/file.txt
499
+ fragment :
500
+ query_string:
501
+ body :""
502
+ body_size :0
503
+ header_0 :{ "Host": "www.example.com"}
504
+ should_keep_alive :1
437
505
  http_major :1
438
506
  http_minor :1
439
507
 
@@ -457,7 +525,6 @@ header_5 :{ "Cache-Control": "public, max-age=2592000"}
457
525
  header_6 :{ "Server": "gws"}
458
526
  header_7 :{ "Content-Length": "219 "}
459
527
  should_keep_alive :1
460
- upgrade :0
461
528
  http_major :1
462
529
  http_minor :1
463
530
 
@@ -478,7 +545,6 @@ header_2 :{ "X-Powered-By": "Servlet/2.5 JSP/2.1"}
478
545
  header_3 :{ "Content-Type": "text/xml; charset=utf-8"}
479
546
  header_4 :{ "Connection": "close"}
480
547
  should_keep_alive :0
481
- upgrade :0
482
548
  http_major :1
483
549
  http_minor :1
484
550
 
@@ -493,8 +559,7 @@ fragment :
493
559
  query_string:
494
560
  body :""
495
561
  body_size :0
496
- should_keep_alive :1
497
- upgrade :0
562
+ should_keep_alive :0
498
563
  http_major :1
499
564
  http_minor :1
500
565
 
@@ -509,8 +574,7 @@ fragment :
509
574
  query_string:
510
575
  body :""
511
576
  body_size :0
512
- should_keep_alive :1
513
- upgrade :0
577
+ should_keep_alive :0
514
578
  http_major :1
515
579
  http_minor :1
516
580
 
@@ -528,7 +592,6 @@ body_size :65
528
592
  header_0 :{ "Content-Type": "text/plain"}
529
593
  header_1 :{ "Transfer-Encoding": "chunked"}
530
594
  should_keep_alive :1
531
- upgrade :0
532
595
  http_major :1
533
596
  http_minor :1
534
597
 
@@ -546,7 +609,6 @@ body_size :0
546
609
  header_0 :{ "Content-Type": "text/html; charset=utf-8"}
547
610
  header_1 :{ "Connection": "close"}
548
611
  should_keep_alive :0
549
- upgrade :0
550
612
  http_major :1
551
613
  http_minor :1
552
614
 
@@ -566,7 +628,6 @@ header_1 :{ "Content-Length": "11"}
566
628
  header_2 :{ "Proxy-Connection": "close"}
567
629
  header_3 :{ "Date": "Thu, 31 Dec 2009 20:55:48 +0000"}
568
630
  should_keep_alive :0
569
- upgrade :0
570
631
  http_major :1
571
632
  http_minor :1
572
633
 
@@ -586,7 +647,6 @@ header_1 :{ "Content-Type": "text/xml"}
586
647
  header_2 :{ "Content-Length": "0"}
587
648
  header_3 :{ "DCLK_imp": "v7;x;114750856;0-0;0;17820020;0/0;21603567/21621457/1;;~okv=;dcmt=text/xml;;~cs=o"}
588
649
  should_keep_alive :1
589
- upgrade :0
590
650
  http_major :1
591
651
  http_minor :1
592
652
 
@@ -611,33 +671,9 @@ header_6 :{ "Content-Length": "0"}
611
671
  header_7 :{ "Content-Type": "text/html; charset=UTF-8"}
612
672
  header_8 :{ "Connection": "keep-alive"}
613
673
  should_keep_alive :1
614
- upgrade :0
615
674
  http_major :1
616
675
  http_minor :0
617
676
 
618
- name :field space
619
- raw :"HTTP/1.1 200 OK\r\nServer: Microsoft-IIS/6.0\r\nX-Powered-By: ASP.NET\r\nen-US Content-Type: text/xml\r\nContent-Type: text/xml\r\nContent-Length: 16\r\nDate: Fri, 23 Jul 2010 18:45:38 GMT\r\nConnection: keep-alive\r\n\r\n<xml>hello</xml>"
620
- type :HTTP_RESPONSE
621
- method: HTTP_DELETE
622
- status_code :200
623
- request_path:
624
- request_url :
625
- fragment :
626
- query_string:
627
- body :"<xml>hello</xml>"
628
- body_size :0
629
- header_0 :{ "Server": "Microsoft-IIS/6.0"}
630
- header_1 :{ "X-Powered-By": "ASP.NET"}
631
- header_2 :{ "en-US Content-Type": "text/xml"}
632
- header_3 :{ "Content-Type": "text/xml"}
633
- header_4 :{ "Content-Length": "16"}
634
- header_5 :{ "Date": "Fri, 23 Jul 2010 18:45:38 GMT"}
635
- header_6 :{ "Connection": "keep-alive"}
636
- should_keep_alive :1
637
- upgrade :0
638
- http_major :1
639
- http_minor :1
640
-
641
677
  name :field underscore
642
678
  raw :"HTTP/1.1 200 OK\r\nDate: Tue, 28 Sep 2010 01:14:13 GMT\r\nServer: Apache\r\nCache-Control: no-cache, must-revalidate\r\nExpires: Mon, 26 Jul 1997 05:00:00 GMT\r\n.et-Cookie: PlaxoCS=1274804622353690521; path=/; domain=.plaxo.com\r\nVary: Accept-Encoding\r\n_eep-Alive: timeout=45\r\n_onnection: Keep-Alive\r\nTransfer-Encoding: chunked\r\nContent-Type: text/html\r\nConnection: close\r\n\r\n0\r\n\r\n"
643
679
  type :HTTP_RESPONSE
@@ -661,7 +697,6 @@ header_8 :{ "Transfer-Encoding": "chunked"}
661
697
  header_9 :{ "Content-Type": "text/html"}
662
698
  header_10 :{ "Connection": "close"}
663
699
  should_keep_alive :0
664
- upgrade :0
665
700
  http_major :1
666
701
  http_minor :1
667
702
 
@@ -680,7 +715,131 @@ header_0 :{ "Date": "Fri, 5 Nov 2010 23:07:12 GMT+2"}
680
715
  header_1 :{ "Content-Length": "0"}
681
716
  header_2 :{ "Connection": "close"}
682
717
  should_keep_alive :0
683
- upgrade :0
718
+ http_major :1
719
+ http_minor :1
720
+
721
+ name :http version 0.9
722
+ raw :"HTTP/0.9 200 OK\r\n\r\n"
723
+ type :HTTP_RESPONSE
724
+ method: HTTP_DELETE
725
+ status_code :200
726
+ request_path:
727
+ request_url :
728
+ fragment :
729
+ query_string:
730
+ body :""
731
+ body_size :0
732
+ should_keep_alive :0
733
+ http_major :0
734
+ http_minor :9
735
+
736
+ name :neither content-length nor transfer-encoding response
737
+ raw :"HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\nhello world"
738
+ type :HTTP_RESPONSE
739
+ method: HTTP_DELETE
740
+ status_code :200
741
+ request_path:
742
+ request_url :
743
+ fragment :
744
+ query_string:
745
+ body :"hello world"
746
+ body_size :0
747
+ header_0 :{ "Content-Type": "text/plain"}
748
+ should_keep_alive :0
749
+ http_major :1
750
+ http_minor :1
751
+
752
+ name :HTTP/1.0 with keep-alive and EOF-terminated 200 status
753
+ raw :"HTTP/1.0 200 OK\r\nConnection: keep-alive\r\n\r\n"
754
+ type :HTTP_RESPONSE
755
+ method: HTTP_DELETE
756
+ status_code :200
757
+ request_path:
758
+ request_url :
759
+ fragment :
760
+ query_string:
761
+ body :""
762
+ body_size :0
763
+ header_0 :{ "Connection": "keep-alive"}
764
+ should_keep_alive :0
765
+ http_major :1
766
+ http_minor :0
767
+
768
+ name :HTTP/1.0 with keep-alive and a 204 status
769
+ raw :"HTTP/1.0 204 No content\r\nConnection: keep-alive\r\n\r\n"
770
+ type :HTTP_RESPONSE
771
+ method: HTTP_DELETE
772
+ status_code :204
773
+ request_path:
774
+ request_url :
775
+ fragment :
776
+ query_string:
777
+ body :""
778
+ body_size :0
779
+ header_0 :{ "Connection": "keep-alive"}
780
+ should_keep_alive :1
781
+ http_major :1
782
+ http_minor :0
783
+
784
+ name :HTTP/1.1 with an EOF-terminated 200 status
785
+ raw :"HTTP/1.1 200 OK\r\n\r\n"
786
+ type :HTTP_RESPONSE
787
+ method: HTTP_DELETE
788
+ status_code :200
789
+ request_path:
790
+ request_url :
791
+ fragment :
792
+ query_string:
793
+ body :""
794
+ body_size :0
795
+ should_keep_alive :0
796
+ http_major :1
797
+ http_minor :1
798
+
799
+ name :HTTP/1.1 with a 204 status
800
+ raw :"HTTP/1.1 204 No content\r\n\r\n"
801
+ type :HTTP_RESPONSE
802
+ method: HTTP_DELETE
803
+ status_code :204
804
+ request_path:
805
+ request_url :
806
+ fragment :
807
+ query_string:
808
+ body :""
809
+ body_size :0
810
+ should_keep_alive :1
811
+ http_major :1
812
+ http_minor :1
813
+
814
+ name :HTTP/1.1 with a 204 status and keep-alive disabled
815
+ raw :"HTTP/1.1 204 No content\r\nConnection: close\r\n\r\n"
816
+ type :HTTP_RESPONSE
817
+ method: HTTP_DELETE
818
+ status_code :204
819
+ request_path:
820
+ request_url :
821
+ fragment :
822
+ query_string:
823
+ body :""
824
+ body_size :0
825
+ header_0 :{ "Connection": "close"}
826
+ should_keep_alive :0
827
+ http_major :1
828
+ http_minor :1
829
+
830
+ name :HTTP/1.1 with chunked endocing and a 200 response
831
+ raw :"HTTP/1.1 200 OK\r\nTransfer-Encoding: chunked\r\n\r\n0\r\n\r\n"
832
+ type :HTTP_RESPONSE
833
+ method: HTTP_DELETE
834
+ status_code :200
835
+ request_path:
836
+ request_url :
837
+ fragment :
838
+ query_string:
839
+ body :""
840
+ body_size :0
841
+ header_0 :{ "Transfer-Encoding": "chunked"}
842
+ should_keep_alive :1
684
843
  http_major :1
685
844
  http_minor :1
686
845