protocol-http1 0.10.3 → 0.11.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of protocol-http1 might be problematic. Click here for more details.

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6860775fdc28f8e8d173ff80296cefa5c5e1505e70ce264876959fb453beab5a
4
- data.tar.gz: 9985d69a3696bc98c2e01b78d29282220c9b90b968d0030d60ed95b26a3bab14
3
+ metadata.gz: dd207477ff1c6e86ccc2a90b3ec7ae27c7a3f5dbfd58e42cf78fb841638d43c1
4
+ data.tar.gz: 797536146daeb57ce4b40cf4e71bbcea02cc49067ecdd05d1c1b9c55f768212d
5
5
  SHA512:
6
- metadata.gz: 33093bb74d0b00b2a3dfded4432c66276ff27d6fe4e1137b4f0b867b51ca5aa1add02512b3f9427b2520be1617bf3e2c039ed497c192a686cc237bb4a65f690f
7
- data.tar.gz: c845bf16f06d9798553a6241ffd3fae1692584bf6ff276437e1ab7828773200716b86be3b15a5808956ac74389852a2772c81b29fdbb6599a6da1bfe1a8bb9ee
6
+ metadata.gz: 0efd8f411bc383b88694116c674376acd8d9fd9871aa4d3a89bfa95a39b0124aa2577c1c3767a11eed91f310bb0581f07c8f80b20ab2a79033db534028b346ce
7
+ data.tar.gz: 4e1836661c69a4dbe0cc42ac961afd76153e07f5a41f83428a8d37673924a05cbc9795daa1cc14f530bb38815cee374b61e2dbe105e6df21fafade35a103d6e2
@@ -2,9 +2,10 @@ language: ruby
2
2
  dist: xenial
3
3
  cache: bundler
4
4
 
5
+ script: bundle exec rspec
6
+
5
7
  matrix:
6
8
  include:
7
- - rvm: 2.4
8
9
  - rvm: 2.5
9
10
  - rvm: 2.6
10
11
  - rvm: 2.7
@@ -26,11 +26,15 @@ module Protocol
26
26
  module HTTP1
27
27
  module Body
28
28
  class Chunked < HTTP::Body::Readable
29
- # TODO maybe this should take a stream rather than a connection?
30
- def initialize(stream)
29
+ TRAILERS = 'trailers'
30
+ CRLF = "\r\n"
31
+
32
+ def initialize(stream, headers)
31
33
  @stream = stream
32
34
  @finished = false
33
35
 
36
+ @headers = headers
37
+
34
38
  @length = 0
35
39
  @count = 0
36
40
  end
@@ -49,6 +53,7 @@ module Protocol
49
53
  super
50
54
  end
51
55
 
56
+ # Follows the procedure outlined in https://tools.ietf.org/html/rfc7230#section-4.1.3
52
57
  def read
53
58
  return nil if @finished
54
59
 
@@ -56,13 +61,17 @@ module Protocol
56
61
 
57
62
  if length == 0
58
63
  @finished = true
59
- read_line
64
+
65
+ read_trailers
60
66
 
61
67
  return nil
62
68
  end
63
69
 
64
- chunk = @stream.read(length)
65
- read_line # Consume the trailing CRLF
70
+ # Read trailing CRLF:
71
+ chunk = @stream.read(length + 2)
72
+
73
+ # ...and chomp it off:
74
+ chunk.chomp!(CRLF)
66
75
 
67
76
  @length += length
68
77
  @count += 1
@@ -77,7 +86,22 @@ module Protocol
77
86
  private
78
87
 
79
88
  def read_line
80
- @stream.gets(chomp: true)
89
+ @stream.gets(CRLF, chomp: true)
90
+ end
91
+
92
+ def read_trailers
93
+ @headers.trailers!
94
+
95
+ while line = read_line
96
+ # Empty line indicates end of headers:
97
+ break if line.empty?
98
+
99
+ if match = line.match(HEADER)
100
+ @headers.add(match[1], match[2])
101
+ else
102
+ raise BadHeader, "Could not parse header: #{line.dump}"
103
+ end
104
+ end
81
105
  end
82
106
  end
83
107
  end
@@ -307,7 +307,7 @@ module Protocol
307
307
  end
308
308
  end
309
309
 
310
- def write_chunked_body(body, head)
310
+ def write_chunked_body(body, head, trailers = nil)
311
311
  @stream.write("transfer-encoding: chunked\r\n\r\n")
312
312
  @stream.flush
313
313
 
@@ -326,7 +326,14 @@ module Protocol
326
326
  @stream.flush
327
327
  end
328
328
 
329
- @stream.write("0\r\n\r\n")
329
+ if trailers
330
+ @stream.write("0\r\n")
331
+ write_headers(trailers)
332
+ @stream.write("\r\n")
333
+ else
334
+ @stream.write("0\r\n\r\n")
335
+ end
336
+
330
337
  @stream.flush
331
338
  end
332
339
 
@@ -349,7 +356,7 @@ module Protocol
349
356
  @stream.close_write
350
357
  end
351
358
 
352
- def write_body(version, body, head = false)
359
+ def write_body(version, body, head = false, trailers = nil)
353
360
  if body.nil? or body.empty?
354
361
  write_connection_header(version)
355
362
  write_empty_body(body)
@@ -359,7 +366,7 @@ module Protocol
359
366
  elsif @persistent and version == HTTP11
360
367
  write_connection_header(version)
361
368
  # We specifically ensure that non-persistent connections do not use chunked response, so that hijacking works as expected.
362
- write_chunked_body(body, head)
369
+ write_chunked_body(body, head, trailers)
363
370
  else
364
371
  @persistent = false
365
372
  write_connection_header(version)
@@ -367,8 +374,8 @@ module Protocol
367
374
  end
368
375
  end
369
376
 
370
- def read_chunked_body
371
- Body::Chunked.new(@stream)
377
+ def read_chunked_body(headers)
378
+ Body::Chunked.new(@stream, headers)
372
379
  end
373
380
 
374
381
  def read_fixed_body(length)
@@ -466,7 +473,7 @@ module Protocol
466
473
  end
467
474
 
468
475
  if transfer_encoding.last == CHUNKED
469
- return read_chunked_body
476
+ return read_chunked_body(headers)
470
477
  else
471
478
  # If a Transfer-Encoding header field is present in a response and
472
479
  # the chunked transfer coding is not the final encoding, the
@@ -479,7 +486,7 @@ module Protocol
479
486
  return read_remainder_body
480
487
  end
481
488
  end
482
-
489
+
483
490
  # 5. If a valid Content-Length header field is present without
484
491
  # Transfer-Encoding, its decimal value defines the expected message
485
492
  # body length in octets. If the sender closes the connection or
@@ -22,6 +22,6 @@
22
22
 
23
23
  module Protocol
24
24
  module HTTP1
25
- VERSION = "0.10.3"
25
+ VERSION = "0.11.0"
26
26
  end
27
27
  end
@@ -20,11 +20,11 @@ Gem::Specification.new do |spec|
20
20
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
21
21
  spec.require_paths = ["lib"]
22
22
 
23
- spec.add_dependency "protocol-http", "~> 0.15"
23
+ spec.add_dependency "protocol-http", "~> 0.16.3"
24
24
 
25
25
  spec.add_development_dependency "covered"
26
26
  spec.add_development_dependency "bundler"
27
- spec.add_development_dependency "rake", "~> 10.0"
27
+ spec.add_development_dependency "bake-bundler"
28
28
  spec.add_development_dependency "rspec", "~> 3.0"
29
29
  spec.add_development_dependency "rspec-memory", "~> 1.0"
30
30
  spec.add_development_dependency "rspec-files", "~> 1.0"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: protocol-http1
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.3
4
+ version: 0.11.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Williams
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-03-21 00:00:00.000000000 Z
11
+ date: 2020-04-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: protocol-http
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0.15'
19
+ version: 0.16.3
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '0.15'
26
+ version: 0.16.3
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: covered
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -53,19 +53,19 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: rake
56
+ name: bake-bundler
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - "~>"
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: '10.0'
61
+ version: '0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - "~>"
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
- version: '10.0'
68
+ version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rspec
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -121,7 +121,6 @@ files:
121
121
  - ".travis.yml"
122
122
  - Gemfile
123
123
  - README.md
124
- - Rakefile
125
124
  - examples/http1/request.rb
126
125
  - lib/protocol/http1.rb
127
126
  - lib/protocol/http1/body/chunked.rb
data/Rakefile DELETED
@@ -1,8 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "bundler/gem_tasks"
4
- require "rspec/core/rake_task"
5
-
6
- RSpec::Core::RakeTask.new(:spec)
7
-
8
- task :default => :spec