net-http2 0.10.0 → 0.11.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/README.md +4 -1
- data/lib/net-http2.rb +1 -0
- data/lib/net-http2/client.rb +5 -16
- data/lib/net-http2/socket.rb +50 -0
- data/lib/net-http2/stream.rb +11 -7
- data/lib/net-http2/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2f412e44e24ba9a2bdb452b616a6e0102fe8be71
|
4
|
+
data.tar.gz: 1f0149a8b2aace96f40bb6da2f56983ada7d2e3f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f8427579c27e5ece7b87659fbc263ce96b243308ae6ff571ef94071804efdc59e604a8c46eb95ffbee57161bfaf9d85eba9d1556cb33b20f68b829a18d26fdd2
|
7
|
+
data.tar.gz: 3b79aa2279ab86dcd05bec6495fbb3f8bf28a218efee9af89e45031288dcb7f7332c9e8a36ee15b215bd2e3df22b70061a5a4bb27b6be9fea5a98bd939210eed
|
data/README.md
CHANGED
@@ -76,7 +76,10 @@ client.close
|
|
76
76
|
* **new(url, options={})** → **`NetHttp2::Client`**
|
77
77
|
|
78
78
|
Returns a new client. `url` is a `string` such as `http://nghttp2.org`.
|
79
|
-
The
|
79
|
+
The current options are:
|
80
|
+
|
81
|
+
* `:connect_timeout`, specifies the max connect timeout in seconds (defaults to 60).
|
82
|
+
* `:ssl_context`, in case the url has an https scheme and you want your SSL client to use a custom context.
|
80
83
|
|
81
84
|
To create a new client:
|
82
85
|
```ruby
|
data/lib/net-http2.rb
CHANGED
data/lib/net-http2/client.rb
CHANGED
@@ -11,8 +11,9 @@ module NetHttp2
|
|
11
11
|
attr_reader :uri
|
12
12
|
|
13
13
|
def initialize(url, options={})
|
14
|
-
@uri
|
15
|
-
@
|
14
|
+
@uri = URI.parse(url)
|
15
|
+
@connect_timeout = options[:connect_timeout] || 60
|
16
|
+
@ssl_context = add_npn_to_context(options[:ssl_context] || OpenSSL::SSL::SSLContext.new)
|
16
17
|
|
17
18
|
@is_ssl = (@uri.scheme == 'https')
|
18
19
|
|
@@ -99,24 +100,12 @@ module NetHttp2
|
|
99
100
|
end
|
100
101
|
|
101
102
|
def new_socket
|
102
|
-
|
103
|
-
|
104
|
-
if ssl?
|
105
|
-
socket = OpenSSL::SSL::SSLSocket.new(tcp, @ssl_context)
|
106
|
-
socket.sync_close = true
|
107
|
-
socket.hostname = @uri.hostname
|
108
|
-
|
109
|
-
socket.connect
|
110
|
-
|
111
|
-
socket
|
112
|
-
else
|
113
|
-
tcp
|
114
|
-
end
|
103
|
+
NetHttp2::Socket.create(@uri, ssl: ssl?, ssl_context: @ssl_context, connect_timeout: @connect_timeout)
|
115
104
|
end
|
116
105
|
|
117
106
|
def ensure_sent_before_receiving
|
118
107
|
while !@first_data_sent
|
119
|
-
sleep 0.
|
108
|
+
sleep 0.01
|
120
109
|
end
|
121
110
|
end
|
122
111
|
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module NetHttp2
|
2
|
+
|
3
|
+
module Socket
|
4
|
+
|
5
|
+
def self.create(uri, options)
|
6
|
+
options[:ssl] ? ssl_socket(uri, options) : tcp_socket(uri, options)
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.ssl_socket(uri, options)
|
10
|
+
tcp = tcp_socket(uri, options)
|
11
|
+
|
12
|
+
socket = OpenSSL::SSL::SSLSocket.new(tcp, options[:ssl_context])
|
13
|
+
socket.sync_close = true
|
14
|
+
socket.hostname = uri.hostname
|
15
|
+
|
16
|
+
socket.connect
|
17
|
+
|
18
|
+
socket
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.tcp_socket(uri, options)
|
22
|
+
family = ::Socket::AF_INET
|
23
|
+
address = ::Socket.getaddrinfo(uri.host, nil, family).first[3]
|
24
|
+
sockaddr = ::Socket.pack_sockaddr_in(uri.port, address)
|
25
|
+
|
26
|
+
socket = ::Socket.new(family, ::Socket::SOCK_STREAM, 0)
|
27
|
+
socket.setsockopt(::Socket::IPPROTO_TCP, ::Socket::TCP_NODELAY, 1)
|
28
|
+
|
29
|
+
begin
|
30
|
+
socket.connect_nonblock(sockaddr)
|
31
|
+
rescue IO::WaitWritable
|
32
|
+
if IO.select(nil, [socket], nil, options[:connect_timeout])
|
33
|
+
begin
|
34
|
+
socket.connect_nonblock(sockaddr)
|
35
|
+
rescue Errno::EISCONN
|
36
|
+
# socket is connected
|
37
|
+
rescue
|
38
|
+
socket.close
|
39
|
+
raise
|
40
|
+
end
|
41
|
+
else
|
42
|
+
socket.close
|
43
|
+
raise Errno::ETIMEDOUT
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
socket
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
data/lib/net-http2/stream.rb
CHANGED
@@ -7,8 +7,11 @@ module NetHttp2
|
|
7
7
|
@headers = {}
|
8
8
|
@data = ''
|
9
9
|
@request = nil
|
10
|
-
@completed = false
|
11
10
|
@async = false
|
11
|
+
@completed = false
|
12
|
+
@mutex = Mutex.new
|
13
|
+
@cv = ConditionVariable.new
|
14
|
+
|
12
15
|
|
13
16
|
listen_for_headers
|
14
17
|
listen_for_data
|
@@ -62,7 +65,12 @@ module NetHttp2
|
|
62
65
|
def listen_for_close
|
63
66
|
@h2_stream.on(:close) do |data|
|
64
67
|
@completed = true
|
65
|
-
|
68
|
+
|
69
|
+
if async?
|
70
|
+
@request.emit(:close, data)
|
71
|
+
else
|
72
|
+
@mutex.synchronize { @cv.signal }
|
73
|
+
end
|
66
74
|
end
|
67
75
|
end
|
68
76
|
|
@@ -85,11 +93,7 @@ module NetHttp2
|
|
85
93
|
end
|
86
94
|
|
87
95
|
def wait_for_completed
|
88
|
-
|
89
|
-
|
90
|
-
while !@completed && Time.now < cutoff_time
|
91
|
-
sleep 0.1
|
92
|
-
end
|
96
|
+
@mutex.synchronize { @cv.wait(@mutex, @request.timeout) }
|
93
97
|
end
|
94
98
|
end
|
95
99
|
end
|
data/lib/net-http2/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: net-http2
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.11.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Roberto Ostinelli
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-05-
|
11
|
+
date: 2016-05-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: http-2
|
@@ -88,6 +88,7 @@ files:
|
|
88
88
|
- lib/net-http2/client.rb
|
89
89
|
- lib/net-http2/request.rb
|
90
90
|
- lib/net-http2/response.rb
|
91
|
+
- lib/net-http2/socket.rb
|
91
92
|
- lib/net-http2/stream.rb
|
92
93
|
- lib/net-http2/version.rb
|
93
94
|
- net-http2.gemspec
|