async-http 0.37.14 → 0.38.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/async-http.gemspec +1 -1
- data/lib/async/http/protocol/http2.rb +15 -1
- data/lib/async/http/protocol/http2/connection.rb +2 -0
- data/lib/async/http/protocol/http2/promise.rb +71 -0
- data/lib/async/http/protocol/http2/request.rb +30 -0
- data/lib/async/http/protocol/http2/response.rb +18 -0
- data/lib/async/http/protocol/http2/server.rb +1 -0
- data/lib/async/http/protocol/http2/stream.rb +8 -4
- data/lib/async/http/protocol/request.rb +4 -0
- data/lib/async/http/version.rb +1 -1
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 89e83fd398432897302be1ddbb07fad391a285216320e282e218c2faf07f4183
|
4
|
+
data.tar.gz: c9f37f4776390db5b0d050845397d7b530b145b6072f062b453957944683d7d6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 53f726aec29bd9130015446d9e05b5b11be437c85978f9cb6d22647ebd17dd033182e647dda82c31bfb42e14cf01b9c1b8bae904e781370564f33df390470916
|
7
|
+
data.tar.gz: c698697b2d53e17a2321d430b01cd5746ef4eaf5623cb59b8a08200f86c4d3357037d85444c4141b23198bf4eba1aedd4915c8e79646717a761c02e8dd7d79b9
|
data/async-http.gemspec
CHANGED
@@ -19,7 +19,7 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.add_dependency("async", "~> 1.14")
|
20
20
|
spec.add_dependency("async-io", "~> 1.18")
|
21
21
|
|
22
|
-
spec.add_dependency("http-protocol", "~> 0.
|
22
|
+
spec.add_dependency("http-protocol", "~> 0.15")
|
23
23
|
|
24
24
|
# spec.add_dependency("openssl")
|
25
25
|
|
@@ -33,7 +33,7 @@ module Async
|
|
33
33
|
}
|
34
34
|
|
35
35
|
SERVER_SETTINGS = {
|
36
|
-
::HTTP::Protocol::HTTP2::Settings::ENABLE_PUSH =>
|
36
|
+
::HTTP::Protocol::HTTP2::Settings::ENABLE_PUSH => 1,
|
37
37
|
# We choose a lower maximum concurrent streams to avoid overloading a single connection/thread.
|
38
38
|
::HTTP::Protocol::HTTP2::Settings::MAXIMUM_CONCURRENT_STREAMS => 32,
|
39
39
|
::HTTP::Protocol::HTTP2::Settings::MAXIMUM_FRAME_SIZE => 0x100000,
|
@@ -57,6 +57,20 @@ module Async
|
|
57
57
|
|
58
58
|
return server
|
59
59
|
end
|
60
|
+
|
61
|
+
module WithPush
|
62
|
+
CLIENT_SETTINGS = HTTP2::CLIENT_SETTINGS.merge(
|
63
|
+
::HTTP::Protocol::HTTP2::Settings::ENABLE_PUSH => 1,
|
64
|
+
)
|
65
|
+
|
66
|
+
def self.client(stream, settings = CLIENT_SETTINGS)
|
67
|
+
HTTP2.client(stream, settings)
|
68
|
+
end
|
69
|
+
|
70
|
+
def self.server(stream, settings = SERVER_SETTINGS)
|
71
|
+
HTTP2.server(stream, settings)
|
72
|
+
end
|
73
|
+
end
|
60
74
|
end
|
61
75
|
end
|
62
76
|
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
# Copyright, 2019, by Samuel G. D. Williams. <http://www.codeotaku.com>
|
2
|
+
#
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
+
# of this software and associated documentation files (the "Software"), to deal
|
5
|
+
# in the Software without restriction, including without limitation the rights
|
6
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7
|
+
# copies of the Software, and to permit persons to whom the Software is
|
8
|
+
# furnished to do so, subject to the following conditions:
|
9
|
+
#
|
10
|
+
# The above copyright notice and this permission notice shall be included in
|
11
|
+
# all copies or substantial portions of the Software.
|
12
|
+
#
|
13
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
16
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
19
|
+
# THE SOFTWARE.
|
20
|
+
|
21
|
+
require_relative '../response'
|
22
|
+
|
23
|
+
module Async
|
24
|
+
module HTTP
|
25
|
+
module Protocol
|
26
|
+
module HTTP2
|
27
|
+
class Promise < Response
|
28
|
+
def initialize(protocol, headers, stream_id)
|
29
|
+
super(protocol, stream_id)
|
30
|
+
|
31
|
+
@request = build_request(headers)
|
32
|
+
end
|
33
|
+
|
34
|
+
attr :stream
|
35
|
+
attr :request
|
36
|
+
|
37
|
+
private def build_request(headers)
|
38
|
+
request = HTTP::Request.new
|
39
|
+
request.headers = Headers.new
|
40
|
+
|
41
|
+
headers.each do |key, value|
|
42
|
+
if key == SCHEME
|
43
|
+
return @stream.send_failure(400, "Request scheme already specified") if request.scheme
|
44
|
+
|
45
|
+
request.scheme = value
|
46
|
+
elsif key == AUTHORITY
|
47
|
+
return @stream.send_failure(400, "Request authority already specified") if request.authority
|
48
|
+
|
49
|
+
request.authority = value
|
50
|
+
elsif key == METHOD
|
51
|
+
return @stream.send_failure(400, "Request method already specified") if request.method
|
52
|
+
|
53
|
+
request.method = value
|
54
|
+
elsif key == PATH
|
55
|
+
return @stream.send_failure(400, "Request path already specified") if request.path
|
56
|
+
|
57
|
+
request.path = value
|
58
|
+
else
|
59
|
+
request.headers[key] = value
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
return request
|
64
|
+
end
|
65
|
+
|
66
|
+
undef send_request
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -40,6 +40,36 @@ module Async
|
|
40
40
|
false
|
41
41
|
end
|
42
42
|
|
43
|
+
def push?
|
44
|
+
@protocol.enable_push?
|
45
|
+
end
|
46
|
+
|
47
|
+
def create_promise_stream(headers, stream_id)
|
48
|
+
request = self.class.new(@protocol, stream_id)
|
49
|
+
request.receive_headers(self, headers, false)
|
50
|
+
|
51
|
+
return request.stream
|
52
|
+
end
|
53
|
+
|
54
|
+
# @return [Stream] the promised stream, on which to send data.
|
55
|
+
def push(path, headers = nil)
|
56
|
+
push_headers = [
|
57
|
+
[SCHEME, @scheme],
|
58
|
+
[METHOD, GET],
|
59
|
+
[PATH, path],
|
60
|
+
[AUTHORITY, @authority]
|
61
|
+
]
|
62
|
+
|
63
|
+
if headers
|
64
|
+
push_headers = Headers::Merged.new(
|
65
|
+
push_headers,
|
66
|
+
headers
|
67
|
+
)
|
68
|
+
end
|
69
|
+
|
70
|
+
@stream.send_push_promise(push_headers)
|
71
|
+
end
|
72
|
+
|
43
73
|
def receive_headers(stream, headers, end_stream)
|
44
74
|
headers.each do |key, value|
|
45
75
|
if key == SCHEME
|
@@ -36,6 +36,20 @@ module Async
|
|
36
36
|
|
37
37
|
@notification = Async::Notification.new
|
38
38
|
@exception = nil
|
39
|
+
|
40
|
+
@promises = nil
|
41
|
+
end
|
42
|
+
|
43
|
+
def promises
|
44
|
+
@promises ||= Async::Queue.new
|
45
|
+
end
|
46
|
+
|
47
|
+
def create_promise_stream(headers, stream_id)
|
48
|
+
promise = Promise.new(@protocol, headers, stream_id)
|
49
|
+
|
50
|
+
self.promises.enqueue(promise)
|
51
|
+
|
52
|
+
return promise.stream
|
39
53
|
end
|
40
54
|
|
41
55
|
# Notify anyone waiting on the response headers to be received (or failure).
|
@@ -44,6 +58,10 @@ module Async
|
|
44
58
|
@notification.signal
|
45
59
|
@notification = nil
|
46
60
|
end
|
61
|
+
|
62
|
+
# if @input
|
63
|
+
# @input.close(@exception)
|
64
|
+
# end
|
47
65
|
end
|
48
66
|
|
49
67
|
# Wait for the headers to be received or for stream reset.
|
@@ -39,6 +39,10 @@ module Async
|
|
39
39
|
attr_accessor :delegate
|
40
40
|
attr :body
|
41
41
|
|
42
|
+
def create_promise_stream(headers, stream_id)
|
43
|
+
@delegate.create_promise_stream(headers, stream_id)
|
44
|
+
end
|
45
|
+
|
42
46
|
def send_body(body, task: Async::Task.current)
|
43
47
|
# TODO Might need to stop this task when body is cancelled.
|
44
48
|
@task = task.async do |subtask|
|
@@ -100,7 +104,7 @@ module Async
|
|
100
104
|
def receive_headers(frame)
|
101
105
|
headers = super
|
102
106
|
|
103
|
-
delegate.receive_headers(self, headers, frame.end_stream?)
|
107
|
+
@delegate.receive_headers(self, headers, frame.end_stream?)
|
104
108
|
|
105
109
|
return headers
|
106
110
|
end
|
@@ -109,7 +113,7 @@ module Async
|
|
109
113
|
data = super
|
110
114
|
|
111
115
|
if data
|
112
|
-
delegate.receive_data(self, data, frame.end_stream?)
|
116
|
+
@delegate.receive_data(self, data, frame.end_stream?)
|
113
117
|
end
|
114
118
|
|
115
119
|
return data
|
@@ -123,7 +127,7 @@ module Async
|
|
123
127
|
@body = nil
|
124
128
|
end
|
125
129
|
|
126
|
-
delegate.receive_reset_stream(self, error_code)
|
130
|
+
@delegate.receive_reset_stream(self, error_code)
|
127
131
|
|
128
132
|
return error_code
|
129
133
|
end
|
@@ -134,7 +138,7 @@ module Async
|
|
134
138
|
@body = nil
|
135
139
|
end
|
136
140
|
|
137
|
-
delegate.stop_connection(error)
|
141
|
+
@delegate.stop_connection(error)
|
138
142
|
end
|
139
143
|
end
|
140
144
|
end
|
data/lib/async/http/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: async-http
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.38.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Samuel Williams
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-02-
|
11
|
+
date: 2019-02-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: async
|
@@ -44,14 +44,14 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '0.
|
47
|
+
version: '0.15'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '0.
|
54
|
+
version: '0.15'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: async-rspec
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -183,6 +183,7 @@ files:
|
|
183
183
|
- lib/async/http/protocol/http2.rb
|
184
184
|
- lib/async/http/protocol/http2/client.rb
|
185
185
|
- lib/async/http/protocol/http2/connection.rb
|
186
|
+
- lib/async/http/protocol/http2/promise.rb
|
186
187
|
- lib/async/http/protocol/http2/request.rb
|
187
188
|
- lib/async/http/protocol/http2/response.rb
|
188
189
|
- lib/async/http/protocol/http2/server.rb
|