async-http 0.72.0 → 0.73.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8b358f54acd8cf0943e35f30865d7f505025bad37a2c37e0dda5f8438efe3b25
4
- data.tar.gz: a8a9eee82cc0723cf8101ef727072d4518a38ddb7e68f5f0f2d15027e92e83a9
3
+ metadata.gz: 01cf4d909911a28f4f386982504e5865d9053210af1cb121a4acc8e0812a63bd
4
+ data.tar.gz: 20b913990be812792c72f5e68649ee8084310112287e316c438c6a220cee9982
5
5
  SHA512:
6
- metadata.gz: 7f5720d8ac42c48afb19bd5c387db2da015b2d210836c6d1a7abfe3cd3a4df85587c92b9bbdee61fce397302c66c8ca303c123d9e7f9a2201b26602ea0240e58
7
- data.tar.gz: 91a543963515d1375953da096781b7b9d5a161e20bafc6aa067fbf0e09ff546ae3b48e18a5d8ca06dc5173184546898d415310b6bfbded5605040bce08443010
6
+ metadata.gz: 6b1eefc4c6f0d1a631c1b6f0365ae36a7fe4067e1b372f334473b99f379f0755d29d53a5a04183f5eef46a9c0cf6504a2a56b7c5741757700b44d5c2283fb129
7
+ data.tar.gz: 1ed32dc7b17b30ddd2d842e688e89df28a0cc51a0610398ea567191c6158c5adde2ebdd337035450fca499b0c312e2d9b3bed616f9cf1058c1d136bbdd10acd4
checksums.yaml.gz.sig CHANGED
Binary file
@@ -24,7 +24,7 @@ module Async
24
24
  # HTTP/1 requests with an upgrade header (which can contain zero or more values) are extracted into the protocol field of the request, and we expect a response to select one of those protocols with a status code of 101 Switching Protocols.
25
25
  protocol = headers.delete('upgrade')
26
26
 
27
- super(nil, authority, method, path, version, headers, body, protocol)
27
+ super(nil, authority, method, path, version, headers, body, protocol, self.public_method(:write_interim_response))
28
28
  end
29
29
 
30
30
  def connection
@@ -39,8 +39,8 @@ module Async
39
39
  @connection.hijack!
40
40
  end
41
41
 
42
- def write_interim_response(response)
43
- @connection.write_interim_response(response.version, response.status, response.headers)
42
+ def write_interim_response(status, headers = nil)
43
+ @connection.write_interim_response(@version, status, headers)
44
44
  end
45
45
  end
46
46
  end
@@ -17,6 +17,8 @@ module Async
17
17
 
18
18
  if response.final?
19
19
  return response
20
+ else
21
+ request.send_interim_response(response.status, response.headers)
20
22
  end
21
23
  end
22
24
  end
@@ -23,6 +23,8 @@ module Async
23
23
  attr :request
24
24
 
25
25
  def receive_initial_headers(headers, end_stream)
26
+ @headers = ::Protocol::HTTP::Headers.new
27
+
26
28
  headers.each do |key, value|
27
29
  if key == SCHEME
28
30
  raise ::Protocol::HTTP2::HeaderError, "Request scheme already specified!" if @request.scheme
@@ -85,7 +87,7 @@ module Async
85
87
  end
86
88
 
87
89
  def initialize(stream)
88
- super(nil, nil, nil, nil, VERSION, nil)
90
+ super(nil, nil, nil, nil, VERSION, nil, nil, nil, self.public_method(:write_interim_response))
89
91
 
90
92
  @stream = stream
91
93
  end
@@ -117,10 +119,6 @@ module Async
117
119
  [STATUS, response.status],
118
120
  ]
119
121
 
120
- if protocol = response.protocol
121
- protocol_headers << [PROTOCOL, protocol]
122
- end
123
-
124
122
  if length = response.body&.length
125
123
  protocol_headers << [CONTENT_LENGTH, length]
126
124
  end
@@ -142,14 +140,16 @@ module Async
142
140
  end
143
141
  end
144
142
 
145
- def write_interim_response(response)
146
- protocol_headers = [
147
- [STATUS, response.status]
143
+ def write_interim_response(status, headers = nil)
144
+ interim_response_headers = [
145
+ [STATUS, status]
148
146
  ]
149
147
 
150
- headers = ::Protocol::HTTP::Headers::Merged.new(protocol_headers, response.headers)
148
+ if headers
149
+ interim_response_headers = ::Protocol::HTTP::Headers::Merged.new(interim_response_headers, headers)
150
+ end
151
151
 
152
- @stream.send_headers(nil, headers)
152
+ @stream.send_headers(nil, interim_response_headers)
153
153
  end
154
154
  end
155
155
  end
@@ -38,18 +38,25 @@ module Async
38
38
 
39
39
  # This should be invoked from the background reader, and notifies the task waiting for the headers that we are done.
40
40
  def receive_initial_headers(headers, end_stream)
41
+ # While in theory, the response pseudo-headers may be extended in the future, currently they only response pseudo-header is :status, so we can assume it is always the first header.
42
+ status_header = headers.shift
43
+
44
+ if status_header.first != ':status'
45
+ raise ProtocolError, "Invalid response headers: #{headers.inspect}"
46
+ end
47
+
48
+ status = Integer(status_header.last)
49
+
50
+ if status >= 100 && status < 200
51
+ return receive_interim_headers(status, headers)
52
+ end
53
+
54
+ @response.status = status
55
+ @headers = ::Protocol::HTTP::Headers.new
56
+
41
57
  headers.each do |key, value|
42
58
  # It's guaranteed that this should be the first header:
43
- if key == STATUS
44
- status = Integer(value)
45
-
46
- # Ignore informational headers:
47
- return if status >= 100 && status < 200
48
-
49
- @response.status = Integer(value)
50
- elsif key == PROTOCOL
51
- @response.protocol = value
52
- elsif key == CONTENT_LENGTH
59
+ if key == CONTENT_LENGTH
53
60
  @length = Integer(value)
54
61
  else
55
62
  add_header(key, value)
@@ -74,6 +81,16 @@ module Async
74
81
  return headers
75
82
  end
76
83
 
84
+ def receive_interim_headers(status, headers)
85
+ if headers.any?
86
+ headers = ::Protocol::HTTP::Headers[headers]
87
+ else
88
+ headers = nil
89
+ end
90
+
91
+ @response.request.send_interim_response(status, headers)
92
+ end
93
+
77
94
  # Notify anyone waiting on the response headers to be received (or failure).
78
95
  def notify!
79
96
  if notification = @notification
@@ -51,10 +51,9 @@ module Async
51
51
  end
52
52
 
53
53
  def process_headers(frame)
54
- if frame.end_stream? && @headers
54
+ if @headers and frame.end_stream?
55
55
  self.receive_trailing_headers(super, frame.end_stream?)
56
56
  else
57
- @headers ||= ::Protocol::HTTP::Headers.new
58
57
  self.receive_initial_headers(super, frame.end_stream?)
59
58
  end
60
59
 
@@ -25,7 +25,7 @@ module Async
25
25
  false
26
26
  end
27
27
 
28
- def write_interim_response(response)
28
+ def write_interim_response(status, headers = nil)
29
29
  end
30
30
 
31
31
  def peer
@@ -5,6 +5,6 @@
5
5
 
6
6
  module Async
7
7
  module HTTP
8
- VERSION = "0.72.0"
8
+ VERSION = "0.73.0"
9
9
  end
10
10
  end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: async-http
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.72.0
4
+ version: 0.73.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Williams
@@ -58,7 +58,7 @@ cert_chain:
58
58
  Q2K9NVun/S785AP05vKkXZEFYxqG6EW012U4oLcFl5MySFajYXRYbuUpH6AY+HP8
59
59
  voD0MPg1DssDLKwXyt1eKD/+Fq0bFWhwVM/1XiAXL7lyYUyOq24KHgQ2Csg=
60
60
  -----END CERTIFICATE-----
61
- date: 2024-08-29 00:00:00.000000000 Z
61
+ date: 2024-08-31 00:00:00.000000000 Z
62
62
  dependencies:
63
63
  - !ruby/object:Gem::Dependency
64
64
  name: async
@@ -122,14 +122,14 @@ dependencies:
122
122
  requirements:
123
123
  - - "~>"
124
124
  - !ruby/object:Gem::Version
125
- version: '0.29'
125
+ version: '0.30'
126
126
  type: :runtime
127
127
  prerelease: false
128
128
  version_requirements: !ruby/object:Gem::Requirement
129
129
  requirements:
130
130
  - - "~>"
131
131
  - !ruby/object:Gem::Version
132
- version: '0.29'
132
+ version: '0.30'
133
133
  - !ruby/object:Gem::Dependency
134
134
  name: protocol-http1
135
135
  requirement: !ruby/object:Gem::Requirement
metadata.gz.sig CHANGED
Binary file