unicorn 3.3.1 → 3.4.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.
@@ -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",