async-http 0.60.2 → 0.62.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 94d01d8b4754f0fff69d5aea223f0fad97a4ab496855514c60a12e63304b1848
4
- data.tar.gz: 96fa75766d15ca0dbd905323ae251f21b6fb0fc117a2b64fd45d1d008648c04e
3
+ metadata.gz: 8dc4aa0996dc0764efca237242c38060aac6d376ec0909c201234513900ac63b
4
+ data.tar.gz: 8686d58131784592733a4db72bf6ae9f808f6b6471f5fb2051ed9f081d08dc7c
5
5
  SHA512:
6
- metadata.gz: 8d4c9be08b40a207c21dbdad27158560600a036ddecbe57efa5771588bfb25ca933973be3d4126de8e17aa300c9f418703d55c590586ed1e9a91022ccf552e38
7
- data.tar.gz: 78ce733483ff5074ac00a4afd0b2da7439a7709982d543f2b981fbd63b8de06c7739957bbf024e3bde4682f880ed566086bbbdf00a50e9a456f5f512445b5635
6
+ metadata.gz: f5e3b67a1a6233cdab82d41870c9fd642ebee81d4fcbb806c5097c090de552ad8d4e57b0cb432c51974772099582fbdbcf772af192baf2bb38709b3a6d6e59dc
7
+ data.tar.gz: f5466292f40fd68e549d02f89c09988f47cf077008faf0c8c69f421aec2ce4245e2c5acc916b0b4e250bf7270408c0a9bed7be556f658ff5c7a92275b0ac1326
checksums.yaml.gz.sig CHANGED
Binary file
@@ -3,13 +3,14 @@
3
3
  # Released under the MIT License.
4
4
  # Copyright, 2018-2023, by Samuel Williams.
5
5
  # Copyright, 2020, by Bruno Sutic.
6
+ # Copyright, 2023, by Thomas Morgan.
6
7
 
7
8
  require 'protocol/http/body/wrapper'
8
9
 
9
10
  module Async
10
11
  module HTTP
11
12
  module Body
12
- class Delayed < Protocol::HTTP::Body::Wrapper
13
+ class Delayed < ::Protocol::HTTP::Body::Wrapper
13
14
  def initialize(body, delay = 0.01)
14
15
  super(body)
15
16
 
@@ -7,6 +7,7 @@
7
7
  require 'async/io/host_endpoint'
8
8
  require 'async/io/ssl_endpoint'
9
9
  require 'async/io/ssl_socket'
10
+ require 'async/io/shared_endpoint'
10
11
 
11
12
  require_relative 'protocol/http1'
12
13
  require_relative 'protocol/https'
@@ -38,6 +38,10 @@ module Async
38
38
  def hijack!
39
39
  @connection.hijack!
40
40
  end
41
+
42
+ def write_interim_response(response)
43
+ @connection.write_interim_response(response.version, response.status, response.headers)
44
+ end
41
45
  end
42
46
  end
43
47
  end
@@ -11,16 +11,24 @@ module Async
11
11
  module HTTP1
12
12
  class Response < Protocol::Response
13
13
  def self.read(connection, request)
14
- if parts = connection.read_response(request.method)
15
- self.new(connection, *parts)
14
+ while parts = connection.read_response(request.method)
15
+ response = self.new(connection, *parts)
16
+
17
+ if response.final?
18
+ return response
19
+ end
16
20
  end
17
21
  end
18
22
 
19
23
  UPGRADE = 'upgrade'
20
-
21
- # @param reason [String] HTTP response line reason, ignored.
24
+
25
+ # @attribute [String] The HTTP response line reason.
26
+ attr :reason
27
+
28
+ # @parameter reason [String] HTTP response line reason phrase.
22
29
  def initialize(connection, version, status, reason, headers, body)
23
30
  @connection = connection
31
+ @reason = reason
24
32
 
25
33
  protocol = headers.delete(UPGRADE)
26
34
 
@@ -3,6 +3,7 @@
3
3
  # Released under the MIT License.
4
4
  # Copyright, 2018-2023, by Samuel Williams.
5
5
  # Copyright, 2020, by Igor Sidorov.
6
+ # Copyright, 2023, by Thomas Morgan.
6
7
 
7
8
  require_relative 'connection'
8
9
 
@@ -14,6 +15,9 @@ module Async
14
15
  def fail_request(status)
15
16
  @persistent = false
16
17
  write_response(@version, status, {}, nil)
18
+ write_body(@version, nil)
19
+ rescue Errno::ECONNRESET, Errno::EPIPE
20
+ # Handle when connection is already closed
17
21
  end
18
22
 
19
23
  def next_request
@@ -79,7 +83,7 @@ module Async
79
83
  version = request.version
80
84
 
81
85
  # Same as above:
82
- request = nil unless body
86
+ request = nil unless request.body
83
87
  response = nil
84
88
 
85
89
  write_body(version, body, head, trailer)
@@ -94,7 +98,7 @@ module Async
94
98
  end
95
99
 
96
100
  # Gracefully finish reading the request body if it was not already done so.
97
- request&.finish
101
+ request&.each{}
98
102
 
99
103
  # This ensures we yield at least once every iteration of the loop and allow other fibers to execute.
100
104
  task.yield
@@ -105,6 +109,7 @@ module Async
105
109
  end
106
110
  end
107
111
  end
112
+
108
113
  end
109
114
  end
110
115
  end
@@ -141,6 +141,16 @@ module Async
141
141
  @stream.send_headers(nil, headers, ::Protocol::HTTP2::END_STREAM)
142
142
  end
143
143
  end
144
+
145
+ def write_interim_response(response)
146
+ protocol_headers = [
147
+ [STATUS, response.status]
148
+ ]
149
+
150
+ headers = ::Protocol::HTTP::Headers::Merged.new(protocol_headers, response.headers)
151
+
152
+ @stream.send_headers(nil, headers)
153
+ end
144
154
  end
145
155
  end
146
156
  end
@@ -39,7 +39,13 @@ module Async
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
41
  headers.each do |key, value|
42
+ # It's guaranteed that this should be the first header:
42
43
  if key == STATUS
44
+ status = Integer(value)
45
+
46
+ # Ignore informational headers:
47
+ return if status >= 100 && status < 200
48
+
43
49
  @response.status = Integer(value)
44
50
  elsif key == PROTOCOL
45
51
  @response.protocol = value
@@ -50,13 +50,11 @@ module Async
50
50
  end
51
51
 
52
52
  def process_headers(frame)
53
- if @headers.nil?
54
- @headers = ::Protocol::HTTP::Headers.new
55
- self.receive_initial_headers(super, frame.end_stream?)
56
- elsif frame.end_stream?
53
+ if frame.end_stream? && @headers
57
54
  self.receive_trailing_headers(super, frame.end_stream?)
58
55
  else
59
- raise ::Protocol::HTTP2::HeaderError, "Unable to process headers!"
56
+ @headers ||= ::Protocol::HTTP::Headers.new
57
+ self.receive_initial_headers(super, frame.end_stream?)
60
58
  end
61
59
 
62
60
  # TODO this might need to be in an ensure block:
@@ -65,7 +63,7 @@ module Async
65
63
  @input = nil
66
64
  end
67
65
  rescue ::Protocol::HTTP2::HeaderError => error
68
- Console.logger.error(self, error)
66
+ Console.logger.debug(self, error)
69
67
 
70
68
  send_reset_stream(error.code)
71
69
  end
@@ -25,6 +25,9 @@ module Async
25
25
  false
26
26
  end
27
27
 
28
+ def write_interim_response(response)
29
+ end
30
+
28
31
  def peer
29
32
  if connection = self.connection
30
33
  connection.peer
@@ -5,6 +5,6 @@
5
5
 
6
6
  module Async
7
7
  module HTTP
8
- VERSION = "0.60.2"
8
+ VERSION = "0.62.0"
9
9
  end
10
10
  end
data/license.md CHANGED
@@ -17,6 +17,7 @@ Copyright, 2021-2022, by Adam Daniels.
17
17
  Copyright, 2022, by Ian Ker-Seymer.
18
18
  Copyright, 2022, by Marco Concetto Rudilosso.
19
19
  Copyright, 2022, by Tim Meusel.
20
+ Copyright, 2023, by Thomas Morgan.
20
21
 
21
22
  Permission is hereby granted, free of charge, to any person obtaining a copy
22
23
  of this software and associated documentation files (the "Software"), to deal
data/readme.md CHANGED
@@ -367,6 +367,14 @@ We welcome contributions to this project.
367
367
  4. Push to the branch (`git push origin my-new-feature`).
368
368
  5. Create new Pull Request.
369
369
 
370
+ ### Developer Certificate of Origin
371
+
372
+ This project uses the [Developer Certificate of Origin](https://developercertificate.org/). All contributors to this project must agree to this document to have their contributions accepted.
373
+
374
+ ### Contributor Covenant
375
+
376
+ This project is governed by [Contributor Covenant](https://www.contributor-covenant.org/). All contributors and participants agree to abide by its terms.
377
+
370
378
  ## See Also
371
379
 
372
380
  - [benchmark-http](https://github.com/socketry/benchmark-http) — A benchmarking tool to report on web server concurrency.
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.60.2
4
+ version: 0.62.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Williams
@@ -9,6 +9,7 @@ authors:
9
9
  - Bruno Sutic
10
10
  - Janko Marohnić
11
11
  - Adam Daniels
12
+ - Thomas Morgan
12
13
  - Cyril Roelandt
13
14
  - Denis Talakevich
14
15
  - Ian Ker-Seymer
@@ -53,7 +54,7 @@ cert_chain:
53
54
  Q2K9NVun/S785AP05vKkXZEFYxqG6EW012U4oLcFl5MySFajYXRYbuUpH6AY+HP8
54
55
  voD0MPg1DssDLKwXyt1eKD/+Fq0bFWhwVM/1XiAXL7lyYUyOq24KHgQ2Csg=
55
56
  -----END CERTIFICATE-----
56
- date: 2023-06-19 00:00:00.000000000 Z
57
+ date: 2024-01-22 00:00:00.000000000 Z
57
58
  dependencies:
58
59
  - !ruby/object:Gem::Dependency
59
60
  name: async
@@ -103,28 +104,28 @@ dependencies:
103
104
  requirements:
104
105
  - - "~>"
105
106
  - !ruby/object:Gem::Version
106
- version: 0.24.0
107
+ version: 0.25.0
107
108
  type: :runtime
108
109
  prerelease: false
109
110
  version_requirements: !ruby/object:Gem::Requirement
110
111
  requirements:
111
112
  - - "~>"
112
113
  - !ruby/object:Gem::Version
113
- version: 0.24.0
114
+ version: 0.25.0
114
115
  - !ruby/object:Gem::Dependency
115
116
  name: protocol-http1
116
117
  requirement: !ruby/object:Gem::Requirement
117
118
  requirements:
118
119
  - - "~>"
119
120
  - !ruby/object:Gem::Version
120
- version: 0.15.0
121
+ version: 0.16.0
121
122
  type: :runtime
122
123
  prerelease: false
123
124
  version_requirements: !ruby/object:Gem::Requirement
124
125
  requirements:
125
126
  - - "~>"
126
127
  - !ruby/object:Gem::Version
127
- version: 0.15.0
128
+ version: 0.16.0
128
129
  - !ruby/object:Gem::Dependency
129
130
  name: protocol-http2
130
131
  requirement: !ruby/object:Gem::Requirement
@@ -153,90 +154,6 @@ dependencies:
153
154
  - - ">="
154
155
  - !ruby/object:Gem::Version
155
156
  version: 0.10.0
156
- - !ruby/object:Gem::Dependency
157
- name: async-container
158
- requirement: !ruby/object:Gem::Requirement
159
- requirements:
160
- - - "~>"
161
- - !ruby/object:Gem::Version
162
- version: '0.14'
163
- type: :development
164
- prerelease: false
165
- version_requirements: !ruby/object:Gem::Requirement
166
- requirements:
167
- - - "~>"
168
- - !ruby/object:Gem::Version
169
- version: '0.14'
170
- - !ruby/object:Gem::Dependency
171
- name: async-rspec
172
- requirement: !ruby/object:Gem::Requirement
173
- requirements:
174
- - - "~>"
175
- - !ruby/object:Gem::Version
176
- version: '1.10'
177
- type: :development
178
- prerelease: false
179
- version_requirements: !ruby/object:Gem::Requirement
180
- requirements:
181
- - - "~>"
182
- - !ruby/object:Gem::Version
183
- version: '1.10'
184
- - !ruby/object:Gem::Dependency
185
- name: covered
186
- requirement: !ruby/object:Gem::Requirement
187
- requirements:
188
- - - ">="
189
- - !ruby/object:Gem::Version
190
- version: '0'
191
- type: :development
192
- prerelease: false
193
- version_requirements: !ruby/object:Gem::Requirement
194
- requirements:
195
- - - ">="
196
- - !ruby/object:Gem::Version
197
- version: '0'
198
- - !ruby/object:Gem::Dependency
199
- name: localhost
200
- requirement: !ruby/object:Gem::Requirement
201
- requirements:
202
- - - ">="
203
- - !ruby/object:Gem::Version
204
- version: '0'
205
- type: :development
206
- prerelease: false
207
- version_requirements: !ruby/object:Gem::Requirement
208
- requirements:
209
- - - ">="
210
- - !ruby/object:Gem::Version
211
- version: '0'
212
- - !ruby/object:Gem::Dependency
213
- name: rack-test
214
- requirement: !ruby/object:Gem::Requirement
215
- requirements:
216
- - - ">="
217
- - !ruby/object:Gem::Version
218
- version: '0'
219
- type: :development
220
- prerelease: false
221
- version_requirements: !ruby/object:Gem::Requirement
222
- requirements:
223
- - - ">="
224
- - !ruby/object:Gem::Version
225
- version: '0'
226
- - !ruby/object:Gem::Dependency
227
- name: rspec
228
- requirement: !ruby/object:Gem::Requirement
229
- requirements:
230
- - - "~>"
231
- - !ruby/object:Gem::Version
232
- version: '3.6'
233
- type: :development
234
- prerelease: false
235
- version_requirements: !ruby/object:Gem::Requirement
236
- requirements:
237
- - - "~>"
238
- - !ruby/object:Gem::Version
239
- version: '3.6'
240
157
  description:
241
158
  email:
242
159
  executables: []
@@ -297,14 +214,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
297
214
  requirements:
298
215
  - - ">="
299
216
  - !ruby/object:Gem::Version
300
- version: '0'
217
+ version: '3.0'
301
218
  required_rubygems_version: !ruby/object:Gem::Requirement
302
219
  requirements:
303
220
  - - ">="
304
221
  - !ruby/object:Gem::Version
305
222
  version: '0'
306
223
  requirements: []
307
- rubygems_version: 3.4.7
224
+ rubygems_version: 3.4.22
308
225
  signing_key:
309
226
  specification_version: 4
310
227
  summary: A HTTP client and server library.
metadata.gz.sig CHANGED
Binary file