unicorn 3.3.1 → 3.4.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
- assert_nil @parser.headers(req, hdr << byte.chr)
106
+ hdr << byte.chr
107
+ assert_nil @parser.parse
107
108
  }
108
109
  hdr << "\n"
109
- assert_equal req.object_id, @parser.headers(req, hdr).object_id
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 = "PUT / HTTP/1.1\r\n"
126
- assert ! @parser.headers(req, str)
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.headers(req, str)
130
+ assert ! @parser.parse
129
131
  str << "\r\n"
130
- assert_equal req.object_id, @parser.headers(req, str).object_id
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 = "PUT / HTTP/1.1\r\nContent-Length: 123\r\n\r\n"
146
- assert_equal req.object_id, @parser.headers(req, str).object_id
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 = "PUT / HTTP/1.1\r\n" \
162
- "Content-Length: #{body.length}\r\n" \
163
- "\r\n#{body}"
164
- assert_equal req.object_id, @parser.headers(req, str).object_id
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 = "PUT / HTTP/1.1\r\nContent-Length: 123\r\n\r\na"
178
- assert_equal Hash, @parser.headers({}, str).class
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 = "PUT / HTTP/1.1\r\nContent-Length: 1\r\n\r\naG"
196
- assert_equal Hash, @parser.headers({}, str).class
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 = "PUT / HTTP/1.1\r\ntransfer-Encoding: chunked\r\n\r\n"
210
- req = {}
211
- assert_equal req, @parser.headers(req, str)
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, rv = "\r\n")
217
- assert_equal 0, rv.size
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
- rv = "PUT"
225
- assert_equal rv.object_id, @parser.filter_body(tmp, rv).object_id
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
- rv << "TY: FOO\r\n\r\n"
229
- assert_equal req, @parser.trailers(req, rv)
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 = "PUT / HTTP/1.1\r\ntransfer-Encoding: chunked\r\n\r\n"
236
- req = {}
237
- assert_equal req, @parser.headers(req, str)
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, rv = "\r\n")
243
- assert_equal "", rv
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, buf = "\nGET")
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 buf.object_id, rv.object_id
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 = "PUT / HTTP/1.1\r\ntransfer-Encoding: chunked\r\n\r\n" \
268
- "4000\r\nabcd"
269
- req = {}
270
- assert_equal req, @parser.headers(req, str)
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 = ' ' * 16300
282
+ str << ' ' * 16300
275
283
  assert_nil @parser.filter_body(tmp, str)
276
284
  assert_equal '', str
277
- str = ' ' * 80
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
- assert_equal req, @parser.trailers(req, moo = "\r\n")
285
- assert_equal "", moo
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 = "PUT / HTTP/1.1\r\ntransfer-Encoding: chunked\r\n\r\n" \
292
- "1\r\na\r\n2\r\n..\r\n0\r\n"
293
- req = {}
294
- assert_equal req, @parser.headers(req, str)
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#{chunked}"
306
- req = {}
307
- assert_equal req, @parser.headers(req, str)
308
- assert_equal chunked, str
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 = str[0..-2]
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 << "\n")
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
- str = "PUT / HTTP/1.1\r\n" \
325
- "Trailer: Content-MD5\r\n" \
326
- "transfer-Encoding: chunked\r\n\r\n" \
327
- "1\r\na\r\n2\r\n..\r\n0\r\n"
328
- req = {}
329
- assert_equal req, @parser.headers(req, str)
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
- assert_nil @parser.trailers(req, str << "\r")
345
- assert_equal req, @parser.trailers(req, str << "\nGET / ")
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 = "PUT / HTTP/1.1\r\n" \
352
- "Trailer: Content-MD5\r\n" \
353
- "transfer-Encoding: chunked\r\n\r\n" \
354
- "1\r\na\r\n2\r\n..\r\n0\r\n"
355
- req = {}
356
- assert_equal req, @parser.headers(req, str)
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
- assert_nil @parser.trailers(req, str << "\r")
375
- assert_equal req, @parser.trailers(req, str << "\n")
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 = "PUT / HTTP/1.1\r\n" \
380
- "transfer-Encoding: chunked\r\n\r\n" \
381
- "#{HttpParser::CHUNK_MAX.to_s(16)}\r\na\r\n2\r\n..\r\n0\r\n"
382
- req = {}
383
- assert_equal req, @parser.headers(req, str)
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
- str = "PUT / HTTP/1.1\r\nContent-Length: #{n}\r\n\r\n"
392
- req = {}
393
- assert_nothing_raised { @parser.headers(req, str) }
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 = "PUT / HTTP/1.1\r\n" \
401
- "transfer-Encoding: chunked\r\n\r\n" \
402
- "#{n.to_s(16)}\r\na\r\n2\r\n..\r\n0\r\n"
403
- req = {}
404
- assert_equal req, @parser.headers(req, str)
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
- str = "PUT / HTTP/1.1\r\nContent-Length: #{n}\r\n\r\n"
412
- assert_raise(HttpParserError) { @parser.headers({}, str) }
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
- str = "PUT / HTTP/1.1\r\n" \
417
- "transfer-Encoding: chunked\r\n\r\n" \
418
- "#zzz\r\na\r\n2\r\n..\r\n0\r\n"
419
- req = {}
420
- assert_equal req, @parser.headers(req, str)
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('', str) }
441
+ assert_raise(HttpParserError) { @parser.filter_body("", @parser.buf) }
423
442
  end
424
443
 
425
444
  def test_bad_content_length
426
- str = "PUT / HTTP/1.1\r\nContent-Length: 7ff\r\n\r\n"
427
- assert_raise(HttpParserError) { @parser.headers({}, str) }
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 = "PUT / HTTP/1.1\r\n" \
432
- "Trailer: Transfer-Encoding\r\n" \
433
- "transfer-Encoding: chunked\r\n\r\n" \
434
- "1\r\na\r\n2\r\n..\r\n0\r\n"
435
- req = {}
436
- assert_equal req, @parser.headers(req, str)
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.trailers(req, str) }
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
- assert_equal req, @parser.headers(req, str)
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
- http = "GET /read-rfc1945-if-you-dont-believe-me\r\n"
462
- assert_equal req, parser.headers(req, http)
463
- assert_equal '', http
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
- http = "GET / HTTP/1.1\r\nVersion: hello\r\n\r\n"
560
- req = {}
561
- assert_equal req, @parser.headers(req, http)
562
- assert_equal '', http
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",