segregate 0.5.6 → 0.6.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.
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: