midori_http_parser 0.6.1.1-java

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 (86) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +12 -0
  3. data/.gitmodules +6 -0
  4. data/.travis.yml +33 -0
  5. data/Gemfile +2 -0
  6. data/LICENSE-MIT +20 -0
  7. data/README.md +90 -0
  8. data/Rakefile +6 -0
  9. data/bench/standalone.rb +23 -0
  10. data/bench/thin.rb +58 -0
  11. data/ext/ruby_http_parser/.gitignore +1 -0
  12. data/ext/ruby_http_parser/RubyHttpParserService.java +18 -0
  13. data/ext/ruby_http_parser/ext_help.h +18 -0
  14. data/ext/ruby_http_parser/extconf.rb +24 -0
  15. data/ext/ruby_http_parser/org/ruby_http_parser/RubyHttpParser.java +495 -0
  16. data/ext/ruby_http_parser/ruby_http_parser.c +516 -0
  17. data/ext/ruby_http_parser/vendor/.gitkeep +0 -0
  18. data/ext/ruby_http_parser/vendor/http-parser-java/AUTHORS +32 -0
  19. data/ext/ruby_http_parser/vendor/http-parser-java/LICENSE-MIT +48 -0
  20. data/ext/ruby_http_parser/vendor/http-parser-java/README.md +183 -0
  21. data/ext/ruby_http_parser/vendor/http-parser-java/TODO +28 -0
  22. data/ext/ruby_http_parser/vendor/http-parser-java/build.xml +74 -0
  23. data/ext/ruby_http_parser/vendor/http-parser-java/http_parser.c +2175 -0
  24. data/ext/ruby_http_parser/vendor/http-parser-java/http_parser.gyp +79 -0
  25. data/ext/ruby_http_parser/vendor/http-parser-java/http_parser.h +304 -0
  26. data/ext/ruby_http_parser/vendor/http-parser-java/src/Http-parser.java.iml +22 -0
  27. data/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/FieldData.java +41 -0
  28. data/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPCallback.java +8 -0
  29. data/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPDataCallback.java +34 -0
  30. data/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPErrorCallback.java +12 -0
  31. data/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPException.java +9 -0
  32. data/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPMethod.java +113 -0
  33. data/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPParser.java +36 -0
  34. data/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPParserUrl.java +76 -0
  35. data/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/ParserSettings.java +256 -0
  36. data/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/ParserType.java +13 -0
  37. data/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/Util.java +111 -0
  38. data/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/lolevel/HTTPCallback.java +5 -0
  39. data/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/lolevel/HTTPDataCallback.java +25 -0
  40. data/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/lolevel/HTTPErrorCallback.java +7 -0
  41. data/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/lolevel/HTTPParser.java +2171 -0
  42. data/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/lolevel/ParserSettings.java +83 -0
  43. data/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Message.java +374 -0
  44. data/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/ParseUrl.java +51 -0
  45. data/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Requests.java +69 -0
  46. data/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Responses.java +52 -0
  47. data/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Test.java +16 -0
  48. data/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/TestHeaderOverflowError.java +48 -0
  49. data/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/TestLoaderNG.java +212 -0
  50. data/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/TestNoOverflowLongBody.java +62 -0
  51. data/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/UnitTest.java +117 -0
  52. data/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Upgrade.java +27 -0
  53. data/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Url.java +127 -0
  54. data/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Util.java +236 -0
  55. data/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/WrongContentLength.java +59 -0
  56. data/ext/ruby_http_parser/vendor/http-parser-java/test.c +3425 -0
  57. data/ext/ruby_http_parser/vendor/http-parser-java/tests.dumped +845 -0
  58. data/ext/ruby_http_parser/vendor/http-parser-java/tests.utf8 +17 -0
  59. data/ext/ruby_http_parser/vendor/http-parser-java/tools/byte_constants.rb +6 -0
  60. data/ext/ruby_http_parser/vendor/http-parser-java/tools/const_char.rb +13 -0
  61. data/ext/ruby_http_parser/vendor/http-parser-java/tools/lowcase.rb +15 -0
  62. data/ext/ruby_http_parser/vendor/http-parser-java/tools/parse_tests.rb +33 -0
  63. data/ext/ruby_http_parser/vendor/http-parser/AUTHORS +68 -0
  64. data/ext/ruby_http_parser/vendor/http-parser/LICENSE-MIT +23 -0
  65. data/ext/ruby_http_parser/vendor/http-parser/README.md +246 -0
  66. data/ext/ruby_http_parser/vendor/http-parser/bench.c +111 -0
  67. data/ext/ruby_http_parser/vendor/http-parser/contrib/parsertrace.c +160 -0
  68. data/ext/ruby_http_parser/vendor/http-parser/contrib/url_parser.c +47 -0
  69. data/ext/ruby_http_parser/vendor/http-parser/http_parser.c +2470 -0
  70. data/ext/ruby_http_parser/vendor/http-parser/http_parser.gyp +111 -0
  71. data/ext/ruby_http_parser/vendor/http-parser/http_parser.h +432 -0
  72. data/ext/ruby_http_parser/vendor/http-parser/test.c +4226 -0
  73. data/ext/ruby_http_parser/vendor/http-parser/test_fast +0 -0
  74. data/ext/ruby_http_parser/vendor/http-parser/test_g +0 -0
  75. data/lib/http/parser.rb +1 -0
  76. data/lib/http_parser.rb +21 -0
  77. data/midori_http_parser.gemspec +24 -0
  78. data/spec/parser_spec.rb +376 -0
  79. data/spec/spec_helper.rb +1 -0
  80. data/spec/support/requests.json +631 -0
  81. data/spec/support/responses.json +375 -0
  82. data/tasks/compile.rake +42 -0
  83. data/tasks/fixtures.rake +71 -0
  84. data/tasks/spec.rake +5 -0
  85. data/tasks/submodules.rake +7 -0
  86. metadata +206 -0
@@ -0,0 +1,375 @@
1
+ [
2
+ {
3
+ "name": "google 301",
4
+ "type": "HTTP_RESPONSE",
5
+ "raw": "HTTP/1.1 301 Moved Permanently\r\nLocation: http://www.google.com/\r\nContent-Type: text/html; charset=UTF-8\r\nDate: Sun, 26 Apr 2009 11:11:49 GMT\r\nExpires: Tue, 26 May 2009 11:11:49 GMT\r\nX-$PrototypeBI-Version: 1.6.0.3\r\nCache-Control: public, max-age=2592000\r\nServer: gws\r\nContent-Length: 219 \r\n\r\n<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",
6
+ "should_keep_alive": true,
7
+ "message_complete_on_eof": false,
8
+ "http_major": 1,
9
+ "http_minor": 1,
10
+ "status_code": 301,
11
+ "num_headers": 8,
12
+ "headers": {
13
+ "Location": "http://www.google.com/",
14
+ "Content-Type": "text/html; charset=UTF-8",
15
+ "Date": "Sun, 26 Apr 2009 11:11:49 GMT",
16
+ "Expires": "Tue, 26 May 2009 11:11:49 GMT",
17
+ "X-$PrototypeBI-Version": "1.6.0.3",
18
+ "Cache-Control": "public, max-age=2592000",
19
+ "Server": "gws",
20
+ "Content-Length": "219 "
21
+ },
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
+ "strict": true
24
+ },
25
+ {
26
+ "name": "no content-length response",
27
+ "type": "HTTP_RESPONSE",
28
+ "raw": "HTTP/1.1 200 OK\r\nDate: Tue, 04 Aug 2009 07:59:32 GMT\r\nServer: Apache\r\nX-Powered-By: Servlet/2.5 JSP/2.1\r\nContent-Type: text/xml; charset=utf-8\r\nConnection: close\r\n\r\n<?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>",
29
+ "should_keep_alive": false,
30
+ "message_complete_on_eof": true,
31
+ "http_major": 1,
32
+ "http_minor": 1,
33
+ "status_code": 200,
34
+ "num_headers": 5,
35
+ "headers": {
36
+ "Date": "Tue, 04 Aug 2009 07:59:32 GMT",
37
+ "Server": "Apache",
38
+ "X-Powered-By": "Servlet/2.5 JSP/2.1",
39
+ "Content-Type": "text/xml; charset=utf-8",
40
+ "Connection": "close"
41
+ },
42
+ "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>",
43
+ "strict": true
44
+ },
45
+ {
46
+ "name": "404 no headers no body",
47
+ "type": "HTTP_RESPONSE",
48
+ "raw": "HTTP/1.1 404 Not Found\r\n\r\n",
49
+ "should_keep_alive": false,
50
+ "message_complete_on_eof": true,
51
+ "http_major": 1,
52
+ "http_minor": 1,
53
+ "status_code": 404,
54
+ "num_headers": 0,
55
+ "headers": {
56
+
57
+ },
58
+ "body_size": 0,
59
+ "body": "",
60
+ "strict": true
61
+ },
62
+ {
63
+ "name": "301 no response phrase",
64
+ "type": "HTTP_RESPONSE",
65
+ "raw": "HTTP/1.1 301\r\n\r\n",
66
+ "should_keep_alive": false,
67
+ "message_complete_on_eof": true,
68
+ "http_major": 1,
69
+ "http_minor": 1,
70
+ "status_code": 301,
71
+ "num_headers": 0,
72
+ "headers": {
73
+
74
+ },
75
+ "body": "",
76
+ "strict": true
77
+ },
78
+ {
79
+ "name": "200 trailing space on chunked body",
80
+ "type": "HTTP_RESPONSE",
81
+ "raw": "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\nTransfer-Encoding: chunked\r\n\r\n25 \r\nThis is the data in the first chunk\r\n\r\n1C\r\nand this is the second one\r\n\r\n0 \r\n\r\n",
82
+ "should_keep_alive": true,
83
+ "message_complete_on_eof": false,
84
+ "http_major": 1,
85
+ "http_minor": 1,
86
+ "status_code": 200,
87
+ "num_headers": 2,
88
+ "headers": {
89
+ "Content-Type": "text/plain",
90
+ "Transfer-Encoding": "chunked"
91
+ },
92
+ "body_size": 65,
93
+ "body": "This is the data in the first chunk\r\nand this is the second one\r\n",
94
+ "strict": true
95
+ },
96
+ {
97
+ "name": "no carriage ret",
98
+ "type": "HTTP_RESPONSE",
99
+ "raw": "HTTP/1.1 200 OK\nContent-Type: text/html; charset=utf-8\nConnection: close\n\nthese headers are from http://news.ycombinator.com/",
100
+ "should_keep_alive": false,
101
+ "message_complete_on_eof": true,
102
+ "http_major": 1,
103
+ "http_minor": 1,
104
+ "status_code": 200,
105
+ "num_headers": 2,
106
+ "headers": {
107
+ "Content-Type": "text/html; charset=utf-8",
108
+ "Connection": "close"
109
+ },
110
+ "body": "these headers are from http://news.ycombinator.com/",
111
+ "strict": true
112
+ },
113
+ {
114
+ "name": "proxy connection",
115
+ "type": "HTTP_RESPONSE",
116
+ "raw": "HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=UTF-8\r\nContent-Length: 11\r\nProxy-Connection: close\r\nDate: Thu, 31 Dec 2009 20:55:48 +0000\r\n\r\nhello world",
117
+ "should_keep_alive": false,
118
+ "message_complete_on_eof": false,
119
+ "http_major": 1,
120
+ "http_minor": 1,
121
+ "status_code": 200,
122
+ "num_headers": 4,
123
+ "headers": {
124
+ "Content-Type": "text/html; charset=UTF-8",
125
+ "Content-Length": "11",
126
+ "Proxy-Connection": "close",
127
+ "Date": "Thu, 31 Dec 2009 20:55:48 +0000"
128
+ },
129
+ "body": "hello world",
130
+ "strict": true
131
+ },
132
+ {
133
+ "name": "underscore header key",
134
+ "type": "HTTP_RESPONSE",
135
+ "raw": "HTTP/1.1 200 OK\r\nServer: DCLK-AdSvr\r\nContent-Type: text/xml\r\nContent-Length: 0\r\nDCLK_imp: v7;x;114750856;0-0;0;17820020;0/0;21603567/21621457/1;;~okv=;dcmt=text/xml;;~cs=o\r\n\r\n",
136
+ "should_keep_alive": true,
137
+ "message_complete_on_eof": false,
138
+ "http_major": 1,
139
+ "http_minor": 1,
140
+ "status_code": 200,
141
+ "num_headers": 4,
142
+ "headers": {
143
+ "Server": "DCLK-AdSvr",
144
+ "Content-Type": "text/xml",
145
+ "Content-Length": "0",
146
+ "DCLK_imp": "v7;x;114750856;0-0;0;17820020;0/0;21603567/21621457/1;;~okv=;dcmt=text/xml;;~cs=o"
147
+ },
148
+ "body": "",
149
+ "strict": true
150
+ },
151
+ {
152
+ "name": "bonjourmadame.fr",
153
+ "type": "HTTP_RESPONSE",
154
+ "raw": "HTTP/1.0 301 Moved Permanently\r\nDate: Thu, 03 Jun 2010 09:56:32 GMT\r\nServer: Apache/2.2.3 (Red Hat)\r\nCache-Control: public\r\nPragma: \r\nLocation: http://www.bonjourmadame.fr/\r\nVary: Accept-Encoding\r\nContent-Length: 0\r\nContent-Type: text/html; charset=UTF-8\r\nConnection: keep-alive\r\n\r\n",
155
+ "should_keep_alive": true,
156
+ "message_complete_on_eof": false,
157
+ "http_major": 1,
158
+ "http_minor": 0,
159
+ "status_code": 301,
160
+ "num_headers": 9,
161
+ "headers": {
162
+ "Date": "Thu, 03 Jun 2010 09:56:32 GMT",
163
+ "Server": "Apache/2.2.3 (Red Hat)",
164
+ "Cache-Control": "public",
165
+ "Pragma": "",
166
+ "Location": "http://www.bonjourmadame.fr/",
167
+ "Vary": "Accept-Encoding",
168
+ "Content-Length": "0",
169
+ "Content-Type": "text/html; charset=UTF-8",
170
+ "Connection": "keep-alive"
171
+ },
172
+ "body": "",
173
+ "strict": true
174
+ },
175
+ {
176
+ "name": "field underscore",
177
+ "type": "HTTP_RESPONSE",
178
+ "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",
179
+ "should_keep_alive": false,
180
+ "message_complete_on_eof": false,
181
+ "http_major": 1,
182
+ "http_minor": 1,
183
+ "status_code": 200,
184
+ "num_headers": 11,
185
+ "headers": {
186
+ "Date": "Tue, 28 Sep 2010 01:14:13 GMT",
187
+ "Server": "Apache",
188
+ "Cache-Control": "no-cache, must-revalidate",
189
+ "Expires": "Mon, 26 Jul 1997 05:00:00 GMT",
190
+ ".et-Cookie": "PlaxoCS=1274804622353690521; path=/; domain=.plaxo.com",
191
+ "Vary": "Accept-Encoding",
192
+ "_eep-Alive": "timeout=45",
193
+ "_onnection": "Keep-Alive",
194
+ "Transfer-Encoding": "chunked",
195
+ "Content-Type": "text/html",
196
+ "Connection": "close"
197
+ },
198
+ "body": "",
199
+ "strict": true
200
+ },
201
+ {
202
+ "name": "non-ASCII in status line",
203
+ "type": "HTTP_RESPONSE",
204
+ "raw": "HTTP/1.1 500 Oriëntatieprobleem\r\nDate: Fri, 5 Nov 2010 23:07:12 GMT+2\r\nContent-Length: 0\r\nConnection: close\r\n\r\n",
205
+ "should_keep_alive": false,
206
+ "message_complete_on_eof": false,
207
+ "http_major": 1,
208
+ "http_minor": 1,
209
+ "status_code": 500,
210
+ "num_headers": 3,
211
+ "headers": {
212
+ "Date": "Fri, 5 Nov 2010 23:07:12 GMT+2",
213
+ "Content-Length": "0",
214
+ "Connection": "close"
215
+ },
216
+ "body": "",
217
+ "strict": true
218
+ },
219
+ {
220
+ "name": "http version 0.9",
221
+ "type": "HTTP_RESPONSE",
222
+ "raw": "HTTP/0.9 200 OK\r\n\r\n",
223
+ "should_keep_alive": false,
224
+ "message_complete_on_eof": true,
225
+ "http_major": 0,
226
+ "http_minor": 9,
227
+ "status_code": 200,
228
+ "num_headers": 0,
229
+ "headers": {
230
+
231
+ },
232
+ "body": "",
233
+ "strict": true
234
+ },
235
+ {
236
+ "name": "neither content-length nor transfer-encoding response",
237
+ "type": "HTTP_RESPONSE",
238
+ "raw": "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\nhello world",
239
+ "should_keep_alive": false,
240
+ "message_complete_on_eof": true,
241
+ "http_major": 1,
242
+ "http_minor": 1,
243
+ "status_code": 200,
244
+ "num_headers": 1,
245
+ "headers": {
246
+ "Content-Type": "text/plain"
247
+ },
248
+ "body": "hello world",
249
+ "strict": true
250
+ },
251
+ {
252
+ "name": "HTTP/1.0 with keep-alive and EOF-terminated 200 status",
253
+ "type": "HTTP_RESPONSE",
254
+ "raw": "HTTP/1.0 200 OK\r\nConnection: keep-alive\r\n\r\n",
255
+ "should_keep_alive": false,
256
+ "message_complete_on_eof": true,
257
+ "http_major": 1,
258
+ "http_minor": 0,
259
+ "status_code": 200,
260
+ "num_headers": 1,
261
+ "headers": {
262
+ "Connection": "keep-alive"
263
+ },
264
+ "body_size": 0,
265
+ "body": "",
266
+ "strict": true
267
+ },
268
+ {
269
+ "name": "HTTP/1.0 with keep-alive and a 204 status",
270
+ "type": "HTTP_RESPONSE",
271
+ "raw": "HTTP/1.0 204 No content\r\nConnection: keep-alive\r\n\r\n",
272
+ "should_keep_alive": true,
273
+ "message_complete_on_eof": false,
274
+ "http_major": 1,
275
+ "http_minor": 0,
276
+ "status_code": 204,
277
+ "num_headers": 1,
278
+ "headers": {
279
+ "Connection": "keep-alive"
280
+ },
281
+ "body_size": 0,
282
+ "body": "",
283
+ "strict": true
284
+ },
285
+ {
286
+ "name": "HTTP/1.1 with an EOF-terminated 200 status",
287
+ "type": "HTTP_RESPONSE",
288
+ "raw": "HTTP/1.1 200 OK\r\n\r\n",
289
+ "should_keep_alive": false,
290
+ "message_complete_on_eof": true,
291
+ "http_major": 1,
292
+ "http_minor": 1,
293
+ "status_code": 200,
294
+ "num_headers": 0,
295
+ "headers": {
296
+
297
+ },
298
+ "body_size": 0,
299
+ "body": "",
300
+ "strict": true
301
+ },
302
+ {
303
+ "name": "HTTP/1.1 with a 204 status",
304
+ "type": "HTTP_RESPONSE",
305
+ "raw": "HTTP/1.1 204 No content\r\n\r\n",
306
+ "should_keep_alive": true,
307
+ "message_complete_on_eof": false,
308
+ "http_major": 1,
309
+ "http_minor": 1,
310
+ "status_code": 204,
311
+ "num_headers": 0,
312
+ "headers": {
313
+
314
+ },
315
+ "body_size": 0,
316
+ "body": "",
317
+ "strict": true
318
+ },
319
+ {
320
+ "name": "HTTP/1.1 with a 204 status and keep-alive disabled",
321
+ "type": "HTTP_RESPONSE",
322
+ "raw": "HTTP/1.1 204 No content\r\nConnection: close\r\n\r\n",
323
+ "should_keep_alive": false,
324
+ "message_complete_on_eof": false,
325
+ "http_major": 1,
326
+ "http_minor": 1,
327
+ "status_code": 204,
328
+ "num_headers": 1,
329
+ "headers": {
330
+ "Connection": "close"
331
+ },
332
+ "body_size": 0,
333
+ "body": "",
334
+ "strict": true
335
+ },
336
+ {
337
+ "name": "HTTP/1.1 with chunked endocing and a 200 response",
338
+ "type": "HTTP_RESPONSE",
339
+ "raw": "HTTP/1.1 200 OK\r\nTransfer-Encoding: chunked\r\n\r\n0\r\n\r\n",
340
+ "should_keep_alive": true,
341
+ "message_complete_on_eof": false,
342
+ "http_major": 1,
343
+ "http_minor": 1,
344
+ "status_code": 200,
345
+ "num_headers": 1,
346
+ "headers": {
347
+ "Transfer-Encoding": "chunked"
348
+ },
349
+ "body_size": 0,
350
+ "body": "",
351
+ "strict": true
352
+ },
353
+ {
354
+ "name": "field space",
355
+ "type": "HTTP_RESPONSE",
356
+ "strict": false,
357
+ "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>",
358
+ "should_keep_alive": true,
359
+ "message_complete_on_eof": false,
360
+ "http_major": 1,
361
+ "http_minor": 1,
362
+ "status_code": 200,
363
+ "num_headers": 7,
364
+ "headers": {
365
+ "Server": "Microsoft-IIS/6.0",
366
+ "X-Powered-By": "ASP.NET",
367
+ "en-US Content-Type": "text/xml",
368
+ "Content-Type": "text/xml",
369
+ "Content-Length": "16",
370
+ "Date": "Fri, 23 Jul 2010 18:45:38 GMT",
371
+ "Connection": "keep-alive"
372
+ },
373
+ "body": "<xml>hello</xml>"
374
+ }
375
+ ]
@@ -0,0 +1,42 @@
1
+ require 'rubygems/package_task'
2
+ require 'rake/extensiontask'
3
+ require 'rake/javaextensiontask'
4
+
5
+ def gemspec
6
+ @clean_gemspec ||= eval(File.read(File.expand_path('../../midori_http_parser.gemspec', __FILE__)))
7
+ end
8
+
9
+ Gem::PackageTask.new(gemspec) do |pkg|
10
+ end
11
+
12
+ if RUBY_PLATFORM =~ /java/
13
+ Rake::JavaExtensionTask.new("ruby_http_parser", gemspec) do |ext|
14
+ ext.classpath = File.expand_path('../../ext/ruby_http_parser/vendor/http-parser-java/ext/primitives.jar', __FILE__)
15
+ end
16
+ else
17
+ Rake::ExtensionTask.new("ruby_http_parser", gemspec) do |ext|
18
+ unless RUBY_PLATFORM =~ /mswin|mingw/
19
+ ext.cross_compile = true
20
+ ext.cross_platform = ['x86-mingw32', 'x86-mswin32-60']
21
+
22
+ # inject 1.8/1.9 pure-ruby entry point
23
+ ext.cross_compiling do |spec|
24
+ spec.files += ['lib/ruby_http_parser.rb']
25
+ end
26
+ end
27
+ end
28
+ end
29
+
30
+ file 'lib/ruby_http_parser.rb' do |t|
31
+ File.open(t.name, 'wb') do |f|
32
+ f.write <<-eoruby
33
+ RUBY_VERSION =~ /(\\d+.\\d+)/
34
+ require "\#{$1}/ruby_http_parser"
35
+ eoruby
36
+ end
37
+ at_exit{ FileUtils.rm t.name if File.exists?(t.name) }
38
+ end
39
+
40
+ if Rake::Task.task_defined?(:cross)
41
+ task :cross => 'lib/ruby_http_parser.rb'
42
+ end
@@ -0,0 +1,71 @@
1
+ desc "Generate test fixtures"
2
+ task :fixtures => :submodules do
3
+ require 'yajl'
4
+ data = File.read File.expand_path('../../ext/ruby_http_parser/vendor/http-parser/test.c', __FILE__)
5
+
6
+ %w[ requests responses ].each do |type|
7
+ # find test definitions in between requests/responses[]= and .name=NULL
8
+ tmp = data[/#{type}\[\]\s*=(.+?),\s*\{\s*\.name=\s*NULL/m, 1]
9
+
10
+ # replace first { with a [ (parsing an array of test cases)
11
+ tmp.sub!('{','[')
12
+
13
+ # replace booleans
14
+ tmp.gsub!('TRUE', 'true')
15
+ tmp.gsub!('FALSE', 'false')
16
+
17
+ # mark strict mode tests
18
+ tmp.gsub!(%r|#if\s+!HTTP_PARSER_STRICT(.+?)#endif\s*/\*\s*!HTTP_PARSER_STRICT.+\n|m){
19
+ $1.gsub(/^(.+,\.type= .+)$/, "\\1\n, .strict= false")
20
+ }
21
+
22
+ # remove macros and comments
23
+ tmp.gsub!(/^#(if|elif|endif|define).+$/,'')
24
+ tmp.gsub!(/\/\*(.+?)\*\/$/,'')
25
+
26
+ # HTTP_* enums become strings
27
+ tmp.gsub!(/(= )(HTTP_\w+)/){
28
+ "#{$1}#{$2.sub('MSEARCH','M-SEARCH').dump}"
29
+ }
30
+
31
+ # join multiline strings for body and raw data
32
+ tmp.gsub!(/((body|raw)\s*=)(.+?)(\n\s+[\},])/m){
33
+ before, after = $1, $4
34
+ raw = $3.split("\n").map{ |l| l.strip[1..-2] }.join('')
35
+ "#{before} \"#{raw}\" #{after}"
36
+ }
37
+
38
+ # make headers an array of array tuples
39
+ tmp.gsub!(/(\.headers\s*=)(.+?)(\s*,\.)/m){
40
+ before, after = $1, $3
41
+ raw = $2.gsub('{', '[').gsub('}', ']')
42
+ "#{before} #{raw} #{after}"
43
+ }
44
+
45
+ # .name= becomes "name":
46
+ tmp.gsub!(/^(.{2,5})\.(\w+)\s*=/){
47
+ "#{$1}#{$2.dump}: "
48
+ }
49
+
50
+ # evaluate addition expressions
51
+ tmp.gsub!(/(body_size\":\s*)(\d+)\+(\d+)/){
52
+ "#{$1}#{$2.to_i+$3.to_i}"
53
+ }
54
+
55
+ # end result array
56
+ tmp << ']'
57
+
58
+ # normalize data
59
+ results = Yajl.load(tmp, :symbolize_keys => true)
60
+ results.map{ |res|
61
+ res[:headers] and res[:headers] = Hash[*res[:headers].flatten]
62
+ res[:method] and res[:method].gsub!(/^HTTP_/, '')
63
+ res[:strict] = true unless res.has_key?(:strict)
64
+ }
65
+
66
+ # write to a file
67
+ File.open("spec/support/#{type}.json", 'w'){ |f|
68
+ f.write Yajl.dump(results, :pretty => true)
69
+ }
70
+ end
71
+ end