segregate 0.5.6 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0d07a86adbce8db21d2dbd7e56b09fae123a8f8b
4
- data.tar.gz: 0947b2007442a95c5551c576a7bd1a6cbbd4c021
3
+ metadata.gz: 3833b2308a42a52d8cb2653791a74c65969e3d41
4
+ data.tar.gz: fd57d0d27816e1feb03b4fcfee76c45ca5d046aa
5
5
  SHA512:
6
- metadata.gz: 0c1d9a9965dc30280f5de06c98dfe1054b50185e9e195a58d9ef3b79851757539796e0edf1eda41cd14125d77eed1926b14451db4b6302623dd470c5b13ba68d
7
- data.tar.gz: 837f9599d5a0a90438f499f9f8260c625fd06a092da183831a947c3eddf1f24a362c5865c87ae553005be2c6636f1afde2f7a28845c9a1a1098521eeca46874e
6
+ metadata.gz: d27cdf818ec8f9085253af8fe597ab4cb991a8bedb3f45797dc3323b71cd643a0bceaaa7440dada5f35a6be38ef5146111374c2d29ef29b15bc428718e896b43
7
+ data.tar.gz: bfb1a25758b85f72afac2723558bbf1a49f1cf8e4dd4b7b93f5d12d06dc32856f22ae7436cd79173d0220c442b26dfe522811c1d8114de77433b03fc79b77497
@@ -124,15 +124,30 @@ class Segregate
124
124
  end
125
125
 
126
126
  def build_body raw_message
127
+ new_body, size = deflate_if_needed(@body)
127
128
  if @headers['content-length']
128
- raw_message << @body
129
+ raw_message << new_body
130
+ raw_message << "\r\n\r\n"
129
131
  elsif @headers['transfer-encoding'] == 'chunked'
130
- raw_message << "%s\r\n" % (@body.size.to_s(16))
131
- raw_message << @body + "\r\n"
132
+ raw_message << "%s\r\n" % (size.to_s(16))
133
+ raw_message << new_body + "\r\n"
132
134
  raw_message << "0\r\n\r\n"
133
135
  end
134
136
  end
135
137
 
138
+ def deflate_if_needed(body)
139
+ return [body, body.size] unless gzip_encoded_body?
140
+
141
+ str_io = StringIO.new('w')
142
+ w_gz = Zlib::GzipWriter.new(str_io)
143
+ w_gz.write(body)
144
+ w_gz.close
145
+
146
+ # To specify the number of bytes for a gzip string
147
+ # we should check for the buffer size instead of the string size
148
+ [str_io.string, str_io.size]
149
+ end
150
+
136
151
  def parse_data data
137
152
  data = StringIO.new(@stashed_data + data)
138
153
  @stashed_data = ""
@@ -182,7 +197,7 @@ class Segregate
182
197
  elsif line =~ STATUS_LINE
183
198
  parse_status_line line
184
199
  else
185
- debug "Unknown first line: %s" % line
200
+ raise "ERROR: Unknown first line: %s" % line
186
201
  end
187
202
 
188
203
  @state.next
@@ -236,7 +251,9 @@ class Segregate
236
251
  @stashed_body = ""
237
252
 
238
253
  if line.length >= headers['content-length'].to_i
239
- @body = line
254
+ # Removing delimiters characters from the HTTP protocol
255
+ line = line[0..-3]
256
+ @body = inflate_body_if_needed(line)
240
257
  @callback.on_body @body if @callback.respond_to?(:on_body)
241
258
  @state.next
242
259
  else
@@ -244,6 +261,18 @@ class Segregate
244
261
  end
245
262
  end
246
263
 
264
+ def inflate_body_if_needed(body)
265
+ return body unless gzip_encoded_body?
266
+
267
+ gzip_str = StringIO.new(body)
268
+ gzip_body = Zlib::GzipReader.new( gzip_str )
269
+ gzip_body.read()
270
+ end
271
+
272
+ def gzip_encoded_body?
273
+ headers.key?('content-encoding') && headers['content-encoding'].eql?('gzip')
274
+ end
275
+
247
276
  def parse_chunked_data line
248
277
  @chunked_body_state ||= Juncture.new :size, :chunk, default: :size
249
278
 
@@ -270,6 +299,8 @@ class Segregate
270
299
 
271
300
  if line.length >= @chunk_size
272
301
  @body << line
302
+ @original_body = @body
303
+ @body = inflate_body_if_needed(@body)
273
304
  @callback.on_body line if @callback.respond_to?(:on_body)
274
305
  @chunked_body_state.next
275
306
  else
@@ -1,4 +1,4 @@
1
1
  class Segregate
2
- VERSION = "0.5.6".freeze
3
- DATE = "2015-06-02".freeze
2
+ VERSION = "0.6.0".freeze
3
+ DATE = "2016-12-13".freeze
4
4
  end
@@ -23,12 +23,12 @@ describe Segregate do
23
23
  end
24
24
 
25
25
  describe '#parse_data' do
26
- it 'raises an error if an incorret fist line is passed' do
26
+ it 'raises an error if an incorrect fist line is passed' do
27
27
  expect{ @parser.parse_data("NOT A HTTP LINE\r\n") }.to raise_error RuntimeError, 'ERROR: Unknown first line: NOT A HTTP LINE'
28
28
  end
29
29
 
30
30
  it 'raises an error if an incorret request method is passed' do
31
- expect{ @parser.parse_data("FAIL /endpoint HTTP/1.1\r\n") }.to raise_error RuntimeError, 'ERROR: Unknown http method: FAIL'
31
+ expect{ @parser.parse_data("FAIL /endpoint HTTP/1.1\r\n") }.to raise_error RuntimeError, 'ERROR: Unknown first line: FAIL /endpoint HTTP/1.1'
32
32
  end
33
33
 
34
34
  it 'can accept partial first lines' do
@@ -48,17 +48,18 @@ describe Segregate do
48
48
  @parser.parse_data "GET /endpoint HTTP/1.1\r\n"
49
49
  @parser.parse_data "transfer-encoding: chunked\r\n\r\n"
50
50
  @parser.parse_data "9\r\n"
51
- @parser.parse_data "12345\r\n"
51
+ @parser.parse_data "12345"
52
52
  @parser.parse_data "6789\r\n"
53
53
  expect(@parser.body).to eq "123456789"
54
54
  end
55
55
 
56
- it 'can accept partial body' do
56
+ it 'can accept partial body including CRLF' do
57
57
  @parser.parse_data "GET /endpoint HTTP/1.1\r\n"
58
- @parser.parse_data "content-length: 9\r\n\r\n"
58
+ @parser.parse_data "transfer-encoding: chunked\r\n\r\n"
59
+ @parser.parse_data "B\r\n"
59
60
  @parser.parse_data "12345\r\n"
60
61
  @parser.parse_data "6789\r\n"
61
- expect(@parser.body).to eq "123456789"
62
+ expect(@parser.body).to eq "12345\r\n6789"
62
63
  end
63
64
  end
64
65
 
@@ -130,25 +131,25 @@ describe Segregate do
130
131
 
131
132
  describe '#request?' do
132
133
  it 'returns false' do
133
- expect(@parser.request?).to be_false
134
+ expect(@parser.request?).to be false
134
135
  end
135
136
  end
136
137
 
137
138
  describe '#response?' do
138
139
  it 'returns false' do
139
- expect(@parser.response?).to be_false
140
+ expect(@parser.response?).to be false
140
141
  end
141
142
  end
142
143
 
143
144
  describe '#headers_complete?' do
144
145
  it 'returns false' do
145
- expect(@parser.headers_complete?).to be_false
146
+ expect(@parser.headers_complete?).to be false
146
147
  end
147
148
  end
148
149
 
149
150
  describe '#done?' do
150
151
  it 'returns false' do
151
- expect(@parser.done?).to be_false
152
+ expect(@parser.done?).to be false
152
153
  end
153
154
  end
154
155
 
@@ -195,11 +196,11 @@ describe Segregate do
195
196
 
196
197
  describe '#respond_to?' do
197
198
  it 'responds to segregate methods' do
198
- expect(@parser.respond_to?(:request_line)).to be_true
199
+ expect(@parser.respond_to?(:request_line)).to be true
199
200
  end
200
201
 
201
202
  it 'responds to uri methods' do
202
- expect(@parser.respond_to?(:hostname)).to be_true
203
+ expect(@parser.respond_to?(:hostname)).to be true
203
204
  end
204
205
  end
205
206
 
@@ -253,25 +254,25 @@ describe Segregate do
253
254
 
254
255
  describe '#request?' do
255
256
  it 'returns false' do
256
- expect(@parser.request?).to be_true
257
+ expect(@parser.request?).to be true
257
258
  end
258
259
  end
259
260
 
260
261
  describe '#response?' do
261
262
  it 'returns false' do
262
- expect(@parser.response?).to be_false
263
+ expect(@parser.response?).to be false
263
264
  end
264
265
  end
265
266
 
266
267
  describe '#headers_complete?' do
267
268
  it 'returns false' do
268
- expect(@parser.headers_complete?).to be_false
269
+ expect(@parser.headers_complete?).to be false
269
270
  end
270
271
  end
271
272
 
272
273
  describe '#done?' do
273
274
  it 'returns false' do
274
- expect(@parser.done?).to be_false
275
+ expect(@parser.done?).to be false
275
276
  end
276
277
  end
277
278
 
@@ -334,13 +335,13 @@ describe Segregate do
334
335
 
335
336
  describe '#headers_complete?' do
336
337
  it 'returns true' do
337
- expect(@parser.headers_complete?).to be_true
338
+ expect(@parser.headers_complete?).to be true
338
339
  end
339
340
  end
340
341
 
341
342
  describe '#done?' do
342
343
  it 'returns false' do
343
- expect(@parser.done?).to be_false
344
+ expect(@parser.done?).to be false
344
345
  end
345
346
  end
346
347
 
@@ -348,6 +349,7 @@ describe Segregate do
348
349
  before(:each) do
349
350
  @parser.parse_data "1234567890\r\n"
350
351
  end
352
+
351
353
  describe '#state' do
352
354
  it 'is in a done state' do
353
355
  expect(@parser.state.state).to eq :done
@@ -362,7 +364,7 @@ describe Segregate do
362
364
 
363
365
  describe '#done?' do
364
366
  it 'returns true' do
365
- expect(@parser.done?).to be_true
367
+ expect(@parser.done?).to be true
366
368
  end
367
369
  end
368
370
 
@@ -407,6 +409,18 @@ describe Segregate do
407
409
  end
408
410
  end
409
411
  end
412
+
413
+ context 'a body with CRLF has been parsed' do
414
+ before(:each) do
415
+ @parser.parse_data "12\r\n567890\r\n"
416
+ end
417
+
418
+ describe '#body' do
419
+ it 'has the correct data' do
420
+ expect(@parser.body).to eq "12\r\n567890"
421
+ end
422
+ end
423
+ end
410
424
  end
411
425
 
412
426
  context 'non body headers have been parsed' do
@@ -438,13 +452,13 @@ describe Segregate do
438
452
 
439
453
  describe '#headers_complete?' do
440
454
  it 'returns true' do
441
- expect(@parser.headers_complete?).to be_true
455
+ expect(@parser.headers_complete?).to be true
442
456
  end
443
457
  end
444
458
 
445
459
  describe '#done?' do
446
460
  it 'returns true' do
447
- expect(@parser.done?).to be_true
461
+ expect(@parser.done?).to be true
448
462
  end
449
463
  end
450
464
  end
@@ -511,25 +525,25 @@ describe Segregate do
511
525
 
512
526
  describe '#request?' do
513
527
  it 'returns false' do
514
- expect(@parser.request?).to be_false
528
+ expect(@parser.request?).to be false
515
529
  end
516
530
  end
517
531
 
518
532
  describe '#response?' do
519
533
  it 'returns false' do
520
- expect(@parser.response?).to be_true
534
+ expect(@parser.response?).to be true
521
535
  end
522
536
  end
523
537
 
524
538
  describe '#headers_complete?' do
525
539
  it 'returns false' do
526
- expect(@parser.headers_complete?).to be_false
540
+ expect(@parser.headers_complete?).to be false
527
541
  end
528
542
  end
529
543
 
530
544
  describe '#done?' do
531
545
  it 'returns false' do
532
- expect(@parser.done?).to be_false
546
+ expect(@parser.done?).to be false
533
547
  end
534
548
  end
535
549
 
@@ -592,13 +606,13 @@ describe Segregate do
592
606
 
593
607
  describe '#headers_complete?' do
594
608
  it 'returns true' do
595
- expect(@parser.headers_complete?).to be_true
609
+ expect(@parser.headers_complete?).to be true
596
610
  end
597
611
  end
598
612
 
599
613
  describe '#done?' do
600
614
  it 'returns false' do
601
- expect(@parser.done?).to be_false
615
+ expect(@parser.done?).to be false
602
616
  end
603
617
  end
604
618
 
@@ -620,13 +634,13 @@ describe Segregate do
620
634
 
621
635
  describe '#done?' do
622
636
  it 'returns true' do
623
- expect(@parser.done?).to be_true
637
+ expect(@parser.done?).to be true
624
638
  end
625
639
  end
626
640
 
627
641
  describe '#raw_data' do
628
642
  it 'returns the message in string form' do
629
- expect(@parser.raw_data).to eq "HTTP/1.1 200 OK\r\nhost: www.google.com\r\ncontent-length: 9\r\n\r\n123456789\r\n\r\n"
643
+ expect(@parser.raw_data).to eq "HTTP/1.1 200 OK\r\nhost: www.google.com\r\ntransfer-encoding: chunked\r\n\r\n9\r\n123456789\r\n0\r\n\r\n"
630
644
  end
631
645
  end
632
646
 
@@ -661,7 +675,7 @@ describe Segregate do
661
675
  describe '#body=' do
662
676
  it 'updates the body' do
663
677
  @parser.body = 'this is the body'
664
- expect(@parser.raw_data).to eq "HTTP/1.1 200 OK\r\nhost: www.google.com\r\ncontent-length: 16\r\n\r\nthis is the body\r\n\r\n"
678
+ expect(@parser.raw_data).to eq "HTTP/1.1 200 OK\r\nhost: www.google.com\r\ntransfer-encoding: chunked\r\n\r\n10\r\nthis is the body\r\n0\r\n\r\n"
665
679
  end
666
680
  end
667
681
  end
@@ -696,13 +710,13 @@ describe Segregate do
696
710
 
697
711
  describe '#headers_complete?' do
698
712
  it 'returns true' do
699
- expect(@parser.headers_complete?).to be_true
713
+ expect(@parser.headers_complete?).to be true
700
714
  end
701
715
  end
702
716
 
703
717
  describe '#done?' do
704
718
  it 'returns true' do
705
- expect(@parser.done?).to be_true
719
+ expect(@parser.done?).to be true
706
720
  end
707
721
  end
708
722
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: segregate
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.6
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben Slaughter
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-06-02 00:00:00.000000000 Z
11
+ date: 2016-12-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -130,11 +130,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
130
130
  version: '0'
131
131
  requirements: []
132
132
  rubyforge_project:
133
- rubygems_version: 2.2.2
133
+ rubygems_version: 2.5.1
134
134
  signing_key:
135
135
  specification_version: 4
136
136
  summary: Segregate http parser
137
137
  test_files:
138
138
  - spec/segregate_spec.rb
139
139
  - spec/spec_helper.rb
140
- has_rdoc: