protocol-http1 0.10.3 → 0.11.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.

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