async-http 0.45.9 → 0.46.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 +4 -4
- data/lib/async/http/client.rb +4 -0
- data/lib/async/http/endpoint.rb +14 -12
- data/lib/async/http/protocol/http1.rb +10 -4
- data/lib/async/http/protocol/http1/server.rb +5 -0
- data/lib/async/http/protocol/http10.rb +4 -0
- data/lib/async/http/protocol/http11.rb +4 -0
- data/lib/async/http/protocol/http2.rb +8 -0
- data/lib/async/http/protocol/http2/connection.rb +19 -19
- data/lib/async/http/protocol/https.rb +7 -2
- data/lib/async/http/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 354c7fb881a4d777bdf8f19a4c333b832e3bbc81f4dfa7e9851c3aa983d9bc7b
|
4
|
+
data.tar.gz: 9408b0a577c8162b2479e485e1d098d271717c8f9043a9c1bfa931655b650821
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 709eb4507c6d562ae0eb69594ccb7f77d88d48be7259ac3ed215bb84a4c6e3de252fe9aff141cbbc1bd98e522b2d36442b4ce9dfab715b64a7ded784b00224a1
|
7
|
+
data.tar.gz: 9d45db2e2e87d3c89da79518ea7c0685b005c8b07ea295b7501a5ec6f093786c35ec6fe7b858d66c0ce57397ab295488694711681a7e7c4b4109ad4a38d6b76a
|
data/lib/async/http/client.rb
CHANGED
@@ -34,6 +34,10 @@ module Async
|
|
34
34
|
# * If there are already connections, it will reuse it.
|
35
35
|
# * If a request fails, it will retry it up to N times if it was idempotent.
|
36
36
|
# The client object will never become unusable. It internally manages persistent connections (or non-persistent connections if that's required).
|
37
|
+
# @param endpoint [Endpoint] the endpoint to connnect to.
|
38
|
+
# @param protocol [Protocol::HTTP1 | Protocol::HTTP2 | Protocol::HTTPS] the protocol to use.
|
39
|
+
# @param scheme [String] The default scheme to set to requests.
|
40
|
+
# @param authority [String] The default authority to set to requests.
|
37
41
|
def initialize(endpoint, protocol = endpoint.protocol, scheme = endpoint.scheme, authority = endpoint.authority, retries: 3, connection_limit: nil)
|
38
42
|
@endpoint = endpoint
|
39
43
|
@protocol = protocol
|
data/lib/async/http/endpoint.rb
CHANGED
@@ -27,11 +27,12 @@ require_relative 'protocol/https'
|
|
27
27
|
|
28
28
|
module Async
|
29
29
|
module HTTP
|
30
|
+
# Represents a way to connect to a remote HTTP server.
|
30
31
|
class Endpoint < Async::IO::Endpoint
|
31
32
|
def self.parse(string, **options)
|
32
33
|
url = URI.parse(string).normalize
|
33
34
|
|
34
|
-
self.new(url, **options)
|
35
|
+
return self.new(url, nil, **options)
|
35
36
|
end
|
36
37
|
|
37
38
|
# @option scheme [String] the scheme to use, overrides the URL scheme.
|
@@ -67,7 +68,6 @@ module Async
|
|
67
68
|
end
|
68
69
|
|
69
70
|
attr :url
|
70
|
-
attr :options
|
71
71
|
|
72
72
|
def address
|
73
73
|
endpoint.address
|
@@ -78,10 +78,12 @@ module Async
|
|
78
78
|
end
|
79
79
|
|
80
80
|
def protocol
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
81
|
+
@options.fetch(:protocol) do
|
82
|
+
if secure?
|
83
|
+
Protocol::HTTPS
|
84
|
+
else
|
85
|
+
Protocol::HTTP1
|
86
|
+
end
|
85
87
|
end
|
86
88
|
end
|
87
89
|
|
@@ -124,18 +126,17 @@ module Async
|
|
124
126
|
return buffer
|
125
127
|
end
|
126
128
|
|
127
|
-
DEFAULT_ALPN_PROTOCOLS = ['h2', 'http/1.1'].freeze
|
128
|
-
|
129
129
|
def alpn_protocols
|
130
|
-
@options
|
130
|
+
@options.fetch(:alpn_protocols) {self.protocol.names}
|
131
131
|
end
|
132
132
|
|
133
|
-
|
133
|
+
def localhost?
|
134
|
+
self.hostname =~ /^(.*?\.)?localhost\.?$/
|
135
|
+
end
|
134
136
|
|
135
137
|
# We don't try to validate peer certificates when talking to localhost because they would always be self-signed.
|
136
138
|
def ssl_verify_mode
|
137
|
-
|
138
|
-
when LOCALHOST
|
139
|
+
if self.localhost?
|
139
140
|
OpenSSL::SSL::VERIFY_NONE
|
140
141
|
else
|
141
142
|
OpenSSL::SSL::VERIFY_PEER
|
@@ -162,6 +163,7 @@ module Async
|
|
162
163
|
options.delete(:hostname)
|
163
164
|
options.delete(:ssl_context)
|
164
165
|
options.delete(:alpn_protocols)
|
166
|
+
options.delete(:protocol)
|
165
167
|
|
166
168
|
return options
|
167
169
|
end
|
@@ -27,14 +27,20 @@ module Async
|
|
27
27
|
module HTTP1
|
28
28
|
VERSION = "HTTP/1.1"
|
29
29
|
|
30
|
+
def self.bidirectional?
|
31
|
+
true
|
32
|
+
end
|
33
|
+
|
30
34
|
def self.client(stream)
|
31
|
-
Client.new(stream, VERSION)
|
35
|
+
HTTP1::Client.new(stream, VERSION)
|
32
36
|
end
|
33
37
|
|
34
|
-
# A server that supports both HTTP1.0 and HTTP1.1 semantics by detecting the version of the request.
|
35
|
-
# TODO Verify correct behaviour.
|
36
38
|
def self.server(stream)
|
37
|
-
Server.new(stream, VERSION)
|
39
|
+
HTTP1::Server.new(stream, VERSION)
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.names
|
43
|
+
["http/1.1", "http/1.0"]
|
38
44
|
end
|
39
45
|
end
|
40
46
|
end
|
@@ -53,6 +53,11 @@ module Async
|
|
53
53
|
# Server loop.
|
54
54
|
def each(task: Task.current)
|
55
55
|
while request = next_request
|
56
|
+
Async.logger.debug(self) do |buffer|
|
57
|
+
buffer.puts "Incoming request: #{request.authority} #{request.method} #{request.path} #{request.version}"
|
58
|
+
buffer.puts "Incoming headers: #{request.headers}"
|
59
|
+
end
|
60
|
+
|
56
61
|
response = yield(request, self)
|
57
62
|
|
58
63
|
return if @stream.nil? or @stream.closed?
|
@@ -63,6 +63,10 @@ module Async
|
|
63
63
|
return server
|
64
64
|
end
|
65
65
|
|
66
|
+
def self.names
|
67
|
+
["h2"]
|
68
|
+
end
|
69
|
+
|
66
70
|
module WithPush
|
67
71
|
CLIENT_SETTINGS = HTTP2::CLIENT_SETTINGS.merge(
|
68
72
|
::Protocol::HTTP2::Settings::ENABLE_PUSH => 1,
|
@@ -75,6 +79,10 @@ module Async
|
|
75
79
|
def self.server(stream, settings = SERVER_SETTINGS)
|
76
80
|
HTTP2.server(stream, settings)
|
77
81
|
end
|
82
|
+
|
83
|
+
def self.names
|
84
|
+
HTTP2.names
|
85
|
+
end
|
78
86
|
end
|
79
87
|
end
|
80
88
|
end
|
@@ -124,25 +124,25 @@ module Async
|
|
124
124
|
VERSION
|
125
125
|
end
|
126
126
|
|
127
|
-
def encode_headers(headers, buffer = String.new.b)
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
end
|
136
|
-
|
137
|
-
def decode_headers(data)
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
end
|
127
|
+
# def encode_headers(headers, buffer = String.new.b)
|
128
|
+
# super.tap do |data|
|
129
|
+
# Async.logger.debug(self) do |buffer|
|
130
|
+
# buffer.puts "Encode headers: #{headers.inspect}"
|
131
|
+
# buffer.puts "-> #{data.inspect}"
|
132
|
+
# buffer.puts "@encoder: #{@encoder.inspect}"
|
133
|
+
# end
|
134
|
+
# end
|
135
|
+
# end
|
136
|
+
#
|
137
|
+
# def decode_headers(data)
|
138
|
+
# super.tap do |headers|
|
139
|
+
# Async.logger.debug(self) do |buffer|
|
140
|
+
# buffer.puts "Decode headers: #{data.inspect}"
|
141
|
+
# buffer.puts "-> #{headers.inspect}"
|
142
|
+
# buffer.puts "@decoder: #{@decoder.inspect}"
|
143
|
+
# end
|
144
|
+
# end
|
145
|
+
# end
|
146
146
|
end
|
147
147
|
end
|
148
148
|
end
|
@@ -49,9 +49,9 @@ module Async
|
|
49
49
|
# A server that supports both HTTP1.0 and HTTP1.1 semantics by detecting the version of the request.
|
50
50
|
module HTTPS
|
51
51
|
HANDLERS = {
|
52
|
-
"http/1.0" => HTTP10,
|
53
|
-
"http/1.1" => HTTP11,
|
54
52
|
"h2" => HTTP2,
|
53
|
+
"http/1.1" => HTTP11,
|
54
|
+
"http/1.0" => HTTP10,
|
55
55
|
nil => HTTP11,
|
56
56
|
}
|
57
57
|
|
@@ -75,6 +75,11 @@ module Async
|
|
75
75
|
def self.server(stream)
|
76
76
|
protocol_for(stream).server(stream)
|
77
77
|
end
|
78
|
+
|
79
|
+
# Supported Application Layer Protocol Negotiation names:
|
80
|
+
def self.names
|
81
|
+
HANDLERS.keys.compact
|
82
|
+
end
|
78
83
|
end
|
79
84
|
end
|
80
85
|
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.46.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-06-
|
11
|
+
date: 2019-06-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: async
|