unicorn 3.3.1 → 3.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.wrongdoc.yml +2 -2
- data/GIT-VERSION-GEN +1 -1
- data/KNOWN_ISSUES +17 -7
- data/README +2 -2
- data/Rakefile +3 -2
- data/examples/nginx.conf +12 -8
- data/ext/unicorn_http/unicorn_http.rl +12 -1
- data/ext/unicorn_http/unicorn_http_common.rl +1 -1
- data/lib/unicorn/app/exec_cgi.rb +25 -22
- data/lib/unicorn/configurator.rb +17 -11
- data/lib/unicorn/const.rb +2 -2
- data/lib/unicorn/http_response.rb +1 -1
- data/lib/unicorn/http_server.rb +0 -1
- data/lib/unicorn/socket_helper.rb +33 -19
- data/lib/unicorn/tee_input.rb +1 -1
- data/script/isolate_for_tests +1 -1
- data/t/bin/unused_listen +2 -15
- data/test/exec/test_exec.rb +1 -2
- data/test/rails/test_rails.rb +1 -1
- data/test/test_helper.rb +3 -16
- data/test/unit/test_configurator.rb +8 -0
- data/test/unit/test_http_parser.rb +294 -130
- data/test/unit/test_http_parser_ng.rb +147 -126
- data/test/unit/test_request.rb +3 -3
- data/test/unit/test_response.rb +0 -12
- data/test/unit/test_server.rb +4 -7
- data/test/unit/test_tee_input.rb +25 -21
- data/test/unit/test_upload.rb +10 -2
- data/unicorn.gemspec +2 -2
- metadata +12 -12
@@ -97,16 +97,17 @@ class HttpParserNgTest < Test::Unit::TestCase
|
|
97
97
|
end
|
98
98
|
|
99
99
|
def test_identity_byte_headers
|
100
|
-
req =
|
100
|
+
req = @parser.env
|
101
101
|
str = "PUT / HTTP/1.1\r\n"
|
102
102
|
str << "Content-Length: 123\r\n"
|
103
103
|
str << "\r"
|
104
|
-
hdr =
|
104
|
+
hdr = @parser.buf
|
105
105
|
str.each_byte { |byte|
|
106
|
-
|
106
|
+
hdr << byte.chr
|
107
|
+
assert_nil @parser.parse
|
107
108
|
}
|
108
109
|
hdr << "\n"
|
109
|
-
assert_equal req.object_id, @parser.
|
110
|
+
assert_equal req.object_id, @parser.parse.object_id
|
110
111
|
assert_equal '123', req['CONTENT_LENGTH']
|
111
112
|
assert_equal 0, hdr.size
|
112
113
|
assert ! @parser.keepalive?
|
@@ -121,13 +122,14 @@ class HttpParserNgTest < Test::Unit::TestCase
|
|
121
122
|
end
|
122
123
|
|
123
124
|
def test_identity_step_headers
|
124
|
-
req =
|
125
|
-
str =
|
126
|
-
|
125
|
+
req = @parser.env
|
126
|
+
str = @parser.buf
|
127
|
+
str << "PUT / HTTP/1.1\r\n"
|
128
|
+
assert ! @parser.parse
|
127
129
|
str << "Content-Length: 123\r\n"
|
128
|
-
assert ! @parser.
|
130
|
+
assert ! @parser.parse
|
129
131
|
str << "\r\n"
|
130
|
-
assert_equal req.object_id, @parser.
|
132
|
+
assert_equal req.object_id, @parser.parse.object_id
|
131
133
|
assert_equal '123', req['CONTENT_LENGTH']
|
132
134
|
assert_equal 0, str.size
|
133
135
|
assert ! @parser.keepalive?
|
@@ -141,9 +143,10 @@ class HttpParserNgTest < Test::Unit::TestCase
|
|
141
143
|
end
|
142
144
|
|
143
145
|
def test_identity_oneshot_header
|
144
|
-
req =
|
145
|
-
str =
|
146
|
-
|
146
|
+
req = @parser.env
|
147
|
+
str = @parser.buf
|
148
|
+
str << "PUT / HTTP/1.1\r\nContent-Length: 123\r\n\r\n"
|
149
|
+
assert_equal req.object_id, @parser.parse.object_id
|
147
150
|
assert_equal '123', req['CONTENT_LENGTH']
|
148
151
|
assert_equal 0, str.size
|
149
152
|
assert ! @parser.keepalive?
|
@@ -157,11 +160,12 @@ class HttpParserNgTest < Test::Unit::TestCase
|
|
157
160
|
|
158
161
|
def test_identity_oneshot_header_with_body
|
159
162
|
body = ('a' * 123).freeze
|
160
|
-
req =
|
161
|
-
str =
|
162
|
-
|
163
|
-
|
164
|
-
|
163
|
+
req = @parser.env
|
164
|
+
str = @parser.buf
|
165
|
+
str << "PUT / HTTP/1.1\r\n" \
|
166
|
+
"Content-Length: #{body.length}\r\n" \
|
167
|
+
"\r\n#{body}"
|
168
|
+
assert_equal req.object_id, @parser.parse.object_id
|
165
169
|
assert_equal '123', req['CONTENT_LENGTH']
|
166
170
|
assert_equal 123, str.size
|
167
171
|
assert_equal body, str
|
@@ -174,8 +178,9 @@ class HttpParserNgTest < Test::Unit::TestCase
|
|
174
178
|
end
|
175
179
|
|
176
180
|
def test_identity_oneshot_header_with_body_partial
|
177
|
-
str =
|
178
|
-
|
181
|
+
str = @parser.buf
|
182
|
+
str << "PUT / HTTP/1.1\r\nContent-Length: 123\r\n\r\na"
|
183
|
+
assert_equal Hash, @parser.parse.class
|
179
184
|
assert_equal 1, str.size
|
180
185
|
assert_equal 'a', str
|
181
186
|
tmp = ''
|
@@ -192,8 +197,9 @@ class HttpParserNgTest < Test::Unit::TestCase
|
|
192
197
|
end
|
193
198
|
|
194
199
|
def test_identity_oneshot_header_with_body_slop
|
195
|
-
str =
|
196
|
-
|
200
|
+
str = @parser.buf
|
201
|
+
str << "PUT / HTTP/1.1\r\nContent-Length: 1\r\n\r\naG"
|
202
|
+
assert_equal Hash, @parser.parse.class
|
197
203
|
assert_equal 2, str.size
|
198
204
|
assert_equal 'aG', str
|
199
205
|
tmp = ''
|
@@ -206,92 +212,96 @@ class HttpParserNgTest < Test::Unit::TestCase
|
|
206
212
|
end
|
207
213
|
|
208
214
|
def test_chunked
|
209
|
-
str =
|
210
|
-
req =
|
211
|
-
|
215
|
+
str = @parser.buf
|
216
|
+
req = @parser.env
|
217
|
+
str << "PUT / HTTP/1.1\r\ntransfer-Encoding: chunked\r\n\r\n"
|
218
|
+
assert_equal req, @parser.parse, "msg=#{str}"
|
212
219
|
assert_equal 0, str.size
|
213
220
|
tmp = ""
|
214
|
-
assert_nil @parser.filter_body(tmp, "6")
|
221
|
+
assert_nil @parser.filter_body(tmp, str << "6")
|
215
222
|
assert_equal 0, tmp.size
|
216
|
-
assert_nil @parser.filter_body(tmp,
|
217
|
-
assert_equal 0,
|
223
|
+
assert_nil @parser.filter_body(tmp, str << "\r\n")
|
224
|
+
assert_equal 0, str.size
|
218
225
|
assert_equal 0, tmp.size
|
219
226
|
tmp = ""
|
220
|
-
assert_nil @parser.filter_body(tmp, "..")
|
227
|
+
assert_nil @parser.filter_body(tmp, str << "..")
|
221
228
|
assert_equal "..", tmp
|
222
|
-
assert_nil @parser.filter_body(tmp, "abcd\r\n0\r\n")
|
229
|
+
assert_nil @parser.filter_body(tmp, str << "abcd\r\n0\r\n")
|
223
230
|
assert_equal "abcd", tmp
|
224
|
-
|
225
|
-
assert_equal
|
226
|
-
assert_equal "PUT", rv
|
231
|
+
assert_equal str.object_id, @parser.filter_body(tmp, str << "PUT").object_id
|
232
|
+
assert_equal "PUT", str
|
227
233
|
assert ! @parser.keepalive?
|
228
|
-
|
229
|
-
assert_equal req, @parser.
|
234
|
+
str << "TY: FOO\r\n\r\n"
|
235
|
+
assert_equal req, @parser.parse
|
230
236
|
assert_equal "FOO", req["HTTP_PUTTY"]
|
231
237
|
assert @parser.keepalive?
|
232
238
|
end
|
233
239
|
|
234
240
|
def test_two_chunks
|
235
|
-
str =
|
236
|
-
|
237
|
-
|
241
|
+
str = @parser.buf
|
242
|
+
str << "PUT / HTTP/1.1\r\ntransfer-Encoding: chunked\r\n\r\n"
|
243
|
+
req = @parser.env
|
244
|
+
assert_equal req, @parser.parse
|
238
245
|
assert_equal 0, str.size
|
239
246
|
tmp = ""
|
240
|
-
assert_nil @parser.filter_body(tmp, "6")
|
247
|
+
assert_nil @parser.filter_body(tmp, str << "6")
|
241
248
|
assert_equal 0, tmp.size
|
242
|
-
assert_nil @parser.filter_body(tmp,
|
243
|
-
assert_equal "",
|
249
|
+
assert_nil @parser.filter_body(tmp, str << "\r\n")
|
250
|
+
assert_equal "", str
|
244
251
|
assert_equal 0, tmp.size
|
245
252
|
tmp = ""
|
246
|
-
assert_nil @parser.filter_body(tmp, "..")
|
253
|
+
assert_nil @parser.filter_body(tmp, str << "..")
|
247
254
|
assert_equal 2, tmp.size
|
248
255
|
assert_equal "..", tmp
|
249
|
-
assert_nil @parser.filter_body(tmp, "abcd\r\n1")
|
256
|
+
assert_nil @parser.filter_body(tmp, str << "abcd\r\n1")
|
250
257
|
assert_equal "abcd", tmp
|
251
|
-
assert_nil @parser.filter_body(tmp, "\r")
|
258
|
+
assert_nil @parser.filter_body(tmp, str << "\r")
|
252
259
|
assert_equal "", tmp
|
253
|
-
assert_nil @parser.filter_body(tmp, "\n")
|
260
|
+
assert_nil @parser.filter_body(tmp, str << "\n")
|
254
261
|
assert_equal "", tmp
|
255
|
-
assert_nil @parser.filter_body(tmp, "z")
|
262
|
+
assert_nil @parser.filter_body(tmp, str << "z")
|
256
263
|
assert_equal "z", tmp
|
257
|
-
assert_nil @parser.filter_body(tmp, "\r\n")
|
258
|
-
assert_nil @parser.filter_body(tmp, "0")
|
259
|
-
assert_nil @parser.filter_body(tmp, "\r")
|
260
|
-
rv = @parser.filter_body(tmp,
|
264
|
+
assert_nil @parser.filter_body(tmp, str << "\r\n")
|
265
|
+
assert_nil @parser.filter_body(tmp, str << "0")
|
266
|
+
assert_nil @parser.filter_body(tmp, str << "\r")
|
267
|
+
rv = @parser.filter_body(tmp, str << "\nGET")
|
261
268
|
assert_equal "GET", rv
|
262
|
-
assert_equal
|
269
|
+
assert_equal str.object_id, rv.object_id
|
263
270
|
assert ! @parser.keepalive?
|
264
271
|
end
|
265
272
|
|
266
273
|
def test_big_chunk
|
267
|
-
str =
|
268
|
-
|
269
|
-
|
270
|
-
|
274
|
+
str = @parser.buf
|
275
|
+
str << "PUT / HTTP/1.1\r\ntransfer-Encoding: chunked\r\n\r\n" \
|
276
|
+
"4000\r\nabcd"
|
277
|
+
req = @parser.env
|
278
|
+
assert_equal req, @parser.parse
|
271
279
|
tmp = ''
|
272
280
|
assert_nil @parser.filter_body(tmp, str)
|
273
281
|
assert_equal '', str
|
274
|
-
str
|
282
|
+
str << ' ' * 16300
|
275
283
|
assert_nil @parser.filter_body(tmp, str)
|
276
284
|
assert_equal '', str
|
277
|
-
str
|
285
|
+
str << ' ' * 80
|
278
286
|
assert_nil @parser.filter_body(tmp, str)
|
279
287
|
assert_equal '', str
|
280
288
|
assert ! @parser.body_eof?
|
281
|
-
assert_equal "", @parser.filter_body(tmp, "\r\n0\r\n")
|
289
|
+
assert_equal "", @parser.filter_body(tmp, str << "\r\n0\r\n")
|
282
290
|
assert_equal "", tmp
|
283
291
|
assert @parser.body_eof?
|
284
|
-
|
285
|
-
assert_equal
|
292
|
+
str << "\r\n"
|
293
|
+
assert_equal req, @parser.parse
|
294
|
+
assert_equal "", str
|
286
295
|
assert @parser.body_eof?
|
287
296
|
assert @parser.keepalive?
|
288
297
|
end
|
289
298
|
|
290
299
|
def test_two_chunks_oneshot
|
291
|
-
str =
|
292
|
-
|
293
|
-
|
294
|
-
|
300
|
+
str = @parser.buf
|
301
|
+
req = @parser.env
|
302
|
+
str << "PUT / HTTP/1.1\r\ntransfer-Encoding: chunked\r\n\r\n" \
|
303
|
+
"1\r\na\r\n2\r\n..\r\n0\r\n"
|
304
|
+
assert_equal req, @parser.parse
|
295
305
|
tmp = ''
|
296
306
|
assert_nil @parser.filter_body(tmp, str)
|
297
307
|
assert_equal 'a..', tmp
|
@@ -302,31 +312,33 @@ class HttpParserNgTest < Test::Unit::TestCase
|
|
302
312
|
|
303
313
|
def test_chunks_bytewise
|
304
314
|
chunked = "10\r\nabcdefghijklmnop\r\n11\r\n0123456789abcdefg\r\n0\r\n"
|
305
|
-
str = "PUT / HTTP/1.1\r\ntransfer-Encoding: chunked\r\n\r\n
|
306
|
-
|
307
|
-
|
308
|
-
|
315
|
+
str = "PUT / HTTP/1.1\r\ntransfer-Encoding: chunked\r\n\r\n"
|
316
|
+
buf = @parser.buf
|
317
|
+
buf << str
|
318
|
+
req = @parser.env
|
319
|
+
assert_equal req, @parser.parse
|
320
|
+
assert_equal "", buf
|
309
321
|
tmp = ''
|
310
|
-
buf = ''
|
311
322
|
body = ''
|
312
|
-
str =
|
323
|
+
str = chunked[0..-2]
|
313
324
|
str.each_byte { |byte|
|
314
325
|
assert_nil @parser.filter_body(tmp, buf << byte.chr)
|
315
326
|
body << tmp
|
316
327
|
}
|
317
328
|
assert_equal 'abcdefghijklmnop0123456789abcdefg', body
|
318
|
-
rv = @parser.filter_body(tmp, buf
|
329
|
+
rv = @parser.filter_body(tmp, buf<< "\n")
|
319
330
|
assert_equal rv.object_id, buf.object_id
|
320
331
|
assert ! @parser.keepalive?
|
321
332
|
end
|
322
333
|
|
323
334
|
def test_trailers
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
335
|
+
req = @parser.env
|
336
|
+
str = @parser.buf
|
337
|
+
str << "PUT / HTTP/1.1\r\n" \
|
338
|
+
"Trailer: Content-MD5\r\n" \
|
339
|
+
"transfer-Encoding: chunked\r\n\r\n" \
|
340
|
+
"1\r\na\r\n2\r\n..\r\n0\r\n"
|
341
|
+
assert_equal req, @parser.parse
|
330
342
|
assert_equal 'Content-MD5', req['HTTP_TRAILER']
|
331
343
|
assert_nil req['HTTP_CONTENT_MD5']
|
332
344
|
tmp = ''
|
@@ -341,19 +353,22 @@ class HttpParserNgTest < Test::Unit::TestCase
|
|
341
353
|
assert_nil @parser.trailers(req, str)
|
342
354
|
assert_equal md5_b64, req['HTTP_CONTENT_MD5']
|
343
355
|
assert_equal "CONTENT_MD5: #{md5_b64}\r\n", str
|
344
|
-
|
345
|
-
|
356
|
+
str << "\r"
|
357
|
+
assert_nil @parser.parse
|
358
|
+
str << "\nGET / "
|
359
|
+
assert_equal req, @parser.parse
|
346
360
|
assert_equal "GET / ", str
|
347
361
|
assert @parser.keepalive?
|
348
362
|
end
|
349
363
|
|
350
364
|
def test_trailers_slowly
|
351
|
-
str =
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
365
|
+
str = @parser.buf
|
366
|
+
str << "PUT / HTTP/1.1\r\n" \
|
367
|
+
"Trailer: Content-MD5\r\n" \
|
368
|
+
"transfer-Encoding: chunked\r\n\r\n" \
|
369
|
+
"1\r\na\r\n2\r\n..\r\n0\r\n"
|
370
|
+
req = @parser.env
|
371
|
+
assert_equal req, @parser.parse
|
357
372
|
assert_equal 'Content-MD5', req['HTTP_TRAILER']
|
358
373
|
assert_nil req['HTTP_CONTENT_MD5']
|
359
374
|
tmp = ''
|
@@ -371,16 +386,19 @@ class HttpParserNgTest < Test::Unit::TestCase
|
|
371
386
|
}
|
372
387
|
assert_equal md5_b64, req['HTTP_CONTENT_MD5']
|
373
388
|
assert_equal "CONTENT_MD5: #{md5_b64}\r\n", str
|
374
|
-
|
375
|
-
|
389
|
+
str << "\r"
|
390
|
+
assert_nil @parser.parse
|
391
|
+
str << "\n"
|
392
|
+
assert_equal req, @parser.parse
|
376
393
|
end
|
377
394
|
|
378
395
|
def test_max_chunk
|
379
|
-
str =
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
396
|
+
str = @parser.buf
|
397
|
+
str << "PUT / HTTP/1.1\r\n" \
|
398
|
+
"transfer-Encoding: chunked\r\n\r\n" \
|
399
|
+
"#{HttpParser::CHUNK_MAX.to_s(16)}\r\na\r\n2\r\n..\r\n0\r\n"
|
400
|
+
req = @parser.env
|
401
|
+
assert_equal req, @parser.parse
|
384
402
|
assert_nil @parser.content_length
|
385
403
|
assert_nothing_raised { @parser.filter_body('', str) }
|
386
404
|
assert ! @parser.keepalive?
|
@@ -388,59 +406,61 @@ class HttpParserNgTest < Test::Unit::TestCase
|
|
388
406
|
|
389
407
|
def test_max_body
|
390
408
|
n = HttpParser::LENGTH_MAX
|
391
|
-
|
392
|
-
req =
|
393
|
-
assert_nothing_raised { @parser.headers(req,
|
409
|
+
@parser.buf << "PUT / HTTP/1.1\r\nContent-Length: #{n}\r\n\r\n"
|
410
|
+
req = @parser.env
|
411
|
+
assert_nothing_raised { @parser.headers(req, @parser.buf) }
|
394
412
|
assert_equal n, req['CONTENT_LENGTH'].to_i
|
395
413
|
assert ! @parser.keepalive?
|
396
414
|
end
|
397
415
|
|
398
416
|
def test_overflow_chunk
|
399
417
|
n = HttpParser::CHUNK_MAX + 1
|
400
|
-
str =
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
418
|
+
str = @parser.buf
|
419
|
+
req = @parser.env
|
420
|
+
str << "PUT / HTTP/1.1\r\n" \
|
421
|
+
"transfer-Encoding: chunked\r\n\r\n" \
|
422
|
+
"#{n.to_s(16)}\r\na\r\n2\r\n..\r\n0\r\n"
|
423
|
+
assert_equal req, @parser.parse
|
405
424
|
assert_nil @parser.content_length
|
406
425
|
assert_raise(HttpParserError) { @parser.filter_body('', str) }
|
407
426
|
end
|
408
427
|
|
409
428
|
def test_overflow_content_length
|
410
429
|
n = HttpParser::LENGTH_MAX + 1
|
411
|
-
|
412
|
-
assert_raise(HttpParserError) { @parser.
|
430
|
+
@parser.buf << "PUT / HTTP/1.1\r\nContent-Length: #{n}\r\n\r\n"
|
431
|
+
assert_raise(HttpParserError) { @parser.parse }
|
413
432
|
end
|
414
433
|
|
415
434
|
def test_bad_chunk
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
req =
|
420
|
-
assert_equal req, @parser.
|
435
|
+
@parser.buf << "PUT / HTTP/1.1\r\n" \
|
436
|
+
"transfer-Encoding: chunked\r\n\r\n" \
|
437
|
+
"#zzz\r\na\r\n2\r\n..\r\n0\r\n"
|
438
|
+
req = @parser.env
|
439
|
+
assert_equal req, @parser.parse
|
421
440
|
assert_nil @parser.content_length
|
422
|
-
assert_raise(HttpParserError) { @parser.filter_body(
|
441
|
+
assert_raise(HttpParserError) { @parser.filter_body("", @parser.buf) }
|
423
442
|
end
|
424
443
|
|
425
444
|
def test_bad_content_length
|
426
|
-
|
427
|
-
assert_raise(HttpParserError) { @parser.
|
445
|
+
@parser.buf << "PUT / HTTP/1.1\r\nContent-Length: 7ff\r\n\r\n"
|
446
|
+
assert_raise(HttpParserError) { @parser.parse }
|
428
447
|
end
|
429
448
|
|
430
449
|
def test_bad_trailers
|
431
|
-
str =
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
|
436
|
-
|
450
|
+
str = @parser.buf
|
451
|
+
req = @parser.env
|
452
|
+
str << "PUT / HTTP/1.1\r\n" \
|
453
|
+
"Trailer: Transfer-Encoding\r\n" \
|
454
|
+
"transfer-Encoding: chunked\r\n\r\n" \
|
455
|
+
"1\r\na\r\n2\r\n..\r\n0\r\n"
|
456
|
+
assert_equal req, @parser.parse
|
437
457
|
assert_equal 'Transfer-Encoding', req['HTTP_TRAILER']
|
438
458
|
tmp = ''
|
439
459
|
assert_nil @parser.filter_body(tmp, str)
|
440
460
|
assert_equal 'a..', tmp
|
441
461
|
assert_equal '', str
|
442
462
|
str << "Transfer-Encoding: identity\r\n\r\n"
|
443
|
-
assert_raise(HttpParserError) { @parser.
|
463
|
+
assert_raise(HttpParserError) { @parser.parse }
|
444
464
|
end
|
445
465
|
|
446
466
|
def test_repeat_headers
|
@@ -449,18 +469,19 @@ class HttpParserNgTest < Test::Unit::TestCase
|
|
449
469
|
"Trailer: Content-SHA1\r\n" \
|
450
470
|
"transfer-Encoding: chunked\r\n\r\n" \
|
451
471
|
"1\r\na\r\n2\r\n..\r\n0\r\n"
|
452
|
-
req =
|
453
|
-
|
472
|
+
req = @parser.env
|
473
|
+
@parser.buf << str
|
474
|
+
assert_equal req, @parser.parse
|
454
475
|
assert_equal 'Content-MD5,Content-SHA1', req['HTTP_TRAILER']
|
455
476
|
assert ! @parser.keepalive?
|
456
477
|
end
|
457
478
|
|
458
479
|
def test_parse_simple_request
|
459
480
|
parser = HttpParser.new
|
460
|
-
req =
|
461
|
-
|
462
|
-
assert_equal req, parser.
|
463
|
-
assert_equal '',
|
481
|
+
req = parser.env
|
482
|
+
parser.buf << "GET /read-rfc1945-if-you-dont-believe-me\r\n"
|
483
|
+
assert_equal req, parser.parse
|
484
|
+
assert_equal '', parser.buf
|
464
485
|
expect = {
|
465
486
|
"SERVER_NAME"=>"localhost",
|
466
487
|
"rack.url_scheme"=>"http",
|
@@ -556,10 +577,10 @@ class HttpParserNgTest < Test::Unit::TestCase
|
|
556
577
|
end
|
557
578
|
|
558
579
|
def test_ignore_version_header
|
559
|
-
|
560
|
-
req =
|
561
|
-
assert_equal req, @parser.
|
562
|
-
assert_equal '',
|
580
|
+
@parser.buf << "GET / HTTP/1.1\r\nVersion: hello\r\n\r\n"
|
581
|
+
req = @parser.env
|
582
|
+
assert_equal req, @parser.parse
|
583
|
+
assert_equal '', @parser.buf
|
563
584
|
expect = {
|
564
585
|
"SERVER_NAME" => "localhost",
|
565
586
|
"rack.url_scheme" => "http",
|