http 4.4.0 → 4.4.1

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
  SHA256:
3
- metadata.gz: c303ff626f5b57ed080d5d64d3ba7fd0a9eed5bc9463ff1035b1386dad36a9ab
4
- data.tar.gz: 3bc824e2ab723de39556166ec821d8c9a3f14dc5bc8dd542e4ccadf916a2518a
3
+ metadata.gz: cce9a8685f3b60f994e77174f79c2306f607d62016bf64b74fcebc4f86377ec0
4
+ data.tar.gz: 353702b62a1b9d3b2ea86ac5ac3ad88e9efa734c77e180128fa06c6c301895d3
5
5
  SHA512:
6
- metadata.gz: 9e78a6c25816e48f36394d3e4d612d94b47eb45787ca74a1fd5f49372c3df1037e535a401392a3318bfcc7194a1afee361794aadab853ae420054f00015101d0
7
- data.tar.gz: 9e1656f514777d0c5c149b273d9276b3c2affb93363c3cbc74a20c1a7fed039148564adad891459eac012415d4d1dee98238bcf3e6a0f3e978fa4263afa4925b
6
+ metadata.gz: 84ddc4cf98e603d175a9ecb8db03abd32187888070abd96a437c4121750ac2b86b6cada5d00d527b398ff4a403c2b6448d45bed61c45dbd3be8658f4ad38b121
7
+ data.tar.gz: 750edced9ae715483d750f0b18777f84a4ee24848ec761c67d2c5b89d00ebbc99fbc1e02932d3d30a33eaea43e1d081ba97bcacaf2231f6693e50d218ee24e87
data/CHANGES.md CHANGED
@@ -1,3 +1,9 @@
1
+ ## 4.4.1 (2020-03-29)
2
+
3
+ * Backport [#590](https://github.com/httprb/http/pull/590)
4
+ Fix parser failing on some edge cases.
5
+ ([@ixti])
6
+
1
7
  ## 4.4.0 (2020-03-25)
2
8
 
3
9
  * Backport [#587](https://github.com/httprb/http/pull/587)
@@ -49,14 +49,17 @@ module HTTP
49
49
  #
50
50
 
51
51
  def on_header_field(_response, field)
52
- @field = field
52
+ append_header if @reading_header_value
53
+ @field << field
53
54
  end
54
55
 
55
56
  def on_header_value(_response, value)
56
- @headers.add(@field, value) if @field
57
+ @reading_header_value = true
58
+ @field_value << value
57
59
  end
58
60
 
59
61
  def on_headers_complete(_reposse)
62
+ append_header if @reading_header_value
60
63
  @finished[:headers] = true
61
64
  end
62
65
 
@@ -89,15 +92,26 @@ module HTTP
89
92
  def reset
90
93
  @state.reset!
91
94
 
92
- @finished = Hash.new(false)
93
- @headers = HTTP::Headers.new
94
- @field = nil
95
- @chunk = nil
95
+ @finished = Hash.new(false)
96
+ @headers = HTTP::Headers.new
97
+ @reading_header_value = false
98
+ @field = +""
99
+ @field_value = +""
100
+ @chunk = nil
96
101
  end
97
102
 
98
103
  def finished?
99
104
  @finished[:message]
100
105
  end
106
+
107
+ private
108
+
109
+ def append_header
110
+ @headers.add(@field, @field_value)
111
+ @reading_header_value = false
112
+ @field_value = +""
113
+ @field = +""
114
+ end
101
115
  end
102
116
  end
103
117
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module HTTP
4
- VERSION = "4.4.0"
4
+ VERSION = "4.4.1"
5
5
  end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe HTTP::Response::Parser do
4
+ subject(:parser) { described_class.new }
5
+ let(:raw_response) do
6
+ "HTTP/1.1 200 OK\r\nContent-Length: 2\r\nContent-Type: application/json\r\nMy-Header: val\r\nEmpty-Header: \r\n\r\n{}"
7
+ end
8
+ let(:expected_headers) do
9
+ {
10
+ "Content-Length" => "2",
11
+ "Content-Type" => "application/json",
12
+ "My-Header" => "val",
13
+ "Empty-Header" => ""
14
+ }
15
+ end
16
+ let(:expected_body) { "{}" }
17
+
18
+ before do
19
+ parts.each { |part| subject.add(part) }
20
+ end
21
+
22
+ context "whole response in one part" do
23
+ let(:parts) { [raw_response] }
24
+
25
+ it "parses headers" do
26
+ expect(subject.headers.to_h).to eq(expected_headers)
27
+ end
28
+
29
+ it "parses body" do
30
+ expect(subject.read(expected_body.size)).to eq(expected_body)
31
+ end
32
+ end
33
+
34
+ context "response in many parts" do
35
+ let(:parts) { raw_response.split(//) }
36
+
37
+ it "parses headers" do
38
+ expect(subject.headers.to_h).to eq(expected_headers)
39
+ end
40
+
41
+ it "parses body" do
42
+ expect(subject.read(expected_body.size)).to eq(expected_body)
43
+ end
44
+ end
45
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: http
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.4.0
4
+ version: 4.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tony Arcieri
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2020-03-25 00:00:00.000000000 Z
14
+ date: 2020-03-29 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: addressable
@@ -163,6 +163,7 @@ files:
163
163
  - spec/lib/http/request/writer_spec.rb
164
164
  - spec/lib/http/request_spec.rb
165
165
  - spec/lib/http/response/body_spec.rb
166
+ - spec/lib/http/response/parser_spec.rb
166
167
  - spec/lib/http/response/status_spec.rb
167
168
  - spec/lib/http/response_spec.rb
168
169
  - spec/lib/http/uri_spec.rb
@@ -186,7 +187,7 @@ metadata:
186
187
  source_code_uri: https://github.com/httprb/http
187
188
  wiki_uri: https://github.com/httprb/http/wiki
188
189
  bug_tracker_uri: https://github.com/httprb/http/issues
189
- changelog_uri: https://github.com/httprb/http/blob/v4.4.0/CHANGES.md
190
+ changelog_uri: https://github.com/httprb/http/blob/v4.4.1/CHANGES.md
190
191
  post_install_message:
191
192
  rdoc_options: []
192
193
  require_paths:
@@ -202,8 +203,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
202
203
  - !ruby/object:Gem::Version
203
204
  version: '0'
204
205
  requirements: []
205
- rubyforge_project:
206
- rubygems_version: 2.7.6.2
206
+ rubygems_version: 3.0.3
207
207
  signing_key:
208
208
  specification_version: 4
209
209
  summary: HTTP should be easy
@@ -231,6 +231,7 @@ test_files:
231
231
  - spec/lib/http/request/writer_spec.rb
232
232
  - spec/lib/http/request_spec.rb
233
233
  - spec/lib/http/response/body_spec.rb
234
+ - spec/lib/http/response/parser_spec.rb
234
235
  - spec/lib/http/response/status_spec.rb
235
236
  - spec/lib/http/response_spec.rb
236
237
  - spec/lib/http/uri_spec.rb