async-http 0.60.2 → 0.62.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: 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