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 +4 -4
- data/lib/segregate.rb +36 -5
- data/lib/segregate/version.rb +2 -2
- data/spec/segregate_spec.rb +46 -32
- metadata +3 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3833b2308a42a52d8cb2653791a74c65969e3d41
|
4
|
+
data.tar.gz: fd57d0d27816e1feb03b4fcfee76c45ca5d046aa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d27cdf818ec8f9085253af8fe597ab4cb991a8bedb3f45797dc3323b71cd643a0bceaaa7440dada5f35a6be38ef5146111374c2d29ef29b15bc428718e896b43
|
7
|
+
data.tar.gz: bfb1a25758b85f72afac2723558bbf1a49f1cf8e4dd4b7b93f5d12d06dc32856f22ae7436cd79173d0220c442b26dfe522811c1d8114de77433b03fc79b77497
|
data/lib/segregate.rb
CHANGED
@@ -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 <<
|
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" % (
|
131
|
-
raw_message <<
|
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
|
-
|
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
|
-
|
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
|
data/lib/segregate/version.rb
CHANGED
data/spec/segregate_spec.rb
CHANGED
@@ -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
|
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
|
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
|
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 "
|
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 "
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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\
|
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\
|
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
|
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
|
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.
|
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:
|
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.
|
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:
|