net-http2 0.11.1 → 0.12.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 618746ed38048396ce0529e2cfc7dc54ef55e7e7
4
- data.tar.gz: 440e0f1c44862ee9b1ec7361a959dadad63d055e
3
+ metadata.gz: e3f05adbbbbe99f8eb15097186a59db80eb66042
4
+ data.tar.gz: e22193008420db5d3dffffab3a39ba73eff062df
5
5
  SHA512:
6
- metadata.gz: c6cc66b09ca67e19fadadefcc23945ad84122573e66abb224447a8cc37298535f375db1a240fd3df91d880f67a42a1413398758ae8a64599d76a8e4681cf19f3
7
- data.tar.gz: 229fb34136410233aa464c2612876ede3c184a0cfd27ab47bc944e9e699f9af48bbc0eb308002eaf3d95aa1e081dba2fdc93d5822f94eec7904613b555ae4b42
6
+ metadata.gz: 8ede872c9f2ed793b385354507dd0bc0dc4bb66fef127afa673eddb005e19125342faf94b977cd1994803b239b36425ebbe40bee044bdf1e82d1343d9051b21a
7
+ data.tar.gz: 2e4e48b32df8d4860590d155b15d4bfd363a8f10d27897ab2ff3643c7a93827ff10fd40b7bdfe2be0a9c3bd7ffb11df45981053e34140f894e0c9273294f6303
@@ -1 +1 @@
1
- ruby-2.3.0
1
+ ruby-2.3.1
data/README.md CHANGED
@@ -58,10 +58,8 @@ request.on(:close) { puts "request completed!" }
58
58
  # send
59
59
  client.call_async(request)
60
60
 
61
- # We need to wait for the callbacks to be triggered, so here's a quick and dirty fix for this example.
62
- # In real life, if you are using async requests you probably have a running loop that keeps
63
- # your program alive.
64
- sleep 5
61
+ # Wait for all outgoing stream to be closed
62
+ client.join
65
63
 
66
64
  # close the connection
67
65
  client.close
@@ -115,7 +113,6 @@ These behave similarly to HTTP/1 calls.
115
113
  response_3 = client.call(:post, '/path3', body: "the request body", timeout: 1)
116
114
  ```
117
115
 
118
-
119
116
  ##### Non-blocking calls
120
117
  The real benefit of HTTP/2 is being able to receive body and header streams. Instead of buffering the whole response, you might want to react immediately upon receiving those streams. This is what non-blocking calls are for.
121
118
 
@@ -127,26 +124,14 @@ The real benefit of HTTP/2 is being able to receive body and header streams. Ins
127
124
  request = client.prepare_request(:get, '/path', headers: { 'x-custom-header' => 'custom' })
128
125
  ```
129
126
 
130
- * **on(event, &block)**
131
-
132
- Allows to set a callback for the request. Available events are:
133
-
134
- * `:headers`: triggered when headers are received (called once).
135
- * `:body_chunk`: triggered when body chunks are received (may be called multiple times).
136
- * `:close`: triggered when the request has been completed (called once).
137
-
138
- Even if NetHttp2 is thread-safe, the async callbacks will be executed in a different thread, so ensure that your code in the callbacks is thread-safe.
139
-
140
- ```ruby
141
- request.on(:headers) { |headers| p headers }
142
- request.on(:body_chunk) { |chunk| p chunk }
143
- request.on(:close) { puts "request completed!" }
144
- ```
145
-
146
127
  * **call_async(request)**
147
128
 
148
129
  Calls the server with the async request.
149
130
 
131
+ * **join**
132
+
133
+ Wait for all outstanding requests to be completed.
134
+
150
135
 
151
136
  ### `NetHttp2::Request`
152
137
 
@@ -172,6 +157,22 @@ The real benefit of HTTP/2 is being able to receive body and header streams. Ins
172
157
 
173
158
  The request's timeout.
174
159
 
160
+ * **on(event, &block)**
161
+
162
+ Allows to set a callback for the request. Available events are:
163
+
164
+ * `:headers`: triggered when headers are received (called once).
165
+ * `:body_chunk`: triggered when body chunks are received (may be called multiple times).
166
+ * `:close`: triggered when the request has been completed (called once).
167
+
168
+ Even if NetHttp2 is thread-safe, the async callbacks will be executed in a different thread, so ensure that your code in the callbacks is thread-safe.
169
+
170
+ ```ruby
171
+ request.on(:headers) { |headers| p headers }
172
+ request.on(:body_chunk) { |chunk| p chunk }
173
+ request.on(:close) { puts "request completed!" }
174
+ ```
175
+
175
176
 
176
177
  ### `NetHttp2::Response`
177
178
 
@@ -44,6 +44,20 @@ module NetHttp2
44
44
  init_vars
45
45
  end
46
46
 
47
+ def join
48
+ while !@streams.empty? do
49
+ sleep 0.05
50
+ end
51
+ end
52
+
53
+ def add_stream_to_monitor(stream)
54
+ @streams[stream.id] = true
55
+ end
56
+
57
+ def mark_stream_as_closed(stream)
58
+ @streams.delete(stream.id)
59
+ end
60
+
47
61
  private
48
62
 
49
63
  def init_vars
@@ -52,10 +66,11 @@ module NetHttp2
52
66
  @socket_thread = nil
53
67
  @first_data_sent = false
54
68
  @mutex = Mutex.new
69
+ @streams = {}
55
70
  end
56
71
 
57
72
  def new_stream
58
- NetHttp2::Stream.new(uri: @uri, h2_stream: h2.new_stream)
73
+ NetHttp2::Stream.new(client: self, h2_stream: h2.new_stream)
59
74
  end
60
75
 
61
76
  def ensure_open
@@ -69,14 +84,15 @@ module NetHttp2
69
84
 
70
85
  begin
71
86
  socket_loop
72
- rescue EOFError
87
+ rescue Exception => e
73
88
  # socket closed
89
+ Thread.main.raise e
74
90
  ensure
75
91
  @socket.close unless @socket.closed?
76
92
  @socket = nil
77
93
  @socket_thread = nil
78
94
  end
79
- end.tap { |t| t.abort_on_exception = true }
95
+ end
80
96
  end
81
97
  end
82
98
 
@@ -3,6 +3,7 @@ module NetHttp2
3
3
  class Stream
4
4
 
5
5
  def initialize(options={})
6
+ @client = options[:client]
6
7
  @h2_stream = options[:h2_stream]
7
8
  @headers = {}
8
9
  @data = ''
@@ -12,12 +13,15 @@ module NetHttp2
12
13
  @mutex = Mutex.new
13
14
  @cv = ConditionVariable.new
14
15
 
15
-
16
16
  listen_for_headers
17
17
  listen_for_data
18
18
  listen_for_close
19
19
  end
20
20
 
21
+ def id
22
+ @h2_stream.id
23
+ end
24
+
21
25
  def call_with(request)
22
26
  @request = request
23
27
  send_request_data
@@ -27,6 +31,8 @@ module NetHttp2
27
31
  def async_call_with(request)
28
32
  @request = request
29
33
  @async = true
34
+ @client.add_stream_to_monitor(self)
35
+
30
36
  send_request_data
31
37
  end
32
38
 
@@ -68,6 +74,7 @@ module NetHttp2
68
74
 
69
75
  if async?
70
76
  @request.emit(:close, data)
77
+ @client.mark_stream_as_closed(self)
71
78
  else
72
79
  @mutex.synchronize { @cv.signal }
73
80
  end
@@ -1,3 +1,3 @@
1
1
  module NetHttp2
2
- VERSION = "0.11.1"
2
+ VERSION = "0.12.0"
3
3
  end
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.11.1
4
+ version: 0.12.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-24 00:00:00.000000000 Z
11
+ date: 2016-06-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: http-2