Commit e623d67 Piotr Boniecki
committed
1 parent edfa4f1 commit e623d67 Copy full SHA for e623d67
File tree 2 files changed +65
-6
lines changed
2 files changed +65
-6
lines changed Original file line number Diff line number Diff line change @@ -49,14 +49,17 @@ def status_code
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 @@ def on_message_complete(_response)
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
Original file line number Diff line number Diff line change
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 \n Content-Length: 2\r \n Content-Type: application/json\r \n MyHeader: val\r \n EmptyHeader: \r \n \r \n {}"
7
+ end
8
+ let ( :expected_headers ) do
9
+ {
10
+ "Content-Length" => "2" ,
11
+ "Content-Type" => "application/json" ,
12
+ "MyHeader" => "val" ,
13
+ "EmptyHeader" => ""
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
You can’t perform that action at this time.
0 commit comments