jubilee 2.0.0.beta-java → 2.0.0-java
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/examples/chatapp/Gemfile +1 -1
- data/examples/chatapp/Gemfile.lock +2 -2
- data/lib/jubilee/jubilee.jar +0 -0
- data/lib/jubilee/version.rb +1 -1
- data/lib/vertx.rb +1 -0
- data/lib/vertx/http.rb +677 -0
- data/lib/vertx/ssl_support.rb +143 -0
- data/lib/vertx/streams.rb +172 -0
- data/lib/vertx/tcp_support.rb +150 -0
- data/lib/vertx/wrapped_handler.rb +28 -0
- metadata +9 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 31e24331a936300e3f3bb67b16e5b05376fcb2aa
|
4
|
+
data.tar.gz: 22ec68885ddfd56a2b0d42fe1be450e40d596e7b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ad993339e4c2e8ff3314c17836fd8902c83db105b86554b88d90bc38d0117d25548919dcad367cd204f013b39639d4a94191b50d158f5d836906fe045b5d9b5f
|
7
|
+
data.tar.gz: 8e3144d4805b226a6e82da0f01ec069402cf21d050eb0df1af16ab89e4dd42c1885c82de3c88ad1773fc46be3d6a5147efbcf470bc1f995a587f8d658067554b
|
data/examples/chatapp/Gemfile
CHANGED
@@ -4,7 +4,7 @@ GEM
|
|
4
4
|
ffi (1.9.3-java)
|
5
5
|
haml (4.0.4)
|
6
6
|
tilt
|
7
|
-
jubilee (2.0.0.
|
7
|
+
jubilee (2.0.0.beta-java)
|
8
8
|
rack (>= 1.4.1)
|
9
9
|
spoon (~> 0.0.4)
|
10
10
|
rack (1.5.2)
|
@@ -23,5 +23,5 @@ PLATFORMS
|
|
23
23
|
|
24
24
|
DEPENDENCIES
|
25
25
|
haml
|
26
|
-
jubilee (= 2.0.0.
|
26
|
+
jubilee (= 2.0.0.beta)
|
27
27
|
sinatra
|
data/lib/jubilee/jubilee.jar
CHANGED
Binary file
|
data/lib/jubilee/version.rb
CHANGED
data/lib/vertx.rb
CHANGED
data/lib/vertx/http.rb
ADDED
@@ -0,0 +1,677 @@
|
|
1
|
+
# Copyright 2011 the original author or authors.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
require 'vertx/streams'
|
16
|
+
require 'vertx/ssl_support'
|
17
|
+
require 'vertx/tcp_support'
|
18
|
+
require 'vertx/wrapped_handler'
|
19
|
+
|
20
|
+
module Vertx
|
21
|
+
# An HTTP client.
|
22
|
+
# A client maintains a pool of connections to a specific host, at a specific port. The HTTP connections can act
|
23
|
+
# as pipelines for HTTP requests.
|
24
|
+
# It is used as a factory for {HttpClientRequest} instances which encapsulate the actual HTTP requests. It is also
|
25
|
+
# used as a factory for {WebSocket WebSockets}.
|
26
|
+
#
|
27
|
+
# @author {http://tfox.org Tim Fox}
|
28
|
+
class HttpClient
|
29
|
+
|
30
|
+
include SSLSupport, ClientSSLSupport, TCPSupport
|
31
|
+
|
32
|
+
# Create a new HttpClient
|
33
|
+
def initialize(config = {})
|
34
|
+
@j_del = org.jruby.jubilee.vertx.JubileeVertx.vertx().createHttpClient()
|
35
|
+
self.compression = config[:try_compression] if config.has_key?(:try_compression)
|
36
|
+
end
|
37
|
+
|
38
|
+
# Enables HTTP compression.
|
39
|
+
# exposes a = method to set or unset compression support.
|
40
|
+
# @param [Boolean] supported whether enable compression or not
|
41
|
+
def compression=(supported)
|
42
|
+
@j_del.setTryUseCompression(supported)
|
43
|
+
end
|
44
|
+
|
45
|
+
# Tests if client is trying to use HTTP compression or not
|
46
|
+
# @return [Boolean] true if Client is trying using HTTP compression, false if it doesn't
|
47
|
+
def compression
|
48
|
+
@j_del.getTryUseCompression
|
49
|
+
end
|
50
|
+
|
51
|
+
# Letting the developer choose between compression? or compression while developing
|
52
|
+
alias_method :compression?, :compression
|
53
|
+
|
54
|
+
# Set the exception handler.
|
55
|
+
# @param [Block] hndlr A block to be used as the handler
|
56
|
+
def exception_handler(&hndlr)
|
57
|
+
@j_del.exceptionHandler(hndlr)
|
58
|
+
self
|
59
|
+
end
|
60
|
+
|
61
|
+
# Set the maximum pool size.
|
62
|
+
# The client will maintain up to this number of HTTP connections in an internal pool
|
63
|
+
# @param [FixNum] val. The maximum number of connections (default to 1).
|
64
|
+
def max_pool_size=(val)
|
65
|
+
@j_del.setMaxPoolSize(val)
|
66
|
+
self
|
67
|
+
end
|
68
|
+
|
69
|
+
# Get or set the max pool size
|
70
|
+
def max_pool_size(val = nil)
|
71
|
+
if val
|
72
|
+
@j_del.setMaxPoolSize(val)
|
73
|
+
self
|
74
|
+
else
|
75
|
+
@j_del.getMaxPoolSize
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
# If val is true then, after the request has ended the connection will be returned to the pool
|
80
|
+
# where it can be used by another request. In this manner, many HTTP requests can be pipe-lined over an HTTP connection.
|
81
|
+
# Keep alive connections will not be closed until the {#close} method is invoked.
|
82
|
+
# If val is false then a new connection will be created for each request and it won't ever go in the pool,
|
83
|
+
# the connection will closed after the response has been received. Even with no keep alive, the client will not allow more
|
84
|
+
# than {#max_pool_size} connections to be created at any one time.
|
85
|
+
# @param [Boolean] val. The value to use for keep_alive
|
86
|
+
def keep_alive=(val)
|
87
|
+
@j_del.setTCPKeepAlive(val)
|
88
|
+
self
|
89
|
+
end
|
90
|
+
|
91
|
+
# Get or set keep alive
|
92
|
+
def keep_alive(val = nil)
|
93
|
+
if val
|
94
|
+
@j_del.setKeepAlive(val)
|
95
|
+
self
|
96
|
+
else
|
97
|
+
@j_del.isKeepAlive
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
# Set the port that the client will attempt to connect to on the server on. The default value is 80
|
102
|
+
# @param [FixNum] val. The port value.
|
103
|
+
def port=(val)
|
104
|
+
@j_del.setPort(val)
|
105
|
+
self
|
106
|
+
end
|
107
|
+
|
108
|
+
# Get or set port
|
109
|
+
def port(val = nil)
|
110
|
+
if val
|
111
|
+
@j_del.setPort(val)
|
112
|
+
self
|
113
|
+
else
|
114
|
+
@j_del.getPort
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
# Set the host name or ip address that the client will attempt to connect to on the server on.
|
119
|
+
# @param [String] host. The host name or ip address to connect to.
|
120
|
+
def host=(val)
|
121
|
+
@j_del.setHost(val)
|
122
|
+
self
|
123
|
+
end
|
124
|
+
|
125
|
+
# Get or set host
|
126
|
+
def host(val = nil)
|
127
|
+
if val
|
128
|
+
@j_del.setHost(val)
|
129
|
+
self
|
130
|
+
else
|
131
|
+
@j_del.getHost
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
# Get or set verify host
|
136
|
+
def verify_host(val = nil)
|
137
|
+
if val
|
138
|
+
@j_del.setVerifyHost(val)
|
139
|
+
self
|
140
|
+
else
|
141
|
+
@j_del.isVerifyHost
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
# Gets the max WebSocket Frame size in bytes
|
146
|
+
# @return [int] Max WebSocket frame size
|
147
|
+
def max_websocket_frame_size
|
148
|
+
@j_del.getMaxWebSocketFrameSize
|
149
|
+
end
|
150
|
+
|
151
|
+
# Sets the maximum WebSocket frame size in bytes. Default is 65536 bytes.
|
152
|
+
# @param [int] size
|
153
|
+
def max_websocket_frame_size=(size)
|
154
|
+
@j_del.setMaxWebSocketFrameSize(size)
|
155
|
+
end
|
156
|
+
|
157
|
+
# Attempt to connect a WebSocket to the specified URI.
|
158
|
+
# The connect is done asynchronously and the handler is called with a {WebSocket} on success.
|
159
|
+
# @param [String] uri. A relative URI where to connect the WebSocket on the host, e.g. /some/path
|
160
|
+
# @param [Block] hndlr. The handler to be called with the {WebSocket}
|
161
|
+
def connect_web_socket(uri, &hndlr)
|
162
|
+
@j_del.connectWebsocket(uri) { |j_ws| hndlr.call(WebSocket.new(j_ws)) }
|
163
|
+
self
|
164
|
+
end
|
165
|
+
|
166
|
+
# This is a quick version of the {#get} method where you do not want to do anything with the request
|
167
|
+
# before sending.
|
168
|
+
# Normally with any of the HTTP methods you create the request then when you are ready to send it you call
|
169
|
+
# {HttpClientRequest#end} on it. With this method the request is immediately sent.
|
170
|
+
# When an HTTP response is received from the server the handler is called passing in the response.
|
171
|
+
# @param [String] uri. A relative URI where to perform the GET on the server.
|
172
|
+
# @param [Hash] headers. A Hash of headers to pass with the request.
|
173
|
+
# @param [Block] hndlr. The handler to be called with the {HttpClientResponse}
|
174
|
+
def get_now(uri, headers = nil, &hndlr)
|
175
|
+
@j_del.getNow(uri, headers, resp_handler(hndlr))
|
176
|
+
self
|
177
|
+
end
|
178
|
+
|
179
|
+
# This method returns an {HttpClientRequest} instance which represents an HTTP OPTIONS request with the specified uri.
|
180
|
+
# When an HTTP response is received from the server the handler is called passing in the response.
|
181
|
+
# @param [String] uri. A relative URI where to perform the OPTIONS on the server.
|
182
|
+
# @param [Block] hndlr. The handler to be called with the {HttpClientResponse}
|
183
|
+
def options(uri, &hndlr)
|
184
|
+
HttpClientRequest.new(@j_del.options(uri, resp_handler(hndlr)))
|
185
|
+
end
|
186
|
+
|
187
|
+
# This method returns an {HttpClientRequest} instance which represents an HTTP GET request with the specified uri.
|
188
|
+
# When an HTTP response is received from the server the handler is called passing in the response.
|
189
|
+
# @param [String] uri. A relative URI where to perform the GET on the server.
|
190
|
+
# @param [Block] hndlr. The handler to be called with the {HttpClientResponse}
|
191
|
+
def get(uri, &hndlr)
|
192
|
+
HttpClientRequest.new(@j_del.get(uri, resp_handler(hndlr)))
|
193
|
+
end
|
194
|
+
|
195
|
+
# This method returns an {HttpClientRequest} instance which represents an HTTP HEAD request with the specified uri.
|
196
|
+
# When an HTTP response is received from the server the handler is called passing in the response.
|
197
|
+
# @param [String] uri. A relative URI where to perform the HEAD on the server.
|
198
|
+
# @param [Block] hndlr. The handler to be called with the {HttpClientResponse}
|
199
|
+
def head(uri, &hndlr)
|
200
|
+
HttpClientRequest.new(@j_del.head(uri, resp_handler(hndlr)))
|
201
|
+
end
|
202
|
+
|
203
|
+
# This method returns an {HttpClientRequest} instance which represents an HTTP POST request with the specified uri.
|
204
|
+
# When an HTTP response is received from the server the handler is called passing in the response.
|
205
|
+
# @param [String] uri. A relative URI where to perform the POST on the server.
|
206
|
+
# @param [Block] hndlr. The handler to be called with the {HttpClientResponse}
|
207
|
+
def post(uri, &hndlr)
|
208
|
+
HttpClientRequest.new(@j_del.post(uri, resp_handler(hndlr)))
|
209
|
+
end
|
210
|
+
|
211
|
+
# This method returns an {HttpClientRequest} instance which represents an HTTP PUT request with the specified uri.
|
212
|
+
# When an HTTP response is received from the server the handler is called passing in the response.
|
213
|
+
# @param [String] uri. A relative URI where to perform the PUT on the server.
|
214
|
+
# @param [Block] hndlr. The handler to be called with the {HttpClientResponse}
|
215
|
+
def put(uri, &hndlr)
|
216
|
+
HttpClientRequest.new(@j_del.put(uri, resp_handler(hndlr)))
|
217
|
+
end
|
218
|
+
|
219
|
+
# This method returns an {HttpClientRequest} instance which represents an HTTP DELETE request with the specified uri.
|
220
|
+
# When an HTTP response is received from the server the handler is called passing in the response.
|
221
|
+
# @param [String] uri. A relative URI where to perform the DELETE on the server.
|
222
|
+
# @param [Block] hndlr. The handler to be called with the {HttpClientResponse}
|
223
|
+
def delete(uri, &hndlr)
|
224
|
+
HttpClientRequest.new(@j_del.delete(uri, resp_handler(hndlr)))
|
225
|
+
end
|
226
|
+
|
227
|
+
# This method returns an {HttpClientRequest} instance which represents an HTTP TRACE request with the specified uri.
|
228
|
+
# When an HTTP response is received from the server the handler is called passing in the response.
|
229
|
+
# @param [String] uri. A relative URI where to perform the TRACE on the server.
|
230
|
+
# @param [Block] hndlr. The handler to be called with the {HttpClientResponse}
|
231
|
+
def trace(uri, &hndlr)
|
232
|
+
HttpClientRequest.new(@j_del.trace(uri, resp_handler(hndlr)))
|
233
|
+
end
|
234
|
+
|
235
|
+
# This method returns an {HttpClientRequest} instance which represents an HTTP CONNECT request with the specified uri.
|
236
|
+
# When an HTTP response is received from the server the handler is called passing in the response.
|
237
|
+
# @param [String] uri. A relative URI where to perform the CONNECT on the server.
|
238
|
+
# @param [Block] hndlr. The handler to be called with the {HttpClientResponse}
|
239
|
+
def connect(uri, &hndlr)
|
240
|
+
HttpClientRequest.new(@j_del.connect(uri, resp_handler(hndlr)))
|
241
|
+
end
|
242
|
+
|
243
|
+
# This method returns an {HttpClientRequest} instance which represents an HTTP PATCH request with the specified uri.
|
244
|
+
# When an HTTP response is received from the server the handler is called passing in the response.
|
245
|
+
# @param [String] uri. A relative URI where to perform the PATCH on the server.
|
246
|
+
# @param [Block] hndlr. The handler to be called with the {HttpClientResponse}
|
247
|
+
def patch(uri, &hndlr)
|
248
|
+
HttpClientRequest.new(@j_del.patch(uri, resp_handler(hndlr)))
|
249
|
+
end
|
250
|
+
|
251
|
+
# This method returns an {HttpClientRequest} instance which represents an HTTP request with the specified method and uri.
|
252
|
+
# When an HTTP response is received from the server the handler is called passing in the response.
|
253
|
+
# @param [String] method. The HTTP method. Can be one of OPTIONS, HEAD, GET, POST, PUT, DELETE, TRACE, CONNECT.
|
254
|
+
# @param [String] uri. A relative URI where to perform the OPTIONS on the server.
|
255
|
+
# @param [Block] hndlr. The handler to be called with the {HttpClientResponse}
|
256
|
+
def request(method, uri, &hndlr)
|
257
|
+
HttpClientRequest.new(@j_del.request(method, uri, resp_handler(hndlr)))
|
258
|
+
end
|
259
|
+
|
260
|
+
# Close the client. Any unclosed connections will be closed.
|
261
|
+
def close
|
262
|
+
@j_del.close
|
263
|
+
end
|
264
|
+
|
265
|
+
# @private
|
266
|
+
def resp_handler(hndlr)
|
267
|
+
Proc.new { |j_del| hndlr.call(HttpClientResponse.new(j_del)) }
|
268
|
+
end
|
269
|
+
|
270
|
+
private :resp_handler
|
271
|
+
|
272
|
+
end
|
273
|
+
|
274
|
+
# Encapsulates a client-side HTTP request.
|
275
|
+
#
|
276
|
+
# Instances of this class are created by an {HttpClient} instance, via one of the methods corresponding to the
|
277
|
+
# specific HTTP methods, or the generic {HttpClient#request} method.
|
278
|
+
#
|
279
|
+
# Once an instance of this class has been obtained, headers can be set on it, and data can be written to its body,
|
280
|
+
# if required. Once you are ready to send the request, the {#end} method must called.
|
281
|
+
#
|
282
|
+
# Nothing is sent until the request has been internally assigned an HTTP connection. The {HttpClient} instance
|
283
|
+
# will return an instance of this class immediately, even if there are no HTTP connections available in the pool. Any requests
|
284
|
+
# sent before a connection is assigned will be queued internally and actually sent when an HTTP connection becomes
|
285
|
+
# available from the pool.
|
286
|
+
#
|
287
|
+
# The headers of the request are actually sent either when the {#end} method is called, or, when the first
|
288
|
+
# part of the body is written, whichever occurs first.
|
289
|
+
#
|
290
|
+
# This class supports both chunked and non-chunked HTTP.
|
291
|
+
#
|
292
|
+
# @author {http://tfox.org Tim Fox}
|
293
|
+
class HttpClientRequest
|
294
|
+
|
295
|
+
include WriteStream
|
296
|
+
|
297
|
+
# @private
|
298
|
+
def initialize(j_del)
|
299
|
+
@j_del = j_del
|
300
|
+
end
|
301
|
+
|
302
|
+
# MultiMap of headers for the request
|
303
|
+
def headers
|
304
|
+
if !@headers
|
305
|
+
@headers = MultiMap.new(@j_del.headers)
|
306
|
+
end
|
307
|
+
@headers
|
308
|
+
end
|
309
|
+
|
310
|
+
# Inserts a header into the request.
|
311
|
+
# @param [String] key The header key
|
312
|
+
# @param [Object] value The header value. to_s will be called on the value to determine the actual String value to insert.
|
313
|
+
# @return [HttpClientRequest] self So multiple operations can be chained.
|
314
|
+
def put_header(key, value)
|
315
|
+
@j_del.putHeader(key, value.to_s)
|
316
|
+
self
|
317
|
+
end
|
318
|
+
|
319
|
+
# Write a [String] to the request body.
|
320
|
+
# @param [String] str. The string to write.
|
321
|
+
# @param [String] enc. The encoding to use.
|
322
|
+
# @return [HttpClientRequest] self So multiple operations can be chained.
|
323
|
+
def write_str(str, enc = "UTF-8")
|
324
|
+
@j_del.write(str, enc)
|
325
|
+
self
|
326
|
+
end
|
327
|
+
|
328
|
+
# Forces the head of the request to be written before {#end} is called on the request. This is normally used
|
329
|
+
# to implement HTTP 100-continue handling, see {#continue_handler} for more information.
|
330
|
+
# @return [HttpClientRequest] self So multiple operations can be chained.
|
331
|
+
def send_head
|
332
|
+
@j_del.sendHead
|
333
|
+
self
|
334
|
+
end
|
335
|
+
|
336
|
+
# Ends the request. If no data has been written to the request body, and {#send_head} has not been called then
|
337
|
+
# the actual request won't get written until this method gets called.
|
338
|
+
# Once the request has ended, it cannot be used any more, and if keep alive is true the underlying connection will
|
339
|
+
# be returned to the {HttpClient} pool so it can be assigned to another request.
|
340
|
+
def end
|
341
|
+
@j_del.end
|
342
|
+
self
|
343
|
+
end
|
344
|
+
|
345
|
+
# Same as {#write_buffer_and_end} but writes a String
|
346
|
+
# @param [String] str The String to write
|
347
|
+
# @param [String] enc The encoding
|
348
|
+
def write_str_and_end(str, enc = "UTF-8")
|
349
|
+
@j_del.end(str, enc)
|
350
|
+
self
|
351
|
+
end
|
352
|
+
|
353
|
+
# Same as {#end} but writes some data to the response body before ending. If the response is not chunked and
|
354
|
+
# no other data has been written then the Content-Length header will be automatically set
|
355
|
+
# @param [Buffer] chunk The Buffer to write
|
356
|
+
def write_buffer_and_end(chunk)
|
357
|
+
@j_del.end(chunk._to_java_buffer)
|
358
|
+
self
|
359
|
+
end
|
360
|
+
|
361
|
+
# Sets whether the request should used HTTP chunked encoding or not.
|
362
|
+
# @param [Boolean] val. If val is true, this request will use HTTP chunked encoding, and each call to write to the body
|
363
|
+
# will correspond to a new HTTP chunk sent on the wire. If chunked encoding is used the HTTP header
|
364
|
+
# 'Transfer-Encoding' with a value of 'Chunked' will be automatically inserted in the request.
|
365
|
+
# If chunked is false, this request will not use HTTP chunked encoding, and therefore if any data is written the
|
366
|
+
# body of the request, the total size of that data must be set in the 'Content-Length' header before any
|
367
|
+
# data is written to the request body.
|
368
|
+
# @return [HttpClientRequest] self So multiple operations can be chained.
|
369
|
+
def chunked=(val)
|
370
|
+
@j_del.setChunked(val)
|
371
|
+
self
|
372
|
+
end
|
373
|
+
|
374
|
+
# Get or set chunked
|
375
|
+
def chunked(val = nil)
|
376
|
+
if val
|
377
|
+
@j_del.setChunked(val)
|
378
|
+
self
|
379
|
+
else
|
380
|
+
@j_del.getChunked
|
381
|
+
end
|
382
|
+
end
|
383
|
+
|
384
|
+
# If you send an HTTP request with the header 'Expect' set to the value '100-continue'
|
385
|
+
# and the server responds with an interim HTTP response with a status code of '100' and a continue handler
|
386
|
+
# has been set using this method, then the handler will be called.
|
387
|
+
# You can then continue to write data to the request body and later end it. This is normally used in conjunction with
|
388
|
+
# the {#send_head} method to force the request header to be written before the request has ended.
|
389
|
+
# @param [Block] hndlr. The handler
|
390
|
+
def continue_handler(&hndlr)
|
391
|
+
@j_del.continueHandler(hndlr)
|
392
|
+
self
|
393
|
+
end
|
394
|
+
|
395
|
+
# Get or set timeout
|
396
|
+
def timeout(val = nil)
|
397
|
+
if val
|
398
|
+
@j_del.setTimeout(val)
|
399
|
+
self
|
400
|
+
else
|
401
|
+
@j_del.getTimeout
|
402
|
+
end
|
403
|
+
end
|
404
|
+
|
405
|
+
end
|
406
|
+
|
407
|
+
# Encapsulates a client-side HTTP response.
|
408
|
+
#
|
409
|
+
# An instance of this class is provided to the user via a handler that was specified when one of the
|
410
|
+
# HTTP method operations, or the generic {HttpClient#request} method was called on an instance of {HttpClient}.
|
411
|
+
#
|
412
|
+
# @author {http://tfox.org Tim Fox}
|
413
|
+
class HttpClientResponse
|
414
|
+
|
415
|
+
include ReadStream
|
416
|
+
|
417
|
+
# @private
|
418
|
+
def initialize(j_del)
|
419
|
+
@j_del = j_del
|
420
|
+
end
|
421
|
+
|
422
|
+
# @return [FixNum] the HTTP status code of the response.
|
423
|
+
def status_code
|
424
|
+
@j_del.statusCode
|
425
|
+
end
|
426
|
+
|
427
|
+
# @return [String] the status message
|
428
|
+
def status_message
|
429
|
+
@j_del.statusMessage
|
430
|
+
end
|
431
|
+
|
432
|
+
# Get a header value
|
433
|
+
# @param [String] key. The key of the header.
|
434
|
+
# @return [String] the header value.
|
435
|
+
def header(key)
|
436
|
+
@j_del.getHeader(key)
|
437
|
+
end
|
438
|
+
|
439
|
+
# Get all the headers in the response.
|
440
|
+
# @return [MultiMap]. The headers
|
441
|
+
def headers
|
442
|
+
if !@headers
|
443
|
+
@headers = MultiMap.new(@j_del.headers)
|
444
|
+
end
|
445
|
+
@headers
|
446
|
+
end
|
447
|
+
|
448
|
+
# Get all the trailers in the response.
|
449
|
+
# @return [MultiMap]. The trailers
|
450
|
+
def trailers
|
451
|
+
if !@trailers
|
452
|
+
@trailers = MultiMap.new(@j_del.trailers)
|
453
|
+
end
|
454
|
+
@trailers
|
455
|
+
end
|
456
|
+
|
457
|
+
# Get all cookies
|
458
|
+
def cookies
|
459
|
+
if !@cookies
|
460
|
+
@cookies = @j_del.cookies
|
461
|
+
end
|
462
|
+
@cookies
|
463
|
+
end
|
464
|
+
|
465
|
+
# Set a handler to receive the entire body in one go - do not use this for large bodies
|
466
|
+
def body_handler(&hndlr)
|
467
|
+
@j_del.bodyHandler(hndlr)
|
468
|
+
self
|
469
|
+
end
|
470
|
+
|
471
|
+
end
|
472
|
+
|
473
|
+
# Represents a WebSocket.
|
474
|
+
#
|
475
|
+
# Instances of this class are created by an {HttpClient} instance when a client succeeds in a WebSocket handshake with a server.
|
476
|
+
# Once an instance has been obtained it can be used to send or receive buffers of data from the connection,
|
477
|
+
# a bit like a TCP socket.
|
478
|
+
#
|
479
|
+
# @author {http://tfox.org Tim Fox}
|
480
|
+
class WebSocket
|
481
|
+
|
482
|
+
include ReadStream, WriteStream
|
483
|
+
|
484
|
+
# @private
|
485
|
+
def initialize(j_ws)
|
486
|
+
@j_del = j_ws
|
487
|
+
@binary_handler_id = EventBus.register_simple_handler { |msg|
|
488
|
+
write_binary_frame(msg.body)
|
489
|
+
}
|
490
|
+
@text_handler_id = EventBus.register_simple_handler { |msg|
|
491
|
+
write_text_frame(msg.body)
|
492
|
+
}
|
493
|
+
@j_del.closeHandler(Proc.new {
|
494
|
+
EventBus.unregister_handler(@binary_handler_id)
|
495
|
+
EventBus.unregister_handler(@text_handler_id)
|
496
|
+
@close_handler.call if @close_handler
|
497
|
+
})
|
498
|
+
end
|
499
|
+
|
500
|
+
# Write data to the WebSocket as a binary frame
|
501
|
+
# @param [Buffer] buffer. Data to write.
|
502
|
+
def write_binary_frame(buffer)
|
503
|
+
@j_del.writeBinaryFrame(buffer._to_java_buffer)
|
504
|
+
self
|
505
|
+
end
|
506
|
+
|
507
|
+
# Write data to the WebSocket as a text frame
|
508
|
+
# @param [String] str. String to write.
|
509
|
+
def write_text_frame(str)
|
510
|
+
@j_del.writeTextFrame(str)
|
511
|
+
self
|
512
|
+
end
|
513
|
+
|
514
|
+
# Close the WebSocket
|
515
|
+
def close
|
516
|
+
@j_del.close
|
517
|
+
end
|
518
|
+
|
519
|
+
# When a Websocket is created it automatically registers an event handler with the system, the ID of that
|
520
|
+
# handler is given by {#binary_handler_id}.
|
521
|
+
# Given this ID, a different event loop can send a binary frame to that event handler using the event bus. This
|
522
|
+
# allows you to write data to other WebSockets which are owned by different event loops.
|
523
|
+
def binary_handler_id
|
524
|
+
@binary_handler_id
|
525
|
+
end
|
526
|
+
|
527
|
+
# When a Websocket is created it automatically registers an event handler with the system, the ID of that
|
528
|
+
# handler is given by {#text_handler_id}.
|
529
|
+
# Given this ID, a different event loop can send a text frame to that event handler using the event bus. This
|
530
|
+
# allows you to write data to other WebSockets which are owned by different event loops.
|
531
|
+
def text_handler_id
|
532
|
+
@text_handler_id
|
533
|
+
end
|
534
|
+
|
535
|
+
# Set a closed handler on the WebSocket.
|
536
|
+
# @param [Block] hndlr A block to be used as the handler
|
537
|
+
def close_handler(&hndlr)
|
538
|
+
@close_handler = hndlr;
|
539
|
+
end
|
540
|
+
|
541
|
+
end
|
542
|
+
|
543
|
+
# A map which can hold multiple values for one name / key
|
544
|
+
#
|
545
|
+
# @author Norman Maurer
|
546
|
+
class MultiMap
|
547
|
+
|
548
|
+
# @private
|
549
|
+
def initialize(j_map)
|
550
|
+
@j_map = j_map
|
551
|
+
end
|
552
|
+
|
553
|
+
# Call the handler for each header name and its value. If there are multiple values are stored for
|
554
|
+
# a header name it will be called for each of them
|
555
|
+
#
|
556
|
+
def each(&hndlr)
|
557
|
+
names.each do |name|
|
558
|
+
values = @j_map.getAll(name)
|
559
|
+
for v in values
|
560
|
+
hndlr.call(name, v)
|
561
|
+
end
|
562
|
+
end
|
563
|
+
end
|
564
|
+
|
565
|
+
# Returns the value of with the specified name. If there are
|
566
|
+
# more than one values for the specified name, the first value is returned.
|
567
|
+
#
|
568
|
+
# @param name The name of the header to search
|
569
|
+
# @return The first header value or nil if there is no such entry
|
570
|
+
def get(name)
|
571
|
+
@j_map.get(name)
|
572
|
+
end
|
573
|
+
|
574
|
+
# Returns the value of with the specified name. If there are
|
575
|
+
# more than one values for the specified name, the first value is returned.
|
576
|
+
#
|
577
|
+
# @param name The name of the header to search
|
578
|
+
# @return The first header value or nil if there is no such entry
|
579
|
+
def [](name)
|
580
|
+
@j_map.get(name)
|
581
|
+
end
|
582
|
+
|
583
|
+
|
584
|
+
# Set a value with the specified name and value.
|
585
|
+
#
|
586
|
+
# @param name The name
|
587
|
+
# @param value The value being added
|
588
|
+
# @return self
|
589
|
+
def []=(name, value)
|
590
|
+
@j_map.set(name, value)
|
591
|
+
self
|
592
|
+
end
|
593
|
+
|
594
|
+
# Returns the values with the specified name
|
595
|
+
#
|
596
|
+
# @param name The name to search
|
597
|
+
# @return [Array] A immutable array of values which will be empty if no values
|
598
|
+
# are found
|
599
|
+
def get_all(name)
|
600
|
+
@j_map.getAll(name).to_a
|
601
|
+
end
|
602
|
+
|
603
|
+
# Returns true if an entry with the given name was found
|
604
|
+
def contains(name)
|
605
|
+
@j_map.contains(name)
|
606
|
+
end
|
607
|
+
|
608
|
+
# Returns true if the map is empty
|
609
|
+
def empty?
|
610
|
+
@j_map.isEmpty()
|
611
|
+
end
|
612
|
+
|
613
|
+
# Return a Set which holds all names of the entries
|
614
|
+
#
|
615
|
+
# @return [Set] The set which holds all names or an empty set if it is empty
|
616
|
+
def names
|
617
|
+
@j_map.names()
|
618
|
+
end
|
619
|
+
|
620
|
+
|
621
|
+
# Adds a new value with the specified name and value.
|
622
|
+
#
|
623
|
+
# @param name The name
|
624
|
+
# @param value The value being added
|
625
|
+
# @return self
|
626
|
+
def add(name, value)
|
627
|
+
@j_map.add(name, value)
|
628
|
+
self
|
629
|
+
end
|
630
|
+
|
631
|
+
# Set a value with the specified name and value.
|
632
|
+
#
|
633
|
+
# @param name The name
|
634
|
+
# @param value The value being added
|
635
|
+
# @return self
|
636
|
+
def set(name, value)
|
637
|
+
@j_map.set(name, value)
|
638
|
+
self
|
639
|
+
end
|
640
|
+
|
641
|
+
# Set a value with the specified name and value.
|
642
|
+
#
|
643
|
+
# @param name The name
|
644
|
+
# @param value The value being added
|
645
|
+
# @return self
|
646
|
+
def set_all(map)
|
647
|
+
@j_map.set(map._j_map)
|
648
|
+
self
|
649
|
+
end
|
650
|
+
|
651
|
+
# Remove the values with the given name
|
652
|
+
#
|
653
|
+
# @param name The name
|
654
|
+
# @return self
|
655
|
+
def remove(name)
|
656
|
+
@j_map.remove(name)
|
657
|
+
self
|
658
|
+
end
|
659
|
+
|
660
|
+
# Remove all entries
|
661
|
+
#
|
662
|
+
# @return self
|
663
|
+
def clear
|
664
|
+
@j_map.clear()
|
665
|
+
self
|
666
|
+
end
|
667
|
+
|
668
|
+
# Return the number of names in this instance
|
669
|
+
def size
|
670
|
+
@j_map.size()
|
671
|
+
end
|
672
|
+
|
673
|
+
def _j_map
|
674
|
+
@j_map
|
675
|
+
end
|
676
|
+
end
|
677
|
+
end
|
@@ -0,0 +1,143 @@
|
|
1
|
+
# Copyright 2011 the original author or authors.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
|
16
|
+
module Vertx
|
17
|
+
|
18
|
+
# A mixin module allowing SSL attributes to be set on classes
|
19
|
+
#
|
20
|
+
# @author {http://tfox.org Tim Fox}
|
21
|
+
module SSLSupport
|
22
|
+
|
23
|
+
# Set whether the server or client will use SSL.
|
24
|
+
# @param [Boolean] val. If true then ssl will be used.
|
25
|
+
# @return [] self. So multiple invocations can be chained.
|
26
|
+
def ssl=(val)
|
27
|
+
@j_del.setSSL(val)
|
28
|
+
self
|
29
|
+
end
|
30
|
+
|
31
|
+
# Set or get ssl for fluent API
|
32
|
+
def ssl(ssl = nil)
|
33
|
+
if ssl
|
34
|
+
@j_del.setSSL(ssl)
|
35
|
+
self
|
36
|
+
else
|
37
|
+
@j_del.isSSL
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
# Set the path to the SSL key store. This method should only be used with the client/server in SSL mode, i.e. after {#ssl=}
|
42
|
+
# has been set to true.
|
43
|
+
# The SSL key store is a standard Java Key Store, and should contain the client/server certificate. For a client, it's only necessary to supply
|
44
|
+
# a client key store if the server requires client authentication via client certificates.
|
45
|
+
# @param [String] val. The path to the key store
|
46
|
+
# @return [] self. So multiple invocations can be chained.
|
47
|
+
def key_store_path=(val)
|
48
|
+
@j_del.setKeyStorePath(val)
|
49
|
+
self
|
50
|
+
end
|
51
|
+
|
52
|
+
# Set or get key store path for fluent API
|
53
|
+
def key_store_path(path = nil)
|
54
|
+
if path
|
55
|
+
@j_del.setKeyStorePath(path)
|
56
|
+
self
|
57
|
+
else
|
58
|
+
@j_del.getKeyStorePath
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
# Set the password for the SSL key store. This method should only be used with the client in SSL mode, i.e. after {#ssl=}
|
63
|
+
# has been set to true.
|
64
|
+
# @param [String] val. The password.
|
65
|
+
# @return [] self. So multiple invocations can be chained.
|
66
|
+
def key_store_password=(val)
|
67
|
+
@j_del.setKeyStorePassword(val)
|
68
|
+
self
|
69
|
+
end
|
70
|
+
|
71
|
+
# Set or get key store password for fluent API
|
72
|
+
def key_store_password(password = nil)
|
73
|
+
if password
|
74
|
+
@j_del.setKeyStorePassword(password)
|
75
|
+
self
|
76
|
+
else
|
77
|
+
@j_del.getKeyStorePassword
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
# Set the path to the SSL trust store. This method should only be used with the client/server in SSL mode, i.e. after {#ssl=}
|
82
|
+
# has been set to true.
|
83
|
+
# The SSL trust store is a standard Java Key Store, and should contain the certificate(s) of the clients/servers that the server/client trusts. The SSL
|
84
|
+
# handshake will fail if the server provides a certificate that the client does not trust, or if client authentication is used,
|
85
|
+
# if the client provides a certificate the server does not trust.<p>
|
86
|
+
# @param [String] val. The path to the trust store
|
87
|
+
# @return [] self. So multiple invocations can be chained.
|
88
|
+
def trust_store_path=(val)
|
89
|
+
@j_del.setTrustStorePath(val)
|
90
|
+
self
|
91
|
+
end
|
92
|
+
|
93
|
+
# Set or get trust store path for fluent API
|
94
|
+
def trust_store_path(path = nil)
|
95
|
+
if path
|
96
|
+
@j_del.setTrustStorePath(path)
|
97
|
+
self
|
98
|
+
else
|
99
|
+
@j_del.getTrustStorePath
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
# Set the password for the SSL trust store. This method should only be used with the client in SSL mode, i.e. after {#ssl=}
|
104
|
+
# has been set to true.
|
105
|
+
# @param [String] val. The password.
|
106
|
+
# @return [] self. So multiple invocations can be chained.
|
107
|
+
def trust_store_password=(val)
|
108
|
+
@j_del.setTrustStorePassword(val)
|
109
|
+
self
|
110
|
+
end
|
111
|
+
|
112
|
+
# Set or get trust store password for fluent API
|
113
|
+
def trust_store_password(password = nil)
|
114
|
+
if password
|
115
|
+
@j_del.setTrustStorePassword(password)
|
116
|
+
self
|
117
|
+
else
|
118
|
+
@j_del.getTrustStorePassword
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
end
|
123
|
+
|
124
|
+
# A mixin module allowing Client SSL attributes to be set on classes
|
125
|
+
#
|
126
|
+
# @author {http://tfox.org Tim Fox}
|
127
|
+
module ClientSSLSupport
|
128
|
+
|
129
|
+
def trust_all=(val)
|
130
|
+
@j_del.setTrustAll(val)
|
131
|
+
self
|
132
|
+
end
|
133
|
+
|
134
|
+
def trust_all(val = nil)
|
135
|
+
if val
|
136
|
+
@j_del.setTrustAll(val)
|
137
|
+
self
|
138
|
+
else
|
139
|
+
@j_del.isTrustAll
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
@@ -0,0 +1,172 @@
|
|
1
|
+
# Copyright 2011 the original author or authors.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
module Vertx
|
16
|
+
|
17
|
+
# A mixin module which represents a stream of data that can be written to.
|
18
|
+
#
|
19
|
+
# Any class that mixes in this module can be used by a {Pump} to pump data from a {ReadStream} to it.
|
20
|
+
#
|
21
|
+
# @author {http://tfox.org Tim Fox}
|
22
|
+
module WriteStream
|
23
|
+
|
24
|
+
# Write some data to the stream. The data is put on an internal write queue, and the write actually happens
|
25
|
+
# asynchronously. To avoid running out of memory by putting too much on the write queue,
|
26
|
+
# check the {#write_queue_full?} method before writing. This is done automatically if using a {Pump}.
|
27
|
+
# @param [Buffer]. The buffer to write.
|
28
|
+
def write(buff)
|
29
|
+
@j_del.write(buff._to_java_buffer)
|
30
|
+
self
|
31
|
+
end
|
32
|
+
|
33
|
+
# Set the maximum size of the write queue. You will still be able to write to the stream even
|
34
|
+
# if there is more data than this in the write queue. This is used as an indicator by classes such as
|
35
|
+
# {Pump} to provide flow control.
|
36
|
+
# @param [FixNum] size. The maximum size, in bytes.
|
37
|
+
def write_queue_max_size=(size)
|
38
|
+
@j_del.setWriteQueueMaxSize(size)
|
39
|
+
end
|
40
|
+
|
41
|
+
# For a fluent API
|
42
|
+
def write_queue_max_size(size)
|
43
|
+
@j_del.setWriteQueueMaxSize(size)
|
44
|
+
self
|
45
|
+
end
|
46
|
+
|
47
|
+
# Is the write queue full?
|
48
|
+
# @return [Boolean] true if there are more bytes in the write queue than the max write queue size.
|
49
|
+
def write_queue_full?
|
50
|
+
@j_del.writeQueueFull
|
51
|
+
end
|
52
|
+
|
53
|
+
# Set a drain handler on the stream. If the write queue is full, then the handler will be called when the write
|
54
|
+
# queue has been reduced to maxSize / 2. See {Pump} for an example of this being used.
|
55
|
+
# @param [Block] hndlr. The drain handler
|
56
|
+
def drain_handler(&hndlr)
|
57
|
+
@j_del.drainHandler(hndlr)
|
58
|
+
self
|
59
|
+
end
|
60
|
+
|
61
|
+
# Set an exception handler on the stream.
|
62
|
+
# @param [Block] hndlr. The exception handler
|
63
|
+
def exception_handler(&hndlr)
|
64
|
+
@j_del.exceptionHandler(hndlr)
|
65
|
+
self
|
66
|
+
end
|
67
|
+
|
68
|
+
# @private
|
69
|
+
def _to_write_stream
|
70
|
+
@j_del
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
# A mixin module which represents a stream of data that can be read from.
|
76
|
+
#
|
77
|
+
# Any class that mixes in this module can be used by a {Pump} to pump data from a {ReadStream} to it.
|
78
|
+
#
|
79
|
+
# @author {http://tfox.org Tim Fox}
|
80
|
+
module ReadStream
|
81
|
+
|
82
|
+
# Set a data handler. As data is read, the handler will be called with the data.
|
83
|
+
# @param [Block] hndlr. The data handler
|
84
|
+
def data_handler(&hndlr)
|
85
|
+
@j_del.dataHandler(Proc.new { |j_buff|
|
86
|
+
hndlr.call(Buffer.new(j_buff))
|
87
|
+
})
|
88
|
+
self
|
89
|
+
end
|
90
|
+
|
91
|
+
# Pause the ReadStream. After calling this, the ReadStream will aim to send no more data to the {#data_handler}
|
92
|
+
def pause
|
93
|
+
@j_del.pause
|
94
|
+
self
|
95
|
+
end
|
96
|
+
|
97
|
+
# Resume reading. If the ReadStream has been paused, reading will recommence on it.
|
98
|
+
def resume
|
99
|
+
@j_del.resume
|
100
|
+
self
|
101
|
+
end
|
102
|
+
|
103
|
+
# Set an execption handler on the stream.
|
104
|
+
# @param [Block] hndlr. The exception handler
|
105
|
+
def exception_handler(&hndlr)
|
106
|
+
@j_del.exceptionHandler(hndlr)
|
107
|
+
self
|
108
|
+
end
|
109
|
+
|
110
|
+
# Set an end handler on the stream. Once the stream has ended, and there is no more data to be read, this handler will be called.
|
111
|
+
# @param [Block] hndlr. The exception handler
|
112
|
+
def end_handler(&hndlr)
|
113
|
+
@j_del.endHandler(hndlr)
|
114
|
+
self
|
115
|
+
end
|
116
|
+
|
117
|
+
# @private
|
118
|
+
def _to_read_stream
|
119
|
+
@j_del
|
120
|
+
end
|
121
|
+
|
122
|
+
end
|
123
|
+
|
124
|
+
# Pumps data from a {ReadStream} to a {WriteStream} and performs flow control where necessary to
|
125
|
+
# prevent the write stream from getting overloaded.
|
126
|
+
#
|
127
|
+
# Instances of this class read bytes from a ReadStream and write them to a WriteStream. If data
|
128
|
+
# can be read faster than it can be written this could result in the write queue of the WriteStream growing
|
129
|
+
# without bound, eventually causing it to exhaust all available RAM.
|
130
|
+
# To prevent this, after each write, instances of this class check whether the write queue of the WriteStream
|
131
|
+
# is full, and if so, the ReadStream is paused, and a {WriteStream#drain_handler} is set on the WriteStream.
|
132
|
+
# When the WriteStream has processed half of its backlog, the drain_handler will be called,
|
133
|
+
# which results in the pump resuming the ReadStream.
|
134
|
+
#
|
135
|
+
# This class can be used to pump from any {ReadStream} to any { WriteStream},
|
136
|
+
# e.g. from an {HttpServerRequest} to an {AsyncFile}, or from {NetSocket} to a {WebSocket}.
|
137
|
+
#
|
138
|
+
# @author {http://tfox.org Tim Fox}
|
139
|
+
class Pump
|
140
|
+
def initialize(read_stream, write_stream)
|
141
|
+
raise "read_stream is not a ReadStream" if !read_stream.is_a? ReadStream
|
142
|
+
raise "write_stream is not a WriteStream" if !write_stream.is_a? WriteStream
|
143
|
+
j_rs = read_stream._to_read_stream
|
144
|
+
j_ws = write_stream._to_write_stream
|
145
|
+
@j_pump = org.vertx.java.core.streams.Pump.createPump(j_rs, j_ws)
|
146
|
+
end
|
147
|
+
|
148
|
+
# Set the write queue max size
|
149
|
+
# @param [FixNum] The write queue max size
|
150
|
+
def write_queue_max_size=(val)
|
151
|
+
@j_pump.setWriteQueueMaxSize(val)
|
152
|
+
self
|
153
|
+
end
|
154
|
+
|
155
|
+
# Start the Pump. The Pump can be started and stopped multiple times.
|
156
|
+
def start
|
157
|
+
@j_pump.start
|
158
|
+
self
|
159
|
+
end
|
160
|
+
|
161
|
+
# Stop the Pump. The Pump can be started and stopped multiple times.
|
162
|
+
def stop
|
163
|
+
@j_pump.stop
|
164
|
+
self
|
165
|
+
end
|
166
|
+
|
167
|
+
# @return [FixNum] Return the total number of bytes pumped by this pump.
|
168
|
+
def bytes_pumped
|
169
|
+
@j_pump.bytesPumped
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
@@ -0,0 +1,150 @@
|
|
1
|
+
# Copyright 2011-2012 the original author or authors.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
module Vertx
|
16
|
+
|
17
|
+
# Mixin module that provides all the common TCP params that can be set.
|
18
|
+
#
|
19
|
+
# @author {http://tfox.org Tim Fox}
|
20
|
+
module TCPSupport
|
21
|
+
|
22
|
+
# Set the TCP send buffer size.
|
23
|
+
# @param [FixNum] val. The size in bytes.
|
24
|
+
# @return [] A reference to self so invocations can be chained
|
25
|
+
def send_buffer_size=(val)
|
26
|
+
@j_del.setSendBufferSize(val)
|
27
|
+
self
|
28
|
+
end
|
29
|
+
|
30
|
+
# Set or get send buffer size for fluent API
|
31
|
+
def send_buffer_size(val = nil)
|
32
|
+
if val
|
33
|
+
@j_del.setSendBufferSize(val)
|
34
|
+
self
|
35
|
+
else
|
36
|
+
@j_del.getSendBufferSize
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
# Set the TCP receive buffer size.
|
41
|
+
# @param [FixNum] val. The size in bytes.
|
42
|
+
# @return [] A reference to self so invocations can be chained
|
43
|
+
def receive_buffer_size=(val)
|
44
|
+
@j_del.setReceiveBufferSize(val)
|
45
|
+
self
|
46
|
+
end
|
47
|
+
|
48
|
+
# Set or get send buffer size for fluent API
|
49
|
+
def send_receive_size(val = nil)
|
50
|
+
if val
|
51
|
+
@j_del.setReceiveBufferSize(val)
|
52
|
+
self
|
53
|
+
else
|
54
|
+
@j_del.getReceiveBufferSize
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
# Set the TCP keep alive setting.
|
59
|
+
# @param [Boolean] val. If true, then TCP keep alive will be enabled.
|
60
|
+
# @return [] A reference to self so invocations can be chained
|
61
|
+
def tcp_keep_alive=(val)
|
62
|
+
@j_del.setTCPKeepAlive(val)
|
63
|
+
self
|
64
|
+
end
|
65
|
+
|
66
|
+
# Set or get TCP keep alive for fluent API
|
67
|
+
def tcp_keep_alive(val = nil)
|
68
|
+
if val
|
69
|
+
@j_del.setTCPKeepAlive(val)
|
70
|
+
self
|
71
|
+
else
|
72
|
+
@j_del.getTCPKeepAlive
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
# Set the TCP reuse address setting.
|
77
|
+
# @param [Boolean] val. If true, then TCP reuse address will be enabled.
|
78
|
+
# @return [] A reference to self so invocations can be chained
|
79
|
+
def reuse_address=(val)
|
80
|
+
@j_del.setReuseAddress(val)
|
81
|
+
self
|
82
|
+
end
|
83
|
+
|
84
|
+
# Set or get TCP reuse address for fluent API
|
85
|
+
def reuse_address(val = nil)
|
86
|
+
if val
|
87
|
+
@j_del.setReuseAddress(val)
|
88
|
+
self
|
89
|
+
else
|
90
|
+
@j_del.isReuseAddress
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
# Set the TCP so linger setting.
|
95
|
+
# @param [FixNum] val. Set TCP soLinger
|
96
|
+
# @return [] A reference to self so invocations can be chained
|
97
|
+
def so_linger=(val)
|
98
|
+
@j_del.setSoLinger(val)
|
99
|
+
self
|
100
|
+
end
|
101
|
+
|
102
|
+
# Set or get TCP so linger for fluent API
|
103
|
+
def so_linger(val = nil)
|
104
|
+
if val
|
105
|
+
@j_del.setSoLinger(val)
|
106
|
+
self
|
107
|
+
else
|
108
|
+
@j_del.getSoLinger
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
# Set the TCP traffic class setting.
|
113
|
+
# @param [FixNum] val. The TCP traffic class setting.
|
114
|
+
# @return [] A reference to self so invocations can be chained
|
115
|
+
def traffic_class=(val)
|
116
|
+
@j_del.setTrafficClass(val)
|
117
|
+
self
|
118
|
+
end
|
119
|
+
|
120
|
+
# Set or get TCP traffic class for fluent API
|
121
|
+
def traffic_class(val = nil)
|
122
|
+
if val
|
123
|
+
@j_del.setTrafficClass(val)
|
124
|
+
self
|
125
|
+
else
|
126
|
+
@j_del.getTrafficClass
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
# Set to use pooled buffers
|
131
|
+
# @param [Boolean] val.
|
132
|
+
# @return [] A reference to self so invocations can be chained
|
133
|
+
def use_pooled_buffers=(val)
|
134
|
+
@j_del.setUsedPooledBuffers(val)
|
135
|
+
self
|
136
|
+
end
|
137
|
+
|
138
|
+
# Set or get use_pooled_buffers for fluent API
|
139
|
+
def use_pooled_buffers(val = nil)
|
140
|
+
if val
|
141
|
+
@j_del.setUsePooledBuffers(val)
|
142
|
+
self
|
143
|
+
else
|
144
|
+
@j_del.isUsePooledBuffers
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
end
|
149
|
+
|
150
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Vertx
|
2
|
+
|
3
|
+
# @private
|
4
|
+
class ARWrappedHandler
|
5
|
+
include org.vertx.java.core.AsyncResultHandler
|
6
|
+
|
7
|
+
def initialize(handler, &result_converter)
|
8
|
+
@handler = handler
|
9
|
+
@result_converter = result_converter
|
10
|
+
end
|
11
|
+
|
12
|
+
def handle(future_result)
|
13
|
+
if @handler
|
14
|
+
if future_result.succeeded
|
15
|
+
if @result_converter
|
16
|
+
@handler.call(nil, @result_converter.call(future_result.result))
|
17
|
+
else
|
18
|
+
@handler.call(nil, future_result.result)
|
19
|
+
end
|
20
|
+
else
|
21
|
+
@handler.call(future_result.cause, nil)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jubilee
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.0
|
4
|
+
version: 2.0.0
|
5
5
|
platform: java
|
6
6
|
authors:
|
7
7
|
- Isaiah Peng
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-02-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rack
|
@@ -130,7 +130,12 @@ files:
|
|
130
130
|
- lib/vertx/README.md
|
131
131
|
- lib/vertx/buffer.rb
|
132
132
|
- lib/vertx/event_bus.rb
|
133
|
+
- lib/vertx/http.rb
|
133
134
|
- lib/vertx/shared_data.rb
|
135
|
+
- lib/vertx/ssl_support.rb
|
136
|
+
- lib/vertx/streams.rb
|
137
|
+
- lib/vertx/tcp_support.rb
|
138
|
+
- lib/vertx/wrapped_handler.rb
|
134
139
|
- spec/apps/rack/basic/config.ru
|
135
140
|
- spec/apps/rails4/basic/.gitignore
|
136
141
|
- spec/apps/rails4/basic/Gemfile
|
@@ -231,9 +236,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
231
236
|
version: '0'
|
232
237
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
233
238
|
requirements:
|
234
|
-
- - '
|
239
|
+
- - '>='
|
235
240
|
- !ruby/object:Gem::Version
|
236
|
-
version:
|
241
|
+
version: '0'
|
237
242
|
requirements: []
|
238
243
|
rubyforge_project:
|
239
244
|
rubygems_version: 2.1.9
|