segregate 0.3.4 → 0.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5ce3262155d92f2dfc9d0514d29f2050b2e76d68
4
- data.tar.gz: 21669f16fe1694d92522d9732327ce1073377296
3
+ metadata.gz: 0e0d78f2e3626e434f62af51a9bd25dc6f2f7608
4
+ data.tar.gz: cb81f3d82418ea3d07cebf692418a901ca305969
5
5
  SHA512:
6
- metadata.gz: 76c66988f1b2e8f74531ba4ddd6132d1833d693e1a8cf5247a823ee3011662513a940bc9390c13955a7ec74db5a19d07da48f6a4a77b9b5b1ddc4e11473ed043
7
- data.tar.gz: aeadb91c05e05d14a83ec076b9edf023817b15fe9d8cdd254ddbf075337e6dec7ea613ec9e100cd7a16c1963addf79ecd458b33a34a0b5430c3b34ad09c11494
6
+ metadata.gz: 2586ce6b36f3f33d41923bea19d07b7227b1de6c5fa00e9283e7b5514285ad896457ff36bd57a8d81c590fce74cea1fd0f458e02dcaf0638abf0e47d1661df6e
7
+ data.tar.gz: dc606c644b5d5221c870412a5afee531a1882782d56298a273fb1c8aa5f48124359a818e5a35f5b5707dcf6a97a478d887d5825e31f80c03081411d431108b35
@@ -1,4 +1,4 @@
1
1
  class Segregate
2
- VERSION = "0.3.4".freeze
2
+ VERSION = "0.4.0".freeze
3
3
  DATE = "2014-02-04".freeze
4
4
  end
data/lib/segregate.rb CHANGED
@@ -81,10 +81,10 @@ class Segregate
81
81
 
82
82
  def update_content_length
83
83
  if @body_complete
84
- @headers['content-length'] = @body.length.to_s
84
+ @headers['content-length'] = @body.size.to_s
85
85
  @header_orders.push 'content-length' unless @header_orders.include? 'content-length'
86
- @headers.delete 'content-encoding'
87
- @header_orders.delete 'content-encoding'
86
+ @headers.delete 'transfer-encoding'
87
+ @header_orders.delete 'transfer-encoding'
88
88
  end
89
89
  end
90
90
 
@@ -97,7 +97,7 @@ class Segregate
97
97
  raw_message << "%s: %s\r\n" % [header, headers[header]]
98
98
  end
99
99
 
100
- raw_message << "\r\n" + @body + "\r\n" unless @body.empty?
100
+ raw_message << "\r\n" + @body + "\r\n" if @body_complete
101
101
  raw_message << "\r\n"
102
102
  end
103
103
 
@@ -108,13 +108,13 @@ class Segregate
108
108
  read_headers data unless @headers_complete
109
109
  read_body data unless data.eof?
110
110
 
111
- @callback.on_message_complete self if @callback.respond_to?(:on_message_complete) && @headers_complete && (no_body? || @body_complete)
111
+ @callback.on_message_complete self if @callback.respond_to?(:on_message_complete) && message_complete?
112
112
  end
113
113
 
114
114
  private
115
115
 
116
- def no_body?
117
- (@headers['content-length'].nil? && @headers['content-encoding'].nil?)
116
+ def message_complete?
117
+ @body_complete || (@headers_complete && @headers['content-length'].nil? && @headers['transfer-encoding'].nil?)
118
118
  end
119
119
 
120
120
  def read data, size = nil
@@ -133,6 +133,10 @@ class Segregate
133
133
  parse_request_line line
134
134
  elsif line =~ STATUS_LINE
135
135
  parse_status_line line
136
+ elsif line =~ UNKNOWN_REQUEST_LINE
137
+ raise "ERROR: Unknown http method: %s" % line[/^\S+/]
138
+ else
139
+ raise "ERROR: Unknown first line: %s" % line
136
140
  end
137
141
 
138
142
  @first_line_complete = true
@@ -174,7 +178,7 @@ class Segregate
174
178
  def read_body data
175
179
  if headers.key? 'content-length'
176
180
  parse_body data
177
- elsif headers['content-encoding'] == 'chunked'
181
+ elsif headers['transfer-encoding'] == 'chunked'
178
182
  parse_chunked_data data
179
183
  end
180
184
  end
@@ -187,7 +191,7 @@ class Segregate
187
191
 
188
192
  def parse_chunked_data data
189
193
  while !data.eof? && !@body_complete
190
- chunk_size = read(data).to_i
194
+ chunk_size = read(data).to_i(16)
191
195
  if chunk_size == 0
192
196
  @body_complete = true
193
197
  else
@@ -38,6 +38,14 @@ describe Segregate do
38
38
  it 'accepts one argument' do
39
39
  expect(@parser).to respond_to(:parse).with(1).argument
40
40
  end
41
+
42
+ it 'errors if an incorrect first line is received' do
43
+ expect{ @parser.parse "fail\r\n" }.to raise_error RuntimeError, 'ERROR: Unknown first line: fail'
44
+ end
45
+
46
+ it 'errors if an incorrect http method is received' do
47
+ expect{ @parser.parse "FAIL /endpoint HTTP/1.1\r\n" }.to raise_error RuntimeError, 'ERROR: Unknown http method: FAIL'
48
+ end
41
49
  end
42
50
 
43
51
  context 'a request line has been parsed' do
@@ -175,6 +183,10 @@ describe Segregate do
175
183
  it 'returns the uri methods' do
176
184
  expect(@parser.path).to eq '/endpoint'
177
185
  end
186
+
187
+ it 'raises an error if uri does not respond to the method' do
188
+ expect{ @parser.not_present }.to raise_error NoMethodError, /undefined method `not_present'/
189
+ end
178
190
  end
179
191
 
180
192
  describe '#respond_to?' do
@@ -307,8 +319,7 @@ describe Segregate do
307
319
 
308
320
  context 'a header has been parsed' do
309
321
  before(:each) do
310
- @parser.parse "GET /endpoint HTTP/1.1\r\n"
311
- @parser.parse "Accept: application/json\r\n"
322
+ @parser.parse "GET /endpoint HTTP/1.1\r\nAccept: application/json\r\n"
312
323
  end
313
324
 
314
325
  describe '#headers' do
@@ -331,10 +342,7 @@ describe Segregate do
331
342
 
332
343
  context 'all headers have been parsed' do
333
344
  before(:each) do
334
- @parser.parse "GET /endpoint HTTP/1.1\r\n"
335
- @parser.parse "Accept: application/json\r\n"
336
- @parser.parse "Host: www.google.com\r\n"
337
- @parser.parse "\r\n"
345
+ @parser.parse "GET /endpoint HTTP/1.1\r\nAccept: application/json\r\nHost: www.google.com\r\n\r\n"
338
346
  end
339
347
 
340
348
  describe '#headers' do
@@ -365,10 +373,7 @@ describe Segregate do
365
373
 
366
374
  context 'a body has been parsed' do
367
375
  before(:each) do
368
- @parser.parse "GET /endpoint HTTP/1.1\r\n"
369
- @parser.parse "Host: www.google.com\r\n"
370
- @parser.parse "Content-Length: 20\r\n"
371
- @parser.parse "\r\n"
376
+ @parser.parse "GET /endpoint HTTP/1.1\r\nHost: www.google.com\r\nContent-Length: 20\r\n\r\n"
372
377
  @parser.parse "This is the content!\r\n\r\n"
373
378
  end
374
379
 
@@ -406,11 +411,8 @@ describe Segregate do
406
411
 
407
412
  context 'a partial chunked body has been parsed' do
408
413
  before(:each) do
409
- @parser.parse "GET /endpoint HTTP/1.1\r\n"
410
- @parser.parse "Host: www.google.com\r\n"
411
- @parser.parse "Content-Encoding: chunked\r\n"
412
- @parser.parse "\r\n"
413
- @parser.parse "26\r\nThis is the first content!\r\n"
414
+ @parser.parse "GET /endpoint HTTP/1.1\r\nHost: www.google.com\r\nTransfer-Encoding: chunked\r\n\r\n"
415
+ @parser.parse "1a\r\nThis is the first content!\r\n"
414
416
  end
415
417
 
416
418
  describe '#body' do
@@ -431,8 +433,7 @@ describe Segregate do
431
433
 
432
434
  context 'the body parsing is completed' do
433
435
  before(:each) do
434
- @parser.parse "27\r\nThis is the second content!\r\n"
435
- @parser.parse "0\r\n\r\n"
436
+ @parser.parse "1b\r\nThis is the second content!\r\n0\r\n\r\n"
436
437
  end
437
438
 
438
439
  describe '#body' do
@@ -459,11 +460,11 @@ describe Segregate do
459
460
  describe '#update_content_length' do
460
461
  it 'updates the content lenght header' do
461
462
  expect(@parser.headers['content-length']).to be_nil
462
- expect(@parser.headers['content-encoding']).to eq 'chunked'
463
+ expect(@parser.headers['transfer-encoding']).to eq 'chunked'
463
464
  @parser.body = 'new content'
464
465
  @parser.update_content_length
465
466
  expect(@parser.headers['content-length']).to eq '11'
466
- expect(@parser.headers['content-encoding']).to be_nil
467
+ expect(@parser.headers['transfer-encoding']).to be_nil
467
468
  end
468
469
  end
469
470
 
@@ -506,16 +507,14 @@ describe Segregate do
506
507
  describe 'on_headers_complete' do
507
508
  it 'calls the callback object' do
508
509
  @callback_object.should_receive(:on_headers_complete).with(@parser)
509
- @parser.parse "GET /endpoint HTTP/1.1\r\n"
510
- @parser.parse "Host: www.google.com\r\n\r\n"
510
+ @parser.parse "GET /endpoint HTTP/1.1\r\nHost: www.google.com\r\n\r\n"
511
511
  end
512
512
  end
513
513
 
514
514
  describe 'on_body' do
515
515
  it 'calls the callback object' do
516
516
  @callback_object.should_receive(:on_body).with("TestData")
517
- @parser.parse "GET /endpoint HTTP/1.1\r\n"
518
- @parser.parse "Content-Length: 8\r\n\r\n"
517
+ @parser.parse "GET /endpoint HTTP/1.1\r\nContent-Length: 8\r\n\r\n"
519
518
  @parser.parse "TestData\r\n\r\n"
520
519
  end
521
520
  end
@@ -523,15 +522,13 @@ describe Segregate do
523
522
  describe 'on_message_complete' do
524
523
  it 'calls the callback object with a body' do
525
524
  @callback_object.should_receive(:on_message_complete).with(@parser)
526
- @parser.parse "GET /endpoint HTTP/1.1\r\n"
527
- @parser.parse "Content-Length: 8\r\n\r\n"
525
+ @parser.parse "GET /endpoint HTTP/1.1\r\nContent-Length: 8\r\n\r\n"
528
526
  @parser.parse "TestData\r\n\r\n"
529
527
  end
530
528
 
531
529
  it 'calls the callback object without a body' do
532
530
  @callback_object.should_receive(:on_message_complete).with(@parser)
533
- @parser.parse "GET /endpoint HTTP/1.1\r\n"
534
- @parser.parse "host: www.google.com\r\n\r\n"
531
+ @parser.parse "GET /endpoint HTTP/1.1\r\nhost: www.google.com\r\n\r\n"
535
532
  end
536
533
  end
537
534
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: segregate
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.4
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben Slaughter