async-http 0.76.0 → 0.78.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/bake/async/http/h2spec.rb +6 -6
  4. data/bake/async/http.rb +3 -3
  5. data/lib/async/http/body/hijack.rb +4 -4
  6. data/lib/async/http/body/pipe.rb +1 -1
  7. data/lib/async/http/body/writable.rb +3 -3
  8. data/lib/async/http/body.rb +3 -3
  9. data/lib/async/http/client.rb +15 -18
  10. data/lib/async/http/endpoint.rb +10 -10
  11. data/lib/async/http/internet/instance.rb +1 -1
  12. data/lib/async/http/internet.rb +5 -5
  13. data/lib/async/http/middleware/location_redirector.rb +8 -8
  14. data/lib/async/http/mock/endpoint.rb +2 -2
  15. data/lib/async/http/mock.rb +1 -1
  16. data/lib/async/http/protocol/http.rb +2 -2
  17. data/lib/async/http/protocol/http1/client.rb +19 -6
  18. data/lib/async/http/protocol/http1/connection.rb +6 -7
  19. data/lib/async/http/protocol/http1/finishable.rb +58 -0
  20. data/lib/async/http/protocol/http1/request.rb +3 -3
  21. data/lib/async/http/protocol/http1/response.rb +10 -2
  22. data/lib/async/http/protocol/http1/server.rb +38 -15
  23. data/lib/async/http/protocol/http1.rb +3 -3
  24. data/lib/async/http/protocol/http10.rb +1 -1
  25. data/lib/async/http/protocol/http11.rb +1 -1
  26. data/lib/async/http/protocol/http2/client.rb +4 -4
  27. data/lib/async/http/protocol/http2/connection.rb +12 -12
  28. data/lib/async/http/protocol/http2/input.rb +2 -2
  29. data/lib/async/http/protocol/http2/output.rb +2 -2
  30. data/lib/async/http/protocol/http2/request.rb +4 -4
  31. data/lib/async/http/protocol/http2/response.rb +14 -4
  32. data/lib/async/http/protocol/http2/server.rb +3 -3
  33. data/lib/async/http/protocol/http2/stream.rb +12 -4
  34. data/lib/async/http/protocol/http2.rb +3 -3
  35. data/lib/async/http/protocol/https.rb +3 -3
  36. data/lib/async/http/protocol/request.rb +7 -3
  37. data/lib/async/http/protocol/response.rb +7 -3
  38. data/lib/async/http/protocol.rb +3 -3
  39. data/lib/async/http/proxy.rb +4 -3
  40. data/lib/async/http/reference.rb +2 -2
  41. data/lib/async/http/relative_location.rb +1 -1
  42. data/lib/async/http/server.rb +13 -13
  43. data/lib/async/http/statistics.rb +4 -4
  44. data/lib/async/http/version.rb +1 -1
  45. data/lib/async/http.rb +5 -5
  46. data/readme.md +11 -0
  47. data/releases.md +11 -0
  48. data.tar.gz.sig +0 -0
  49. metadata +7 -6
  50. metadata.gz.sig +0 -0
@@ -4,10 +4,10 @@
4
4
  # Copyright, 2017-2024, by Samuel Williams.
5
5
  # Copyright, 2024, by Thomas Morgan.
6
6
 
7
- require_relative 'http1/client'
8
- require_relative 'http1/server'
7
+ require_relative "http1/client"
8
+ require_relative "http1/server"
9
9
 
10
- require 'io/stream'
10
+ require "io/stream"
11
11
 
12
12
  module Async
13
13
  module HTTP
@@ -4,7 +4,7 @@
4
4
  # Copyright, 2017-2024, by Samuel Williams.
5
5
  # Copyright, 2024, by Thomas Morgan.
6
6
 
7
- require_relative 'http1'
7
+ require_relative "http1"
8
8
 
9
9
  module Async
10
10
  module HTTP
@@ -5,7 +5,7 @@
5
5
  # Copyright, 2018, by Janko Marohnić.
6
6
  # Copyright, 2024, by Thomas Morgan.
7
7
 
8
- require_relative 'http1'
8
+ require_relative "http1"
9
9
 
10
10
  module Async
11
11
  module HTTP
@@ -1,12 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Released under the MIT License.
4
- # Copyright, 2018-2023, by Samuel Williams.
4
+ # Copyright, 2018-2024, by Samuel Williams.
5
5
 
6
- require_relative 'connection'
7
- require_relative 'response'
6
+ require_relative "connection"
7
+ require_relative "response"
8
8
 
9
- require 'protocol/http2/client'
9
+ require "protocol/http2/client"
10
10
 
11
11
  module Async
12
12
  module HTTP
@@ -4,25 +4,25 @@
4
4
  # Copyright, 2018-2024, by Samuel Williams.
5
5
  # Copyright, 2020, by Bruno Sutic.
6
6
 
7
- require_relative 'stream'
7
+ require_relative "stream"
8
8
 
9
- require 'async/semaphore'
9
+ require "async/semaphore"
10
10
 
11
11
  module Async
12
12
  module HTTP
13
13
  module Protocol
14
14
  module HTTP2
15
- HTTPS = 'https'.freeze
16
- SCHEME = ':scheme'.freeze
17
- METHOD = ':method'.freeze
18
- PATH = ':path'.freeze
19
- AUTHORITY = ':authority'.freeze
20
- STATUS = ':status'.freeze
21
- PROTOCOL = ':protocol'.freeze
15
+ HTTPS = "https".freeze
16
+ SCHEME = ":scheme".freeze
17
+ METHOD = ":method".freeze
18
+ PATH = ":path".freeze
19
+ AUTHORITY = ":authority".freeze
20
+ STATUS = ":status".freeze
21
+ PROTOCOL = ":protocol".freeze
22
22
 
23
- CONTENT_LENGTH = 'content-length'.freeze
24
- CONNECTION = 'connection'.freeze
25
- TRAILER = 'trailer'.freeze
23
+ CONTENT_LENGTH = "content-length".freeze
24
+ CONNECTION = "connection".freeze
25
+ TRAILER = "trailer".freeze
26
26
 
27
27
  module Connection
28
28
  def initialize(*)
@@ -1,9 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Released under the MIT License.
4
- # Copyright, 2020-2023, by Samuel Williams.
4
+ # Copyright, 2020-2024, by Samuel Williams.
5
5
 
6
- require 'protocol/http/body/writable'
6
+ require "protocol/http/body/writable"
7
7
 
8
8
  module Async
9
9
  module HTTP
@@ -1,9 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Released under the MIT License.
4
- # Copyright, 2020-2023, by Samuel Williams.
4
+ # Copyright, 2020-2024, by Samuel Williams.
5
5
 
6
- require 'protocol/http/body/stream'
6
+ require "protocol/http/body/stream"
7
7
 
8
8
  module Async
9
9
  module HTTP
@@ -3,8 +3,8 @@
3
3
  # Released under the MIT License.
4
4
  # Copyright, 2018-2024, by Samuel Williams.
5
5
 
6
- require_relative '../request'
7
- require_relative 'stream'
6
+ require_relative "../request"
7
+ require_relative "stream"
8
8
 
9
9
  module Async
10
10
  module HTTP
@@ -53,7 +53,7 @@ module Async
53
53
  @length = Integer(value)
54
54
  elsif key == CONNECTION
55
55
  raise ::Protocol::HTTP2::HeaderError, "Connection header is not allowed!"
56
- elsif key.start_with? ':'
56
+ elsif key.start_with? ":"
57
57
  raise ::Protocol::HTTP2::HeaderError, "Invalid pseudo-header #{key}!"
58
58
  elsif key =~ /[A-Z]/
59
59
  raise ::Protocol::HTTP2::HeaderError, "Invalid characters in header #{key}!"
@@ -107,7 +107,7 @@ module Async
107
107
  end
108
108
 
109
109
  NO_RESPONSE = [
110
- [STATUS, '500'],
110
+ [STATUS, "500"],
111
111
  ]
112
112
 
113
113
  def send_response(response)
@@ -3,8 +3,8 @@
3
3
  # Released under the MIT License.
4
4
  # Copyright, 2018-2024, by Samuel Williams.
5
5
 
6
- require_relative '../response'
7
- require_relative 'stream'
6
+ require_relative "../response"
7
+ require_relative "stream"
8
8
 
9
9
  module Async
10
10
  module HTTP
@@ -41,7 +41,7 @@ module Async
41
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
42
  status_header = headers.shift
43
43
 
44
- if status_header.first != ':status'
44
+ if status_header.first != ":status"
45
45
  raise ProtocolError, "Invalid response headers: #{headers.inspect}"
46
46
  end
47
47
 
@@ -137,6 +137,16 @@ module Async
137
137
  attr :stream
138
138
  attr :request
139
139
 
140
+ def pool=(pool)
141
+ # If we are already closed, the stream can be released now:
142
+ if @stream.closed?
143
+ pool.release(@stream.connection)
144
+ else
145
+ # Otherwise, we will release the stream when it is closed:
146
+ @stream.pool = pool
147
+ end
148
+ end
149
+
140
150
  def connection
141
151
  @stream.connection
142
152
  end
@@ -175,7 +185,7 @@ module Async
175
185
  raise ::Protocol::HTTP2::HeaderError, "Request path already specified!" if request.path
176
186
 
177
187
  request.path = value
178
- elsif key.start_with? ':'
188
+ elsif key.start_with? ":"
179
189
  raise ::Protocol::HTTP2::HeaderError, "Invalid pseudo-header #{key}!"
180
190
  else
181
191
  request.headers[key] = value
@@ -3,10 +3,10 @@
3
3
  # Released under the MIT License.
4
4
  # Copyright, 2018-2024, by Samuel Williams.
5
5
 
6
- require_relative 'connection'
7
- require_relative 'request'
6
+ require_relative "connection"
7
+ require_relative "request"
8
8
 
9
- require 'protocol/http2/server'
9
+ require "protocol/http2/server"
10
10
 
11
11
  module Async
12
12
  module HTTP
@@ -5,10 +5,10 @@
5
5
  # Copyright, 2022, by Marco Concetto Rudilosso.
6
6
  # Copyright, 2023, by Thomas Morgan.
7
7
 
8
- require 'protocol/http2/stream'
8
+ require "protocol/http2/stream"
9
9
 
10
- require_relative 'input'
11
- require_relative 'output'
10
+ require_relative "input"
11
+ require_relative "output"
12
12
 
13
13
  module Async
14
14
  module HTTP
@@ -20,6 +20,8 @@ module Async
20
20
 
21
21
  @headers = nil
22
22
 
23
+ @pool = nil
24
+
23
25
  # Input buffer, reading request body, or response body (receive_data):
24
26
  @length = nil
25
27
  @input = nil
@@ -30,12 +32,14 @@ module Async
30
32
 
31
33
  attr_accessor :headers
32
34
 
35
+ attr_accessor :pool
36
+
33
37
  attr :input
34
38
 
35
39
  def add_header(key, value)
36
40
  if key == CONNECTION
37
41
  raise ::Protocol::HTTP2::HeaderError, "Connection header is not allowed!"
38
- elsif key.start_with? ':'
42
+ elsif key.start_with? ":"
39
43
  raise ::Protocol::HTTP2::HeaderError, "Invalid pseudo-header #{key}!"
40
44
  elsif key =~ /[A-Z]/
41
45
  raise ::Protocol::HTTP2::HeaderError, "Invalid upper-case characters in header #{key}!"
@@ -158,6 +162,10 @@ module Async
158
162
  @output = nil
159
163
  end
160
164
 
165
+ if pool = @pool and @connection
166
+ pool.release(@connection)
167
+ end
168
+
161
169
  return self
162
170
  end
163
171
  end
@@ -4,10 +4,10 @@
4
4
  # Copyright, 2018-2024, by Samuel Williams.
5
5
  # Copyright, 2024, by Thomas Morgan.
6
6
 
7
- require_relative 'http2/client'
8
- require_relative 'http2/server'
7
+ require_relative "http2/client"
8
+ require_relative "http2/server"
9
9
 
10
- require 'io/stream'
10
+ require "io/stream"
11
11
 
12
12
  module Async
13
13
  module HTTP
@@ -4,10 +4,10 @@
4
4
  # Copyright, 2018-2024, by Samuel Williams.
5
5
  # Copyright, 2019, by Brian Morearty.
6
6
 
7
- require_relative 'http10'
8
- require_relative 'http11'
7
+ require_relative "http10"
8
+ require_relative "http11"
9
9
 
10
- require_relative 'http2'
10
+ require_relative "http2"
11
11
 
12
12
  module Async
13
13
  module HTTP
@@ -3,10 +3,10 @@
3
3
  # Released under the MIT License.
4
4
  # Copyright, 2017-2024, by Samuel Williams.
5
5
 
6
- require 'protocol/http/request'
7
- require 'protocol/http/headers'
6
+ require "protocol/http/request"
7
+ require "protocol/http/headers"
8
8
 
9
- require_relative '../body/writable'
9
+ require_relative "../body/writable"
10
10
 
11
11
  module Async
12
12
  module HTTP
@@ -41,6 +41,10 @@ module Async
41
41
  def remote_address= value
42
42
  @remote_address = value
43
43
  end
44
+
45
+ def inspect
46
+ "#<#{self.class}:0x#{self.object_id.to_s(16)} method=#{method} path=#{path} version=#{version}>"
47
+ end
44
48
  end
45
49
  end
46
50
  end
@@ -1,11 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Released under the MIT License.
4
- # Copyright, 2017-2023, by Samuel Williams.
4
+ # Copyright, 2017-2024, by Samuel Williams.
5
5
 
6
- require 'protocol/http/response'
6
+ require "protocol/http/response"
7
7
 
8
- require_relative '../body/writable'
8
+ require_relative "../body/writable"
9
9
 
10
10
  module Async
11
11
  module HTTP
@@ -33,6 +33,10 @@ module Async
33
33
  def remote_address= value
34
34
  @remote_address = value
35
35
  end
36
+
37
+ def inspect
38
+ "#<#{self.class}:0x#{self.object_id.to_s(16)} status=#{status}>"
39
+ end
36
40
  end
37
41
  end
38
42
  end
@@ -1,10 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Released under the MIT License.
4
- # Copyright, 2017-2023, by Samuel Williams.
4
+ # Copyright, 2017-2024, by Samuel Williams.
5
5
 
6
- require_relative 'protocol/http1'
7
- require_relative 'protocol/https'
6
+ require_relative "protocol/http1"
7
+ require_relative "protocol/https"
8
8
 
9
9
  module Async
10
10
  module HTTP
@@ -3,10 +3,10 @@
3
3
  # Released under the MIT License.
4
4
  # Copyright, 2019-2024, by Samuel Williams.
5
5
 
6
- require_relative 'client'
7
- require_relative 'endpoint'
6
+ require_relative "client"
7
+ require_relative "endpoint"
8
8
 
9
- require_relative 'body/pipe'
9
+ require_relative "body/pipe"
10
10
 
11
11
  module Async
12
12
  module HTTP
@@ -96,6 +96,7 @@ module Async
96
96
  end
97
97
  else
98
98
  # This ensures we don't leave a response dangling:
99
+ input.close
99
100
  response.close
100
101
 
101
102
  raise ConnectFailure, response
@@ -1,9 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Released under the MIT License.
4
- # Copyright, 2018-2023, by Samuel Williams.
4
+ # Copyright, 2018-2024, by Samuel Williams.
5
5
 
6
- require 'protocol/http/reference'
6
+ require "protocol/http/reference"
7
7
 
8
8
  module Async
9
9
  module HTTP
@@ -4,7 +4,7 @@
4
4
  # Copyright, 2018-2024, by Samuel Williams.
5
5
  # Copyright, 2019-2020, by Brian Morearty.
6
6
 
7
- require_relative 'middleware/location_redirector'
7
+ require_relative "middleware/location_redirector"
8
8
 
9
9
  warn "`Async::HTTP::RelativeLocation` is deprecated and will be removed in the next release. Please use `Async::HTTP::Middleware::LocationRedirector` instead.", uplevel: 1
10
10
 
@@ -4,12 +4,12 @@
4
4
  # Copyright, 2017-2024, by Samuel Williams.
5
5
  # Copyright, 2019, by Brian Morearty.
6
6
 
7
- require 'async'
8
- require 'io/endpoint'
9
- require 'protocol/http/middleware'
10
- require 'traces/provider'
7
+ require "async"
8
+ require "io/endpoint"
9
+ require "protocol/http/middleware"
10
+ require "traces/provider"
11
11
 
12
- require_relative 'protocol'
12
+ require_relative "protocol"
13
13
 
14
14
  module Async
15
15
  module HTTP
@@ -76,8 +76,8 @@ module Async
76
76
 
77
77
  Traces::Provider(self) do
78
78
  def call(request)
79
- if trace_parent = request.headers['traceparent']
80
- Traces.trace_context = Traces::Context.parse(trace_parent.join, request.headers['tracestate'], remote: true)
79
+ if trace_parent = request.headers["traceparent"]
80
+ Traces.trace_context = Traces::Context.parse(trace_parent.join, request.headers["tracestate"], remote: true)
81
81
  end
82
82
 
83
83
  attributes = {
@@ -86,25 +86,25 @@ module Async
86
86
  'http.authority': request.authority,
87
87
  'http.scheme': request.scheme,
88
88
  'http.path': request.path,
89
- 'http.user_agent': request.headers['user-agent'],
89
+ 'http.user_agent': request.headers["user-agent"],
90
90
  }
91
91
 
92
92
  if length = request.body&.length
93
- attributes['http.request.length'] = length
93
+ attributes["http.request.length"] = length
94
94
  end
95
95
 
96
96
  if protocol = request.protocol
97
- attributes['http.protocol'] = protocol
97
+ attributes["http.protocol"] = protocol
98
98
  end
99
99
 
100
- Traces.trace('async.http.server.call', resource: "#{request.method} #{request.path}", attributes: attributes) do |span|
100
+ Traces.trace("async.http.server.call", resource: "#{request.method} #{request.path}", attributes: attributes) do |span|
101
101
  super.tap do |response|
102
102
  if status = response&.status
103
- span['http.status_code'] = status
103
+ span["http.status_code"] = status
104
104
  end
105
105
 
106
106
  if length = response&.body&.length
107
- span['http.response.length'] = length
107
+ span["http.response.length"] = length
108
108
  end
109
109
  end
110
110
  end
@@ -1,11 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Released under the MIT License.
4
- # Copyright, 2018-2023, by Samuel Williams.
4
+ # Copyright, 2018-2024, by Samuel Williams.
5
5
 
6
- require 'protocol/http/body/wrapper'
6
+ require "protocol/http/body/wrapper"
7
7
 
8
- require 'async/clock'
8
+ require "async/clock"
9
9
 
10
10
  module Async
11
11
  module HTTP
@@ -89,7 +89,7 @@ module Async
89
89
  parts << "took #{format_duration(duration)} until first chunk"
90
90
  end
91
91
 
92
- return parts.join('; ')
92
+ return parts.join("; ")
93
93
  end
94
94
 
95
95
  def inspect
@@ -5,6 +5,6 @@
5
5
 
6
6
  module Async
7
7
  module HTTP
8
- VERSION = "0.76.0"
8
+ VERSION = "0.78.0"
9
9
  end
10
10
  end
data/lib/async/http.rb CHANGED
@@ -3,11 +3,11 @@
3
3
  # Released under the MIT License.
4
4
  # Copyright, 2017-2024, by Samuel Williams.
5
5
 
6
- require_relative 'http/version'
6
+ require_relative "http/version"
7
7
 
8
- require_relative 'http/client'
9
- require_relative 'http/server'
8
+ require_relative "http/client"
9
+ require_relative "http/server"
10
10
 
11
- require_relative 'http/internet'
11
+ require_relative "http/internet"
12
12
 
13
- require_relative 'http/endpoint'
13
+ require_relative "http/endpoint"
data/readme.md CHANGED
@@ -16,6 +16,17 @@ Please see the [project documentation](https://socketry.github.io/async-http/) f
16
16
 
17
17
  Please see the [project releases](https://socketry.github.io/async-http/releases/index) for all releases.
18
18
 
19
+ ### v0.77.0
20
+
21
+ - Improved HTTP/1 connection handling.
22
+ - The input stream is no longer closed when the output stream is closed.
23
+
24
+ ### v0.76.0
25
+
26
+ - `Async::HTTP::Body::Writable` is moved to `Protocol::HTTP::Body::Writable`.
27
+ - Remove `Async::HTTP::Body::Delayed` with no replacement.
28
+ - Remove `Async::HTTP::Body::Slowloris` with no replacement.
29
+
19
30
  ### v0.75.0
20
31
 
21
32
  - Better handling of HTTP/1 \&lt;-\&gt; HTTP/2 proxying, specifically upgrade/CONNECT requests.
data/releases.md CHANGED
@@ -1,5 +1,16 @@
1
1
  # Releases
2
2
 
3
+ ## v0.77.0
4
+
5
+ - Improved HTTP/1 connection handling.
6
+ - The input stream is no longer closed when the output stream is closed.
7
+
8
+ ## v0.76.0
9
+
10
+ - `Async::HTTP::Body::Writable` is moved to `Protocol::HTTP::Body::Writable`.
11
+ - Remove `Async::HTTP::Body::Delayed` with no replacement.
12
+ - Remove `Async::HTTP::Body::Slowloris` with no replacement.
13
+
3
14
  ## v0.75.0
4
15
 
5
16
  - Better handling of HTTP/1 \<-\> HTTP/2 proxying, specifically upgrade/CONNECT requests.
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.76.0
4
+ version: 0.78.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-09-10 00:00:00.000000000 Z
61
+ date: 2024-09-22 00:00:00.000000000 Z
62
62
  dependencies:
63
63
  - !ruby/object:Gem::Dependency
64
64
  name: async
@@ -122,28 +122,28 @@ dependencies:
122
122
  requirements:
123
123
  - - "~>"
124
124
  - !ruby/object:Gem::Version
125
- version: '0.34'
125
+ version: '0.37'
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.34'
132
+ version: '0.37'
133
133
  - !ruby/object:Gem::Dependency
134
134
  name: protocol-http1
135
135
  requirement: !ruby/object:Gem::Requirement
136
136
  requirements:
137
137
  - - "~>"
138
138
  - !ruby/object:Gem::Version
139
- version: '0.20'
139
+ version: '0.25'
140
140
  type: :runtime
141
141
  prerelease: false
142
142
  version_requirements: !ruby/object:Gem::Requirement
143
143
  requirements:
144
144
  - - "~>"
145
145
  - !ruby/object:Gem::Version
146
- version: '0.20'
146
+ version: '0.25'
147
147
  - !ruby/object:Gem::Dependency
148
148
  name: protocol-http2
149
149
  requirement: !ruby/object:Gem::Requirement
@@ -197,6 +197,7 @@ files:
197
197
  - lib/async/http/protocol/http1.rb
198
198
  - lib/async/http/protocol/http1/client.rb
199
199
  - lib/async/http/protocol/http1/connection.rb
200
+ - lib/async/http/protocol/http1/finishable.rb
200
201
  - lib/async/http/protocol/http1/request.rb
201
202
  - lib/async/http/protocol/http1/response.rb
202
203
  - lib/async/http/protocol/http1/server.rb
metadata.gz.sig CHANGED
Binary file