async-http 0.75.0 → 0.77.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/bake/async/http/h2spec.rb +6 -6
- data/bake/async/http.rb +3 -3
- data/lib/async/http/body/finishable.rb +56 -0
- data/lib/async/http/body/hijack.rb +5 -5
- data/lib/async/http/body/pipe.rb +8 -4
- data/lib/async/http/body/writable.rb +4 -95
- data/lib/async/http/body.rb +3 -3
- data/lib/async/http/client.rb +16 -18
- data/lib/async/http/endpoint.rb +10 -10
- data/lib/async/http/internet/instance.rb +1 -1
- data/lib/async/http/internet.rb +5 -5
- data/lib/async/http/middleware/location_redirector.rb +8 -8
- data/lib/async/http/mock/endpoint.rb +2 -2
- data/lib/async/http/mock.rb +1 -1
- data/lib/async/http/protocol/http.rb +2 -2
- data/lib/async/http/protocol/http1/client.rb +19 -6
- data/lib/async/http/protocol/http1/connection.rb +6 -7
- data/lib/async/http/protocol/http1/request.rb +3 -3
- data/lib/async/http/protocol/http1/response.rb +10 -2
- data/lib/async/http/protocol/http1/server.rb +33 -13
- data/lib/async/http/protocol/http1.rb +3 -3
- data/lib/async/http/protocol/http10.rb +1 -1
- data/lib/async/http/protocol/http11.rb +1 -1
- data/lib/async/http/protocol/http2/client.rb +4 -4
- data/lib/async/http/protocol/http2/connection.rb +12 -12
- data/lib/async/http/protocol/http2/input.rb +3 -3
- data/lib/async/http/protocol/http2/output.rb +30 -15
- data/lib/async/http/protocol/http2/request.rb +4 -4
- data/lib/async/http/protocol/http2/response.rb +14 -4
- data/lib/async/http/protocol/http2/server.rb +3 -3
- data/lib/async/http/protocol/http2/stream.rb +15 -7
- data/lib/async/http/protocol/http2.rb +3 -3
- data/lib/async/http/protocol/https.rb +3 -3
- data/lib/async/http/protocol/request.rb +3 -3
- data/lib/async/http/protocol/response.rb +3 -3
- data/lib/async/http/protocol.rb +3 -3
- data/lib/async/http/proxy.rb +4 -3
- data/lib/async/http/reference.rb +2 -2
- data/lib/async/http/relative_location.rb +1 -1
- data/lib/async/http/server.rb +13 -13
- data/lib/async/http/statistics.rb +4 -4
- data/lib/async/http/version.rb +1 -1
- data/lib/async/http.rb +5 -5
- data/readme.md +11 -0
- data/releases.md +11 -0
- data.tar.gz.sig +0 -0
- metadata +7 -8
- metadata.gz.sig +0 -0
- data/lib/async/http/body/delayed.rb +0 -32
- data/lib/async/http/body/slowloris.rb +0 -55
@@ -4,7 +4,7 @@
|
|
4
4
|
# Copyright, 2018-2024, by Samuel Williams.
|
5
5
|
# Copyright, 2023, by Josh Huber.
|
6
6
|
|
7
|
-
require_relative
|
7
|
+
require_relative "../response"
|
8
8
|
|
9
9
|
module Async
|
10
10
|
module HTTP
|
@@ -23,7 +23,7 @@ module Async
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
|
-
UPGRADE =
|
26
|
+
UPGRADE = "upgrade"
|
27
27
|
|
28
28
|
# @attribute [String] The HTTP response line reason.
|
29
29
|
attr :reason
|
@@ -39,6 +39,14 @@ module Async
|
|
39
39
|
super(version, status, headers, body, protocol)
|
40
40
|
end
|
41
41
|
|
42
|
+
def pool=(pool)
|
43
|
+
if @connection.idle? or @connection.closed?
|
44
|
+
pool.release(@connection)
|
45
|
+
else
|
46
|
+
@connection.pool = pool
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
42
50
|
def connection
|
43
51
|
@connection
|
44
52
|
end
|
@@ -6,8 +6,10 @@
|
|
6
6
|
# Copyright, 2023, by Thomas Morgan.
|
7
7
|
# Copyright, 2024, by Anton Zhuravsky.
|
8
8
|
|
9
|
-
require_relative
|
10
|
-
|
9
|
+
require_relative "connection"
|
10
|
+
require_relative "../../body/finishable"
|
11
|
+
|
12
|
+
require "console/event/failure"
|
11
13
|
|
12
14
|
module Async
|
13
15
|
module HTTP
|
@@ -20,7 +22,7 @@ module Async
|
|
20
22
|
write_body(@version, nil)
|
21
23
|
rescue => error
|
22
24
|
# At this point, there is very little we can do to recover:
|
23
|
-
Console::Event::Failure.for(error).emit(self, "Failed to write failure response
|
25
|
+
Console::Event::Failure.for(error).emit(self, "Failed to write failure response!", severity: :debug)
|
24
26
|
end
|
25
27
|
|
26
28
|
def next_request
|
@@ -35,7 +37,7 @@ module Async
|
|
35
37
|
end
|
36
38
|
|
37
39
|
return request
|
38
|
-
rescue ::Protocol::HTTP1::BadRequest
|
40
|
+
rescue ::Protocol::HTTP1::BadRequest => error
|
39
41
|
fail_request(400)
|
40
42
|
# Conceivably we could retry here, but we don't really know how bad the error is, so it's better to just fail:
|
41
43
|
raise
|
@@ -46,7 +48,13 @@ module Async
|
|
46
48
|
task.annotate("Reading #{self.version} requests for #{self.class}.")
|
47
49
|
|
48
50
|
while request = next_request
|
51
|
+
if body = request.body
|
52
|
+
finishable = Body::Finishable.new(body)
|
53
|
+
request.body = finishable
|
54
|
+
end
|
55
|
+
|
49
56
|
response = yield(request, self)
|
57
|
+
version = request.version
|
50
58
|
body = response&.body
|
51
59
|
|
52
60
|
if hijacked?
|
@@ -68,45 +76,57 @@ module Async
|
|
68
76
|
stream = write_upgrade_body(protocol)
|
69
77
|
|
70
78
|
# At this point, the request body is hijacked, so we don't want to call #finish below.
|
71
|
-
request = nil
|
79
|
+
request = nil
|
72
80
|
response = nil
|
73
81
|
|
74
82
|
# We must return here as no further request processing can be done:
|
75
83
|
return body.call(stream)
|
84
|
+
elsif response.status == 101
|
85
|
+
# This code path is to support legacy behavior where the response status is set to 101, but the protocol is not upgraded. This may not be a valid use case, but it is supported for compatibility. We expect the response headers to contain the `upgrade` header.
|
86
|
+
write_response(@version, response.status, response.headers)
|
87
|
+
|
88
|
+
stream = write_tunnel_body(version)
|
89
|
+
|
90
|
+
# Same as above:
|
91
|
+
request = nil
|
92
|
+
response = nil
|
93
|
+
|
94
|
+
# We must return here as no further request processing can be done:
|
95
|
+
return body&.call(stream)
|
76
96
|
else
|
77
97
|
write_response(@version, response.status, response.headers)
|
78
98
|
|
79
99
|
if request.connect? and response.success?
|
80
|
-
stream = write_tunnel_body(
|
100
|
+
stream = write_tunnel_body(version)
|
81
101
|
|
82
102
|
# Same as above:
|
83
|
-
request = nil
|
103
|
+
request = nil
|
84
104
|
response = nil
|
85
105
|
|
86
106
|
# We must return here as no further request processing can be done:
|
87
107
|
return body.call(stream)
|
88
108
|
else
|
89
109
|
head = request.head?
|
90
|
-
version = request.version
|
91
110
|
|
92
111
|
# Same as above:
|
93
|
-
request = nil
|
112
|
+
request = nil
|
94
113
|
response = nil
|
95
114
|
|
96
115
|
write_body(version, body, head, trailer)
|
97
116
|
end
|
98
117
|
end
|
99
118
|
|
100
|
-
# We are done with the body
|
119
|
+
# We are done with the body:
|
101
120
|
body = nil
|
102
121
|
else
|
103
122
|
# If the request failed to generate a response, it was an internal server error:
|
104
123
|
write_response(@version, 500, {})
|
105
|
-
write_body(
|
124
|
+
write_body(version, nil)
|
125
|
+
|
126
|
+
request&.finish
|
106
127
|
end
|
107
128
|
|
108
|
-
|
109
|
-
request&.each{}
|
129
|
+
finishable&.wait
|
110
130
|
|
111
131
|
# This ensures we yield at least once every iteration of the loop and allow other fibers to execute.
|
112
132
|
task.yield
|
@@ -4,10 +4,10 @@
|
|
4
4
|
# Copyright, 2017-2024, by Samuel Williams.
|
5
5
|
# Copyright, 2024, by Thomas Morgan.
|
6
6
|
|
7
|
-
require_relative
|
8
|
-
require_relative
|
7
|
+
require_relative "http1/client"
|
8
|
+
require_relative "http1/server"
|
9
9
|
|
10
|
-
require
|
10
|
+
require "io/stream"
|
11
11
|
|
12
12
|
module Async
|
13
13
|
module HTTP
|
@@ -1,12 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
# Released under the MIT License.
|
4
|
-
# Copyright, 2018-
|
4
|
+
# Copyright, 2018-2024, by Samuel Williams.
|
5
5
|
|
6
|
-
require_relative
|
7
|
-
require_relative
|
6
|
+
require_relative "connection"
|
7
|
+
require_relative "response"
|
8
8
|
|
9
|
-
require
|
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
|
7
|
+
require_relative "stream"
|
8
8
|
|
9
|
-
require
|
9
|
+
require "async/semaphore"
|
10
10
|
|
11
11
|
module Async
|
12
12
|
module HTTP
|
13
13
|
module Protocol
|
14
14
|
module HTTP2
|
15
|
-
HTTPS =
|
16
|
-
SCHEME =
|
17
|
-
METHOD =
|
18
|
-
PATH =
|
19
|
-
AUTHORITY =
|
20
|
-
STATUS =
|
21
|
-
PROTOCOL =
|
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 =
|
24
|
-
CONNECTION =
|
25
|
-
TRAILER =
|
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,16 +1,16 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
# Released under the MIT License.
|
4
|
-
# Copyright, 2020-
|
4
|
+
# Copyright, 2020-2024, by Samuel Williams.
|
5
5
|
|
6
|
-
|
6
|
+
require "protocol/http/body/writable"
|
7
7
|
|
8
8
|
module Async
|
9
9
|
module HTTP
|
10
10
|
module Protocol
|
11
11
|
module HTTP2
|
12
12
|
# A writable body which requests window updates when data is read from it.
|
13
|
-
class Input < Body::Writable
|
13
|
+
class Input < ::Protocol::HTTP::Body::Writable
|
14
14
|
def initialize(stream, length)
|
15
15
|
super(length)
|
16
16
|
|
@@ -1,9 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
# Released under the MIT License.
|
4
|
-
# Copyright, 2020-
|
4
|
+
# Copyright, 2020-2024, by Samuel Williams.
|
5
5
|
|
6
|
-
require
|
6
|
+
require "protocol/http/body/stream"
|
7
7
|
|
8
8
|
module Async
|
9
9
|
module HTTP
|
@@ -50,18 +50,25 @@ module Async
|
|
50
50
|
end
|
51
51
|
end
|
52
52
|
|
53
|
-
|
54
|
-
|
55
|
-
if @stream
|
56
|
-
@stream.finish_output(error)
|
53
|
+
def close_write(error = nil)
|
54
|
+
if stream = @stream
|
57
55
|
@stream = nil
|
56
|
+
stream.finish_output(error)
|
58
57
|
end
|
59
58
|
end
|
60
59
|
|
60
|
+
# This method should only be called from within the context of the output task.
|
61
|
+
def close(error = nil)
|
62
|
+
close_write(error)
|
63
|
+
stop(error)
|
64
|
+
end
|
65
|
+
|
61
66
|
# This method should only be called from within the context of the HTTP/2 stream.
|
62
67
|
def stop(error)
|
63
|
-
@task
|
64
|
-
|
68
|
+
if task = @task
|
69
|
+
@task = nil
|
70
|
+
task.stop(error)
|
71
|
+
end
|
65
72
|
end
|
66
73
|
|
67
74
|
private
|
@@ -70,10 +77,12 @@ module Async
|
|
70
77
|
task.annotate("Streaming #{@body} to #{@stream}.")
|
71
78
|
|
72
79
|
input = @stream.wait_for_input
|
80
|
+
stream = ::Protocol::HTTP::Body::Stream.new(input, self)
|
73
81
|
|
74
|
-
@body.call(
|
75
|
-
rescue
|
76
|
-
|
82
|
+
@body.call(stream)
|
83
|
+
rescue => error
|
84
|
+
self.close(error)
|
85
|
+
raise
|
77
86
|
end
|
78
87
|
|
79
88
|
# Reads chunks from the given body and writes them to the stream as fast as possible.
|
@@ -86,11 +95,17 @@ module Async
|
|
86
95
|
# chunk.clear unless chunk.frozen?
|
87
96
|
# GC.start
|
88
97
|
end
|
89
|
-
|
90
|
-
|
98
|
+
rescue => error
|
99
|
+
raise
|
91
100
|
ensure
|
92
|
-
|
93
|
-
|
101
|
+
# Ensure the body we are reading from is fully closed:
|
102
|
+
if body = @body
|
103
|
+
@body = nil
|
104
|
+
body.close(error)
|
105
|
+
end
|
106
|
+
|
107
|
+
# Ensure the output of this body is closed:
|
108
|
+
self.close_write(error)
|
94
109
|
end
|
95
110
|
|
96
111
|
# Send `maximum_size` bytes of data using the specified `stream`. If the buffer has no more chunks, `END_STREAM` will be sent on the final chunk.
|
@@ -3,8 +3,8 @@
|
|
3
3
|
# Released under the MIT License.
|
4
4
|
# Copyright, 2018-2024, by Samuel Williams.
|
5
5
|
|
6
|
-
require_relative
|
7
|
-
require_relative
|
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,
|
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
|
7
|
-
require_relative
|
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 !=
|
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
|
7
|
-
require_relative
|
6
|
+
require_relative "connection"
|
7
|
+
require_relative "request"
|
8
8
|
|
9
|
-
require
|
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
|
8
|
+
require "protocol/http2/stream"
|
9
9
|
|
10
|
-
require_relative
|
11
|
-
require_relative
|
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}!"
|
@@ -59,7 +63,7 @@ module Async
|
|
59
63
|
|
60
64
|
# TODO this might need to be in an ensure block:
|
61
65
|
if @input and frame.end_stream?
|
62
|
-
@input.
|
66
|
+
@input.close_write
|
63
67
|
@input = nil
|
64
68
|
end
|
65
69
|
rescue ::Protocol::HTTP2::HeaderError => error
|
@@ -98,7 +102,7 @@ module Async
|
|
98
102
|
end
|
99
103
|
|
100
104
|
if frame.end_stream?
|
101
|
-
@input.
|
105
|
+
@input.close_write
|
102
106
|
@input = nil
|
103
107
|
end
|
104
108
|
end
|
@@ -149,7 +153,7 @@ module Async
|
|
149
153
|
super
|
150
154
|
|
151
155
|
if @input
|
152
|
-
@input.
|
156
|
+
@input.close_write(error)
|
153
157
|
@input = nil
|
154
158
|
end
|
155
159
|
|
@@ -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
|
8
|
-
require_relative
|
7
|
+
require_relative "http2/client"
|
8
|
+
require_relative "http2/server"
|
9
9
|
|
10
|
-
require
|
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
|
8
|
-
require_relative
|
7
|
+
require_relative "http10"
|
8
|
+
require_relative "http11"
|
9
9
|
|
10
|
-
require_relative
|
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
|
7
|
-
require
|
6
|
+
require "protocol/http/request"
|
7
|
+
require "protocol/http/headers"
|
8
8
|
|
9
|
-
require_relative
|
9
|
+
require_relative "../body/writable"
|
10
10
|
|
11
11
|
module Async
|
12
12
|
module HTTP
|
@@ -1,11 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
# Released under the MIT License.
|
4
|
-
# Copyright, 2017-
|
4
|
+
# Copyright, 2017-2024, by Samuel Williams.
|
5
5
|
|
6
|
-
require
|
6
|
+
require "protocol/http/response"
|
7
7
|
|
8
|
-
require_relative
|
8
|
+
require_relative "../body/writable"
|
9
9
|
|
10
10
|
module Async
|
11
11
|
module HTTP
|
data/lib/async/http/protocol.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
# Released under the MIT License.
|
4
|
-
# Copyright, 2017-
|
4
|
+
# Copyright, 2017-2024, by Samuel Williams.
|
5
5
|
|
6
|
-
require_relative
|
7
|
-
require_relative
|
6
|
+
require_relative "protocol/http1"
|
7
|
+
require_relative "protocol/https"
|
8
8
|
|
9
9
|
module Async
|
10
10
|
module HTTP
|
data/lib/async/http/proxy.rb
CHANGED
@@ -3,10 +3,10 @@
|
|
3
3
|
# Released under the MIT License.
|
4
4
|
# Copyright, 2019-2024, by Samuel Williams.
|
5
5
|
|
6
|
-
require_relative
|
7
|
-
require_relative
|
6
|
+
require_relative "client"
|
7
|
+
require_relative "endpoint"
|
8
8
|
|
9
|
-
require_relative
|
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
|
data/lib/async/http/reference.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
# Released under the MIT License.
|
4
|
-
# Copyright, 2018-
|
4
|
+
# Copyright, 2018-2024, by Samuel Williams.
|
5
5
|
|
6
|
-
require
|
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
|
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
|
|