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 +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:
|