http_parser.rb 0.5.2 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -18,7 +18,8 @@
18
18
  "Host": "0.0.0.0=5000",
19
19
  "Accept": "*/*"
20
20
  },
21
- "body": ""
21
+ "body": "",
22
+ "strict": true
22
23
  },
23
24
  {
24
25
  "name": "firefox get",
@@ -44,7 +45,8 @@
44
45
  "Keep-Alive": "300",
45
46
  "Connection": "keep-alive"
46
47
  },
47
- "body": ""
48
+ "body": "",
49
+ "strict": true
48
50
  },
49
51
  {
50
52
  "name": "dumbfuck",
@@ -63,7 +65,8 @@
63
65
  "headers": {
64
66
  "aaaaaaaaaaaaa": "++++++++++"
65
67
  },
66
- "body": ""
68
+ "body": "",
69
+ "strict": true
67
70
  },
68
71
  {
69
72
  "name": "fragment in url",
@@ -79,7 +82,8 @@
79
82
  "request_path": "/forums/1/topics/2375",
80
83
  "request_url": "/forums/1/topics/2375?page=1#posts-17408",
81
84
  "num_headers": 0,
82
- "body": ""
85
+ "body": "",
86
+ "strict": true
83
87
  },
84
88
  {
85
89
  "name": "get no headers no body",
@@ -95,7 +99,8 @@
95
99
  "request_path": "/get_no_headers_no_body/world",
96
100
  "request_url": "/get_no_headers_no_body/world",
97
101
  "num_headers": 0,
98
- "body": ""
102
+ "body": "",
103
+ "strict": true
99
104
  },
100
105
  {
101
106
  "name": "get one header no body",
@@ -114,7 +119,8 @@
114
119
  "headers": {
115
120
  "Accept": "*/*"
116
121
  },
117
- "body": ""
122
+ "body": "",
123
+ "strict": true
118
124
  },
119
125
  {
120
126
  "name": "get funky content length body hello",
@@ -133,7 +139,8 @@
133
139
  "headers": {
134
140
  "conTENT-Length": "5"
135
141
  },
136
- "body": "HELLO"
142
+ "body": "HELLO",
143
+ "strict": true
137
144
  },
138
145
  {
139
146
  "name": "post identity body world",
@@ -154,7 +161,8 @@
154
161
  "Transfer-Encoding": "identity",
155
162
  "Content-Length": "5"
156
163
  },
157
- "body": "World"
164
+ "body": "World",
165
+ "strict": true
158
166
  },
159
167
  {
160
168
  "name": "post - chunked body: all your base are belong to us",
@@ -173,7 +181,8 @@
173
181
  "headers": {
174
182
  "Transfer-Encoding": "chunked"
175
183
  },
176
- "body": "all your base are belong to us"
184
+ "body": "all your base are belong to us",
185
+ "strict": true
177
186
  },
178
187
  {
179
188
  "name": "two chunks ; triple zero ending",
@@ -192,7 +201,8 @@
192
201
  "headers": {
193
202
  "Transfer-Encoding": "chunked"
194
203
  },
195
- "body": "hello world"
204
+ "body": "hello world",
205
+ "strict": true
196
206
  },
197
207
  {
198
208
  "name": "chunked with trailing headers. blech.",
@@ -213,7 +223,8 @@
213
223
  "Vary": "*",
214
224
  "Content-Type": "text/plain"
215
225
  },
216
- "body": "hello world"
226
+ "body": "hello world",
227
+ "strict": true
217
228
  },
218
229
  {
219
230
  "name": "with bullshit after the length",
@@ -232,7 +243,8 @@
232
243
  "headers": {
233
244
  "Transfer-Encoding": "chunked"
234
245
  },
235
- "body": "hello world"
246
+ "body": "hello world",
247
+ "strict": true
236
248
  },
237
249
  {
238
250
  "name": "with quotes",
@@ -251,7 +263,8 @@
251
263
  "headers": {
252
264
 
253
265
  },
254
- "body": ""
266
+ "body": "",
267
+ "strict": true
255
268
  },
256
269
  {
257
270
  "name": "apachebench get",
@@ -272,7 +285,8 @@
272
285
  "User-Agent": "ApacheBench/2.3",
273
286
  "Accept": "*/*"
274
287
  },
275
- "body": ""
288
+ "body": "",
289
+ "strict": true
276
290
  },
277
291
  {
278
292
  "name": "query url with question mark",
@@ -291,7 +305,8 @@
291
305
  "headers": {
292
306
 
293
307
  },
294
- "body": ""
308
+ "body": "",
309
+ "strict": true
295
310
  },
296
311
  {
297
312
  "name": "newline prefix get",
@@ -310,12 +325,13 @@
310
325
  "headers": {
311
326
 
312
327
  },
313
- "body": ""
328
+ "body": "",
329
+ "strict": true
314
330
  },
315
331
  {
316
332
  "name": "upgrade request",
317
333
  "type": "HTTP_REQUEST",
318
- "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",
334
+ "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",
319
335
  "should_keep_alive": true,
320
336
  "message_complete_on_eof": false,
321
337
  "http_major": 1,
@@ -326,7 +342,7 @@
326
342
  "request_path": "/demo",
327
343
  "request_url": "/demo",
328
344
  "num_headers": 7,
329
- "upgrade": 1,
345
+ "upgrade": "Hot diggity dogg",
330
346
  "headers": {
331
347
  "Host": "example.com",
332
348
  "Connection": "Upgrade",
@@ -336,12 +352,13 @@
336
352
  "Sec-WebSocket-Key1": "4 @1 46546xW%0l 1 5",
337
353
  "Origin": "http://example.com"
338
354
  },
339
- "body": ""
355
+ "body": "",
356
+ "strict": true
340
357
  },
341
358
  {
342
359
  "name": "connect request",
343
360
  "type": "HTTP_REQUEST",
344
- "raw": "CONNECT home0.netscape.com:443 HTTP/1.0\r\nUser-agent: Mozilla/1.1N\r\nProxy-authorization: basic aGVsbG86d29ybGQ=\r\n\r\n",
361
+ "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",
345
362
  "should_keep_alive": false,
346
363
  "message_complete_on_eof": false,
347
364
  "http_major": 1,
@@ -350,14 +367,15 @@
350
367
  "query_string": "",
351
368
  "fragment": "",
352
369
  "request_path": "",
353
- "request_url": "home0.netscape.com:443",
370
+ "request_url": "0-home0.netscape.com:443",
354
371
  "num_headers": 2,
355
- "upgrade": 1,
372
+ "upgrade": "some data\r\nand yet even more data",
356
373
  "headers": {
357
374
  "User-agent": "Mozilla/1.1N",
358
375
  "Proxy-authorization": "basic aGVsbG86d29ybGQ="
359
376
  },
360
- "body": ""
377
+ "body": "",
378
+ "strict": true
361
379
  },
362
380
  {
363
381
  "name": "report request",
@@ -376,7 +394,8 @@
376
394
  "headers": {
377
395
 
378
396
  },
379
- "body": ""
397
+ "body": "",
398
+ "strict": true
380
399
  },
381
400
  {
382
401
  "name": "request with no http version",
@@ -394,6 +413,199 @@
394
413
  "num_headers": 0,
395
414
  "headers": {
396
415
 
416
+ },
417
+ "body": "",
418
+ "strict": true
419
+ },
420
+ {
421
+ "name": "m-search request",
422
+ "type": "HTTP_REQUEST",
423
+ "raw": "M-SEARCH * HTTP/1.1\r\nHOST: 239.255.255.250:1900\r\nMAN: \"ssdp:discover\"\r\nST: \"ssdp:all\"\r\n\r\n",
424
+ "should_keep_alive": true,
425
+ "message_complete_on_eof": false,
426
+ "http_major": 1,
427
+ "http_minor": 1,
428
+ "method": "M-SEARCH",
429
+ "query_string": "",
430
+ "fragment": "",
431
+ "request_path": "*",
432
+ "request_url": "*",
433
+ "num_headers": 3,
434
+ "headers": {
435
+ "HOST": "239.255.255.250:1900",
436
+ "MAN": "\"ssdp:discover\"",
437
+ "ST": "\"ssdp:all\""
438
+ },
439
+ "body": "",
440
+ "strict": true
441
+ },
442
+ {
443
+ "name": "line folding in header value",
444
+ "type": "HTTP_REQUEST",
445
+ "raw": "GET / HTTP/1.1\r\nLine1: abc\r\n\tdef\r\n ghi\r\n\t\tjkl\r\n mno \r\n\t \tqrs\r\nLine2: \t line2\t\r\n\r\n",
446
+ "should_keep_alive": true,
447
+ "message_complete_on_eof": false,
448
+ "http_major": 1,
449
+ "http_minor": 1,
450
+ "method": "GET",
451
+ "query_string": "",
452
+ "fragment": "",
453
+ "request_path": "/",
454
+ "request_url": "/",
455
+ "num_headers": 2,
456
+ "headers": {
457
+ "Line1": "abc\tdef ghi\t\tjkl mno \t \tqrs",
458
+ "Line2": "line2\t"
459
+ },
460
+ "body": "",
461
+ "strict": true
462
+ },
463
+ {
464
+ "name": "host terminated by a query string",
465
+ "type": "HTTP_REQUEST",
466
+ "raw": "GET http://hypnotoad.org?hail=all HTTP/1.1\r\n\r\n",
467
+ "should_keep_alive": true,
468
+ "message_complete_on_eof": false,
469
+ "http_major": 1,
470
+ "http_minor": 1,
471
+ "method": "GET",
472
+ "query_string": "hail=all",
473
+ "fragment": "",
474
+ "request_path": "",
475
+ "request_url": "http://hypnotoad.org?hail=all",
476
+ "num_headers": 0,
477
+ "headers": {
478
+
479
+ },
480
+ "body": "",
481
+ "strict": true
482
+ },
483
+ {
484
+ "name": "host:port terminated by a query string",
485
+ "type": "HTTP_REQUEST",
486
+ "raw": "GET http://hypnotoad.org:1234?hail=all HTTP/1.1\r\n\r\n",
487
+ "should_keep_alive": true,
488
+ "message_complete_on_eof": false,
489
+ "http_major": 1,
490
+ "http_minor": 1,
491
+ "method": "GET",
492
+ "query_string": "hail=all",
493
+ "fragment": "",
494
+ "request_path": "",
495
+ "request_url": "http://hypnotoad.org:1234?hail=all",
496
+ "port": 1234,
497
+ "num_headers": 0,
498
+ "headers": {
499
+
500
+ },
501
+ "body": "",
502
+ "strict": true
503
+ },
504
+ {
505
+ "name": "host:port terminated by a space",
506
+ "type": "HTTP_REQUEST",
507
+ "raw": "GET http://hypnotoad.org:1234 HTTP/1.1\r\n\r\n",
508
+ "should_keep_alive": true,
509
+ "message_complete_on_eof": false,
510
+ "http_major": 1,
511
+ "http_minor": 1,
512
+ "method": "GET",
513
+ "query_string": "",
514
+ "fragment": "",
515
+ "request_path": "",
516
+ "request_url": "http://hypnotoad.org:1234",
517
+ "port": 1234,
518
+ "num_headers": 0,
519
+ "headers": {
520
+
521
+ },
522
+ "body": "",
523
+ "strict": true
524
+ },
525
+ {
526
+ "name": "PATCH request",
527
+ "type": "HTTP_REQUEST",
528
+ "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",
529
+ "should_keep_alive": true,
530
+ "message_complete_on_eof": false,
531
+ "http_major": 1,
532
+ "http_minor": 1,
533
+ "method": "PATCH",
534
+ "query_string": "",
535
+ "fragment": "",
536
+ "request_path": "/file.txt",
537
+ "request_url": "/file.txt",
538
+ "num_headers": 4,
539
+ "headers": {
540
+ "Host": "www.example.com",
541
+ "Content-Type": "application/example",
542
+ "If-Match": "\"e0023aa4e\"",
543
+ "Content-Length": "10"
544
+ },
545
+ "body": "cccccccccc",
546
+ "strict": true
547
+ },
548
+ {
549
+ "name": "connect caps request",
550
+ "type": "HTTP_REQUEST",
551
+ "raw": "CONNECT HOME0.NETSCAPE.COM:443 HTTP/1.0\r\nUser-agent: Mozilla/1.1N\r\nProxy-authorization: basic aGVsbG86d29ybGQ=\r\n\r\n",
552
+ "should_keep_alive": false,
553
+ "message_complete_on_eof": false,
554
+ "http_major": 1,
555
+ "http_minor": 0,
556
+ "method": "CONNECT",
557
+ "query_string": "",
558
+ "fragment": "",
559
+ "request_path": "",
560
+ "request_url": "HOME0.NETSCAPE.COM:443",
561
+ "num_headers": 2,
562
+ "upgrade": "",
563
+ "headers": {
564
+ "User-agent": "Mozilla/1.1N",
565
+ "Proxy-authorization": "basic aGVsbG86d29ybGQ="
566
+ },
567
+ "body": "",
568
+ "strict": true
569
+ },
570
+ {
571
+ "name": "utf-8 path request",
572
+ "type": "HTTP_REQUEST",
573
+ "strict": false,
574
+ "raw": "GET /δ¶/δt/pope?q=1#narf HTTP/1.1\r\nHost: github.com\r\n\r\n",
575
+ "should_keep_alive": true,
576
+ "message_complete_on_eof": false,
577
+ "http_major": 1,
578
+ "http_minor": 1,
579
+ "method": "GET",
580
+ "query_string": "q=1",
581
+ "fragment": "narf",
582
+ "request_path": "/δ¶/δt/pope",
583
+ "request_url": "/δ¶/δt/pope?q=1#narf",
584
+ "num_headers": 1,
585
+ "headers": {
586
+ "Host": "github.com"
587
+ },
588
+ "body": ""
589
+ },
590
+ {
591
+ "name": "hostname underscore",
592
+ "type": "HTTP_REQUEST",
593
+ "strict": false,
594
+ "raw": "CONNECT home_0.netscape.com:443 HTTP/1.0\r\nUser-agent: Mozilla/1.1N\r\nProxy-authorization: basic aGVsbG86d29ybGQ=\r\n\r\n",
595
+ "should_keep_alive": false,
596
+ "message_complete_on_eof": false,
597
+ "http_major": 1,
598
+ "http_minor": 0,
599
+ "method": "CONNECT",
600
+ "query_string": "",
601
+ "fragment": "",
602
+ "request_path": "",
603
+ "request_url": "home_0.netscape.com:443",
604
+ "num_headers": 2,
605
+ "upgrade": "",
606
+ "headers": {
607
+ "User-agent": "Mozilla/1.1N",
608
+ "Proxy-authorization": "basic aGVsbG86d29ybGQ="
397
609
  },
398
610
  "body": ""
399
611
  }
@@ -8,6 +8,7 @@
8
8
  "http_major": 1,
9
9
  "http_minor": 1,
10
10
  "status_code": 301,
11
+ "status": "Moved Permanently",
11
12
  "num_headers": 8,
12
13
  "headers": {
13
14
  "Location": "http://www.google.com/",
@@ -19,7 +20,8 @@
19
20
  "Server": "gws",
20
21
  "Content-Length": "219 "
21
22
  },
22
- "body": "<HTML><HEAD><meta http-equiv=\"content-type\" content=\"text/html;charset=utf-8\">\n<TITLE>301 Moved</TITLE></HEAD><BODY>\n<H1>301 Moved</H1>\nThe document has moved\n<A HREF=\"http://www.google.com/\">here</A>.\r\n</BODY></HTML>\r\n"
23
+ "body": "<HTML><HEAD><meta http-equiv=\"content-type\" content=\"text/html;charset=utf-8\">\n<TITLE>301 Moved</TITLE></HEAD><BODY>\n<H1>301 Moved</H1>\nThe document has moved\n<A HREF=\"http://www.google.com/\">here</A>.\r\n</BODY></HTML>\r\n",
24
+ "strict": true
23
25
  },
24
26
  {
25
27
  "name": "no content-length response",
@@ -30,6 +32,7 @@
30
32
  "http_major": 1,
31
33
  "http_minor": 1,
32
34
  "status_code": 200,
35
+ "status": "OK",
33
36
  "num_headers": 5,
34
37
  "headers": {
35
38
  "Date": "Tue, 04 Aug 2009 07:59:32 GMT",
@@ -38,38 +41,43 @@
38
41
  "Content-Type": "text/xml; charset=utf-8",
39
42
  "Connection": "close"
40
43
  },
41
- "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\">\n <SOAP-ENV:Body>\n <SOAP-ENV:Fault>\n <faultcode>SOAP-ENV:Client</faultcode>\n <faultstring>Client Error</faultstring>\n </SOAP-ENV:Fault>\n </SOAP-ENV:Body>\n</SOAP-ENV:Envelope>"
44
+ "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\">\n <SOAP-ENV:Body>\n <SOAP-ENV:Fault>\n <faultcode>SOAP-ENV:Client</faultcode>\n <faultstring>Client Error</faultstring>\n </SOAP-ENV:Fault>\n </SOAP-ENV:Body>\n</SOAP-ENV:Envelope>",
45
+ "strict": true
42
46
  },
43
47
  {
44
48
  "name": "404 no headers no body",
45
49
  "type": "HTTP_RESPONSE",
46
50
  "raw": "HTTP/1.1 404 Not Found\r\n\r\n",
47
- "should_keep_alive": true,
48
- "message_complete_on_eof": false,
51
+ "should_keep_alive": false,
52
+ "message_complete_on_eof": true,
49
53
  "http_major": 1,
50
54
  "http_minor": 1,
51
55
  "status_code": 404,
56
+ "status": "Not Found",
52
57
  "num_headers": 0,
53
58
  "headers": {
54
59
 
55
60
  },
56
61
  "body_size": 0,
57
- "body": ""
62
+ "body": "",
63
+ "strict": true
58
64
  },
59
65
  {
60
66
  "name": "301 no response phrase",
61
67
  "type": "HTTP_RESPONSE",
62
68
  "raw": "HTTP/1.1 301\r\n\r\n",
63
- "should_keep_alive": true,
64
- "message_complete_on_eof": false,
69
+ "should_keep_alive": false,
70
+ "message_complete_on_eof": true,
65
71
  "http_major": 1,
66
72
  "http_minor": 1,
67
73
  "status_code": 301,
74
+ "status": "",
68
75
  "num_headers": 0,
69
76
  "headers": {
70
77
 
71
78
  },
72
- "body": ""
79
+ "body": "",
80
+ "strict": true
73
81
  },
74
82
  {
75
83
  "name": "200 trailing space on chunked body",
@@ -80,13 +88,15 @@
80
88
  "http_major": 1,
81
89
  "http_minor": 1,
82
90
  "status_code": 200,
91
+ "status": "OK",
83
92
  "num_headers": 2,
84
93
  "headers": {
85
94
  "Content-Type": "text/plain",
86
95
  "Transfer-Encoding": "chunked"
87
96
  },
88
97
  "body_size": 65,
89
- "body": "This is the data in the first chunk\r\nand this is the second one\r\n"
98
+ "body": "This is the data in the first chunk\r\nand this is the second one\r\n",
99
+ "strict": true
90
100
  },
91
101
  {
92
102
  "name": "no carriage ret",
@@ -97,12 +107,14 @@
97
107
  "http_major": 1,
98
108
  "http_minor": 1,
99
109
  "status_code": 200,
110
+ "status": "OK",
100
111
  "num_headers": 2,
101
112
  "headers": {
102
113
  "Content-Type": "text/html; charset=utf-8",
103
114
  "Connection": "close"
104
115
  },
105
- "body": "these headers are from http://news.ycombinator.com/"
116
+ "body": "these headers are from http://news.ycombinator.com/",
117
+ "strict": true
106
118
  },
107
119
  {
108
120
  "name": "proxy connection",
@@ -113,6 +125,7 @@
113
125
  "http_major": 1,
114
126
  "http_minor": 1,
115
127
  "status_code": 200,
128
+ "status": "OK",
116
129
  "num_headers": 4,
117
130
  "headers": {
118
131
  "Content-Type": "text/html; charset=UTF-8",
@@ -120,7 +133,8 @@
120
133
  "Proxy-Connection": "close",
121
134
  "Date": "Thu, 31 Dec 2009 20:55:48 +0000"
122
135
  },
123
- "body": "hello world"
136
+ "body": "hello world",
137
+ "strict": true
124
138
  },
125
139
  {
126
140
  "name": "underscore header key",
@@ -131,6 +145,7 @@
131
145
  "http_major": 1,
132
146
  "http_minor": 1,
133
147
  "status_code": 200,
148
+ "status": "OK",
134
149
  "num_headers": 4,
135
150
  "headers": {
136
151
  "Server": "DCLK-AdSvr",
@@ -138,7 +153,8 @@
138
153
  "Content-Length": "0",
139
154
  "DCLK_imp": "v7;x;114750856;0-0;0;17820020;0/0;21603567/21621457/1;;~okv=;dcmt=text/xml;;~cs=o"
140
155
  },
141
- "body": ""
156
+ "body": "",
157
+ "strict": true
142
158
  },
143
159
  {
144
160
  "name": "bonjourmadame.fr",
@@ -149,6 +165,7 @@
149
165
  "http_major": 1,
150
166
  "http_minor": 0,
151
167
  "status_code": 301,
168
+ "status": "Moved Permanently",
152
169
  "num_headers": 9,
153
170
  "headers": {
154
171
  "Date": "Thu, 03 Jun 2010 09:56:32 GMT",
@@ -161,28 +178,8 @@
161
178
  "Content-Type": "text/html; charset=UTF-8",
162
179
  "Connection": "keep-alive"
163
180
  },
164
- "body": ""
165
- },
166
- {
167
- "name": "field space",
168
- "type": "HTTP_RESPONSE",
169
- "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>",
170
- "should_keep_alive": true,
171
- "message_complete_on_eof": false,
172
- "http_major": 1,
173
- "http_minor": 1,
174
- "status_code": 200,
175
- "num_headers": 7,
176
- "headers": {
177
- "Server": "Microsoft-IIS/6.0",
178
- "X-Powered-By": "ASP.NET",
179
- "en-US Content-Type": "text/xml",
180
- "Content-Type": "text/xml",
181
- "Content-Length": "16",
182
- "Date": "Fri, 23 Jul 2010 18:45:38 GMT",
183
- "Connection": "keep-alive"
184
- },
185
- "body": "<xml>hello</xml>"
181
+ "body": "",
182
+ "strict": true
186
183
  },
187
184
  {
188
185
  "name": "field underscore",
@@ -193,6 +190,7 @@
193
190
  "http_major": 1,
194
191
  "http_minor": 1,
195
192
  "status_code": 200,
193
+ "status": "OK",
196
194
  "num_headers": 11,
197
195
  "headers": {
198
196
  "Date": "Tue, 28 Sep 2010 01:14:13 GMT",
@@ -207,7 +205,8 @@
207
205
  "Content-Type": "text/html",
208
206
  "Connection": "close"
209
207
  },
210
- "body": ""
208
+ "body": "",
209
+ "strict": true
211
210
  },
212
211
  {
213
212
  "name": "non-ASCII in status line",
@@ -218,12 +217,179 @@
218
217
  "http_major": 1,
219
218
  "http_minor": 1,
220
219
  "status_code": 500,
220
+ "status": "Oriëntatieprobleem",
221
221
  "num_headers": 3,
222
222
  "headers": {
223
223
  "Date": "Fri, 5 Nov 2010 23:07:12 GMT+2",
224
224
  "Content-Length": "0",
225
225
  "Connection": "close"
226
226
  },
227
- "body": ""
227
+ "body": "",
228
+ "strict": true
229
+ },
230
+ {
231
+ "name": "http version 0.9",
232
+ "type": "HTTP_RESPONSE",
233
+ "raw": "HTTP/0.9 200 OK\r\n\r\n",
234
+ "should_keep_alive": false,
235
+ "message_complete_on_eof": true,
236
+ "http_major": 0,
237
+ "http_minor": 9,
238
+ "status_code": 200,
239
+ "status": "OK",
240
+ "num_headers": 0,
241
+ "headers": {
242
+
243
+ },
244
+ "body": "",
245
+ "strict": true
246
+ },
247
+ {
248
+ "name": "neither content-length nor transfer-encoding response",
249
+ "type": "HTTP_RESPONSE",
250
+ "raw": "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\nhello world",
251
+ "should_keep_alive": false,
252
+ "message_complete_on_eof": true,
253
+ "http_major": 1,
254
+ "http_minor": 1,
255
+ "status_code": 200,
256
+ "status": "OK",
257
+ "num_headers": 1,
258
+ "headers": {
259
+ "Content-Type": "text/plain"
260
+ },
261
+ "body": "hello world",
262
+ "strict": true
263
+ },
264
+ {
265
+ "name": "HTTP/1.0 with keep-alive and EOF-terminated 200 status",
266
+ "type": "HTTP_RESPONSE",
267
+ "raw": "HTTP/1.0 200 OK\r\nConnection: keep-alive\r\n\r\n",
268
+ "should_keep_alive": false,
269
+ "message_complete_on_eof": true,
270
+ "http_major": 1,
271
+ "http_minor": 0,
272
+ "status_code": 200,
273
+ "status": "OK",
274
+ "num_headers": 1,
275
+ "headers": {
276
+ "Connection": "keep-alive"
277
+ },
278
+ "body_size": 0,
279
+ "body": "",
280
+ "strict": true
281
+ },
282
+ {
283
+ "name": "HTTP/1.0 with keep-alive and a 204 status",
284
+ "type": "HTTP_RESPONSE",
285
+ "raw": "HTTP/1.0 204 No content\r\nConnection: keep-alive\r\n\r\n",
286
+ "should_keep_alive": true,
287
+ "message_complete_on_eof": false,
288
+ "http_major": 1,
289
+ "http_minor": 0,
290
+ "status_code": 204,
291
+ "status": "No content",
292
+ "num_headers": 1,
293
+ "headers": {
294
+ "Connection": "keep-alive"
295
+ },
296
+ "body_size": 0,
297
+ "body": "",
298
+ "strict": true
299
+ },
300
+ {
301
+ "name": "HTTP/1.1 with an EOF-terminated 200 status",
302
+ "type": "HTTP_RESPONSE",
303
+ "raw": "HTTP/1.1 200 OK\r\n\r\n",
304
+ "should_keep_alive": false,
305
+ "message_complete_on_eof": true,
306
+ "http_major": 1,
307
+ "http_minor": 1,
308
+ "status_code": 200,
309
+ "status": "OK",
310
+ "num_headers": 0,
311
+ "headers": {
312
+
313
+ },
314
+ "body_size": 0,
315
+ "body": "",
316
+ "strict": true
317
+ },
318
+ {
319
+ "name": "HTTP/1.1 with a 204 status",
320
+ "type": "HTTP_RESPONSE",
321
+ "raw": "HTTP/1.1 204 No content\r\n\r\n",
322
+ "should_keep_alive": true,
323
+ "message_complete_on_eof": false,
324
+ "http_major": 1,
325
+ "http_minor": 1,
326
+ "status_code": 204,
327
+ "status": "No content",
328
+ "num_headers": 0,
329
+ "headers": {
330
+
331
+ },
332
+ "body_size": 0,
333
+ "body": "",
334
+ "strict": true
335
+ },
336
+ {
337
+ "name": "HTTP/1.1 with a 204 status and keep-alive disabled",
338
+ "type": "HTTP_RESPONSE",
339
+ "raw": "HTTP/1.1 204 No content\r\nConnection: close\r\n\r\n",
340
+ "should_keep_alive": false,
341
+ "message_complete_on_eof": false,
342
+ "http_major": 1,
343
+ "http_minor": 1,
344
+ "status_code": 204,
345
+ "status": "No content",
346
+ "num_headers": 1,
347
+ "headers": {
348
+ "Connection": "close"
349
+ },
350
+ "body_size": 0,
351
+ "body": "",
352
+ "strict": true
353
+ },
354
+ {
355
+ "name": "HTTP/1.1 with chunked endocing and a 200 response",
356
+ "type": "HTTP_RESPONSE",
357
+ "raw": "HTTP/1.1 200 OK\r\nTransfer-Encoding: chunked\r\n\r\n0\r\n\r\n",
358
+ "should_keep_alive": true,
359
+ "message_complete_on_eof": false,
360
+ "http_major": 1,
361
+ "http_minor": 1,
362
+ "status_code": 200,
363
+ "status": "OK",
364
+ "num_headers": 1,
365
+ "headers": {
366
+ "Transfer-Encoding": "chunked"
367
+ },
368
+ "body_size": 0,
369
+ "body": "",
370
+ "strict": true
371
+ },
372
+ {
373
+ "name": "field space",
374
+ "type": "HTTP_RESPONSE",
375
+ "strict": false,
376
+ "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>",
377
+ "should_keep_alive": true,
378
+ "message_complete_on_eof": false,
379
+ "http_major": 1,
380
+ "http_minor": 1,
381
+ "status_code": 200,
382
+ "status": "OK",
383
+ "num_headers": 7,
384
+ "headers": {
385
+ "Server": "Microsoft-IIS/6.0",
386
+ "X-Powered-By": "ASP.NET",
387
+ "en-US Content-Type": "text/xml",
388
+ "Content-Type": "text/xml",
389
+ "Content-Length": "16",
390
+ "Date": "Fri, 23 Jul 2010 18:45:38 GMT",
391
+ "Connection": "keep-alive"
392
+ },
393
+ "body": "<xml>hello</xml>"
228
394
  }
229
395
  ]