jubilee 2.1.0.rc1-java → 3.0.0.beta2-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (91) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -1
  3. data/Gemfile +1 -1
  4. data/Gemfile.lock +2 -14
  5. data/Guardfile +24 -0
  6. data/README.md +34 -66
  7. data/Rakefile +1 -1
  8. data/examples/chatapp/Gemfile +2 -1
  9. data/examples/chatapp/Gemfile.lock +2 -2
  10. data/examples/chatapp/README.md +2 -14
  11. data/examples/chatapp/app.rb +19 -11
  12. data/examples/chatapp/public/assets/javascripts/application.js +1 -1
  13. data/examples/chatapp/public/assets/javascripts/vertxbus.js +60 -48
  14. data/examples/client/vertxbus.js +60 -48
  15. data/examples/shims_example/log/development.log +0 -0
  16. data/jars/hazelcast-3.5.2.jar +0 -0
  17. data/jars/jackson-annotations-2.6.0.jar +0 -0
  18. data/jars/jackson-core-2.6.1.jar +0 -0
  19. data/jars/jackson-databind-2.6.1.jar +0 -0
  20. data/jars/netty-buffer-4.0.33.Final.jar +0 -0
  21. data/jars/netty-codec-4.0.33.Final.jar +0 -0
  22. data/jars/netty-codec-http-4.0.33.Final.jar +0 -0
  23. data/jars/netty-common-4.0.33.Final.jar +0 -0
  24. data/jars/netty-handler-4.0.33.Final.jar +0 -0
  25. data/jars/netty-transport-4.0.33.Final.jar +0 -0
  26. data/jars/vertx-auth-common-3.2.1.jar +0 -0
  27. data/jars/vertx-core-3.2.1.jar +0 -0
  28. data/jars/vertx-hazelcast-3.2.1.jar +0 -0
  29. data/jars/vertx-lang-ruby-3.2.1.jar +0 -0
  30. data/jars/vertx-web-3.2.1.jar +0 -0
  31. data/jubilee.gemspec +40 -42
  32. data/lib/jubilee.rb +7 -2
  33. data/lib/jubilee/cli.rb +4 -4
  34. data/lib/jubilee/jubilee.jar +0 -0
  35. data/lib/jubilee/response.rb +1 -1
  36. data/lib/jubilee/version.rb +3 -3
  37. data/pom.xml +10 -94
  38. data/spec/apps/rails4/basic/Gemfile +2 -2
  39. data/spec/apps/rails4/basic/Gemfile.lock +5 -6
  40. data/src/main/java/org/jruby/jubilee/Const.java +1 -4
  41. data/src/main/java/org/jruby/jubilee/JubileeVerticle.java +41 -46
  42. data/src/main/java/org/jruby/jubilee/RackApplication.java +37 -57
  43. data/src/main/java/org/jruby/jubilee/RackEnvironment.java +38 -35
  44. data/src/main/java/org/jruby/jubilee/RackEnvironmentHash.java +1 -7
  45. data/src/main/java/org/jruby/jubilee/RubyHttpServerResponse.java +12 -6
  46. data/src/main/java/org/jruby/jubilee/RubyNetSocket.java +9 -12
  47. data/src/main/java/org/jruby/jubilee/RubyPlatformManager.java +39 -43
  48. data/src/main/java/org/jruby/jubilee/impl/RubyIORackInput.java +2 -1
  49. data/src/main/java/org/jruby/jubilee/vertx/JubileeVertx.java +1 -1
  50. metadata +30 -54
  51. data/examples/chatapp/config.json +0 -4
  52. data/jars/annotations-1.3.2.jar +0 -0
  53. data/jars/hazelcast-3.2.3.jar +0 -0
  54. data/jars/jackson-annotations-2.2.2.jar +0 -0
  55. data/jars/jackson-core-2.2.2.jar +0 -0
  56. data/jars/jackson-databind-2.2.2.jar +0 -0
  57. data/jars/lang-jruby-2.1.0-final.jar +0 -0
  58. data/jars/log4j-1.2.16.jar +0 -0
  59. data/jars/netty-all-4.0.20.Final.jar +0 -0
  60. data/jars/slf4j-api-1.6.2.jar +0 -0
  61. data/jars/vertx-core-2.1.2.jar +0 -0
  62. data/jars/vertx-hazelcast-2.1.2.jar +0 -0
  63. data/jars/vertx-platform-2.1.2.jar +0 -0
  64. data/lib/container.rb +0 -117
  65. data/lib/core/buffer.rb +0 -251
  66. data/lib/core/datagram.rb +0 -280
  67. data/lib/core/dns.rb +0 -143
  68. data/lib/core/event_bus.rb +0 -277
  69. data/lib/core/file_system.rb +0 -479
  70. data/lib/core/http.rb +0 -1307
  71. data/lib/core/net.rb +0 -251
  72. data/lib/core/network_support.rb +0 -77
  73. data/lib/core/parsetools.rb +0 -105
  74. data/lib/core/shared_data.rb +0 -214
  75. data/lib/core/sock_js.rb +0 -116
  76. data/lib/core/ssl_support.rb +0 -163
  77. data/lib/core/streams.rb +0 -183
  78. data/lib/core/tcp_support.rb +0 -136
  79. data/lib/core/timers.rb +0 -73
  80. data/lib/core/vertx_require.rb +0 -25
  81. data/lib/core/wrapped_handler.rb +0 -28
  82. data/lib/jubilee/jubilee_require.rb +0 -24
  83. data/lib/test_utils.rb +0 -66
  84. data/lib/vertx.rb +0 -30
  85. data/lib/vertx_tests.rb +0 -8
  86. data/src/main/assembly/mod.xml +0 -21
  87. data/src/main/java/org/jruby/jubilee/JubileeVerticleFactory.java +0 -258
  88. data/src/main/java/org/jruby/jubilee/RubyCallable.java +0 -52
  89. data/src/main/resources/META-INF/services/org.vertx.java.deploy.impl.jruby.JubileeVerticleFactory +0 -1
  90. data/src/main/resources/mod.json +0 -11
  91. data/vertx_classpath.txt +0 -12
@@ -1,1307 +0,0 @@
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 'core/streams'
16
- require 'core/ssl_support'
17
- require 'core/tcp_support'
18
- require 'core/wrapped_handler'
19
-
20
- module Vertx
21
-
22
- # An HTTP and WebSockets server
23
- #
24
- # @author {http://tfox.org Tim Fox}
25
- class HttpServer
26
-
27
- include SSLSupport, ServerSSLSupport, TCPSupport, ServerTCPSupport
28
-
29
- # Letting the developer choose between compression? or compression while developing
30
- #alias_method :compression?, :compression
31
-
32
- # Create a new HttpServer.
33
- # using an optional hash to configure the HttpServer on instantiation.
34
- # @param [Hash] config an Hash of configurations.
35
- def initialize(config = {})
36
- @j_del = org.vertx.java.platform.impl.JRubyVerticleFactory.vertx.createHttpServer
37
- self.compression = config[:compression] if config.has_key?(:compression)
38
- self
39
- end
40
-
41
- # Set the HTTP request handler for the server.
42
- # As HTTP requests arrive on the server a new {HttpServerRequest} instance will be created and passed to the handler.
43
- # @param [Block] hndlr A block to be used as the handler
44
- def request_handler(rm = nil, &hndlr)
45
- if (rm && (rm.is_a? RouteMatcher))
46
- @j_del.requestHandler { |j_del| rm.input(HttpServerRequest.new(j_del))}
47
- else
48
- @j_del.requestHandler { |j_del| hndlr.call(HttpServerRequest.new(j_del)) }
49
- end
50
- self
51
- end
52
-
53
- # Set the WebSocket handler for the server.
54
- # As WebSocket requests arrive on the server and are accepted a new {WebSocket} instance will be created and
55
- # passed to the handler.
56
- # @param [Block] hndlr A block to be used as the handler
57
- def websocket_handler(&hndlr)
58
- @j_del.websocketHandler do |param|
59
- hndlr.call(ServerWebSocket.new(param))
60
- end
61
- self
62
- end
63
-
64
- # Enables HTTP compression.
65
- # exposes a = method to set or unset compression support.
66
- # @param [Boolean] supported whether enable compression or not
67
- def compression=(supported)
68
- @j_del.setCompressionSupported(supported)
69
- end
70
-
71
- # Tests if compression is supported.
72
- # @return [Boolean] true if compression is supported or false if it doesn't
73
- def compression
74
- @j_del.isCompressionSupported
75
- end
76
-
77
- # Letting the developer choose between compression? or compression while developing
78
- alias_method :compression?, :compression
79
-
80
- # Instruct the server to listen for incoming connections.
81
- # @param [FixNum] port. The port to listen on.
82
- # @param [FixNum] host. The host name or ip address to listen on.
83
- # @param [Block] hndlr The handler will be called when the server is listening, or it failed to listen
84
- def listen(port, host = "0.0.0.0", &hndlr)
85
- @j_del.listen(port, host, ARWrappedHandler.new(hndlr) { |j_del| self })
86
- end
87
-
88
- # Close the server. The handler will be called when the close is complete.
89
- def close(&hndlr)
90
- if hndlr
91
- @j_del.close(ARWrappedHandler.new(hndlr))
92
- else
93
- @j_del.close
94
- end
95
- end
96
-
97
- # Gets the max WebSocket Frame size in bytes
98
- # @return [int] Max WebSocket frame size
99
- def max_websocket_frame_size
100
- @j_del.getMaxWebSocketFrameSize
101
- end
102
-
103
- # Sets the maximum WebSocket frame size in bytes. Default is 65536 bytes.
104
- # @param [int] size
105
- def max_websocket_frame_size=(size)
106
- @j_del.setMaxWebSocketFrameSize(size)
107
- end
108
-
109
- # @private
110
- def _to_java_server
111
- @j_del
112
- end
113
- end
114
-
115
- # An HTTP client.
116
- # A client maintains a pool of connections to a specific host, at a specific port. The HTTP connections can act
117
- # as pipelines for HTTP requests.
118
- # It is used as a factory for {HttpClientRequest} instances which encapsulate the actual HTTP requests. It is also
119
- # used as a factory for {WebSocket WebSockets}.
120
- #
121
- # @author {http://tfox.org Tim Fox}
122
- class HttpClient
123
-
124
- include SSLSupport, ClientSSLSupport, TCPSupport
125
-
126
- # Create a new HttpClient
127
- def initialize(config = {})
128
- @j_del = org.vertx.java.platform.impl.JRubyVerticleFactory.vertx.createHttpClient
129
- self.compression = config[:try_compression] if config.has_key?(:try_compression)
130
- end
131
-
132
- # Enables HTTP compression.
133
- # exposes a = method to set or unset compression support.
134
- # @param [Boolean] supported whether enable compression or not
135
- def compression=(supported)
136
- @j_del.setTryUseCompression(supported)
137
- end
138
-
139
- # Tests if client is trying to use HTTP compression or not
140
- # @return [Boolean] true if Client is trying using HTTP compression, false if it doesn't
141
- def compression
142
- @j_del.getTryUseCompression
143
- end
144
-
145
- # Letting the developer choose between compression? or compression while developing
146
- alias_method :compression?, :compression
147
-
148
- # Set the exception handler.
149
- # @param [Block] hndlr A block to be used as the handler
150
- def exception_handler(&hndlr)
151
- @j_del.exceptionHandler(hndlr)
152
- self
153
- end
154
-
155
- # Set the maximum pool size.
156
- # The client will maintain up to this number of HTTP connections in an internal pool
157
- # @param [FixNum] val. The maximum number of connections (default to 1).
158
- def max_pool_size=(val)
159
- @j_del.setMaxPoolSize(val)
160
- self
161
- end
162
-
163
- # Get or set the max pool size
164
- def max_pool_size(val = nil)
165
- if val
166
- @j_del.setMaxPoolSize(val)
167
- self
168
- else
169
- @j_del.getMaxPoolSize
170
- end
171
- end
172
-
173
- # If val is true then, after the request has ended the connection will be returned to the pool
174
- # where it can be used by another request. In this manner, many HTTP requests can be pipe-lined over an HTTP connection.
175
- # Keep alive connections will not be closed until the {#close} method is invoked.
176
- # If val is false then a new connection will be created for each request and it won't ever go in the pool,
177
- # the connection will closed after the response has been received. Even with no keep alive, the client will not allow more
178
- # than {#max_pool_size} connections to be created at any one time.
179
- # @param [Boolean] val. The value to use for keep_alive
180
- def keep_alive=(val)
181
- @j_del.setTCPKeepAlive(val)
182
- self
183
- end
184
-
185
- # Get or set keep alive
186
- def keep_alive(val = nil)
187
- if val
188
- @j_del.setKeepAlive(val)
189
- self
190
- else
191
- @j_del.isKeepAlive
192
- end
193
- end
194
-
195
- # Set the port that the client will attempt to connect to on the server on. The default value is 80
196
- # @param [FixNum] val. The port value.
197
- def port=(val)
198
- @j_del.setPort(val)
199
- self
200
- end
201
-
202
- # Get or set port
203
- def port(val = nil)
204
- if val
205
- @j_del.setPort(val)
206
- self
207
- else
208
- @j_del.getPort
209
- end
210
- end
211
-
212
- # Set the host name or ip address that the client will attempt to connect to on the server on.
213
- # @param [String] host. The host name or ip address to connect to.
214
- def host=(val)
215
- @j_del.setHost(val)
216
- self
217
- end
218
-
219
- # Get or set host
220
- def host(val = nil)
221
- if val
222
- @j_del.setHost(val)
223
- self
224
- else
225
- @j_del.getHost
226
- end
227
- end
228
-
229
- # Get or set verify host
230
- def verify_host(val = nil)
231
- if val
232
- @j_del.setVerifyHost(val)
233
- self
234
- else
235
- @j_del.isVerifyHost
236
- end
237
- end
238
-
239
- # Gets the max WebSocket Frame size in bytes
240
- # @return [int] Max WebSocket frame size
241
- def max_websocket_frame_size
242
- @j_del.getMaxWebSocketFrameSize
243
- end
244
-
245
- # Sets the maximum WebSocket frame size in bytes. Default is 65536 bytes.
246
- # @param [int] size
247
- def max_websocket_frame_size=(size)
248
- @j_del.setMaxWebSocketFrameSize(size)
249
- end
250
-
251
- # Attempt to connect a WebSocket to the specified URI.
252
- # The connect is done asynchronously and the handler is called with a {WebSocket} on success.
253
- # @param [String] uri. A relative URI where to connect the WebSocket on the host, e.g. /some/path
254
- # @param [Block] hndlr. The handler to be called with the {WebSocket}
255
- def connect_web_socket(uri, &hndlr)
256
- @j_del.connectWebsocket(uri) { |j_ws| hndlr.call(WebSocket.new(j_ws)) }
257
- self
258
- end
259
-
260
- # This is a quick version of the {#get} method where you do not want to do anything with the request
261
- # before sending.
262
- # Normally with any of the HTTP methods you create the request then when you are ready to send it you call
263
- # {HttpClientRequest#end} on it. With this method the request is immediately sent.
264
- # When an HTTP response is received from the server the handler is called passing in the response.
265
- # @param [String] uri. A relative URI where to perform the GET on the server.
266
- # @param [Hash] headers. A Hash of headers to pass with the request.
267
- # @param [Block] hndlr. The handler to be called with the {HttpClientResponse}
268
- def get_now(uri, headers = nil, &hndlr)
269
- @j_del.getNow(uri, headers, resp_handler(hndlr))
270
- self
271
- end
272
-
273
- # This method returns an {HttpClientRequest} instance which represents an HTTP OPTIONS request with the specified uri.
274
- # When an HTTP response is received from the server the handler is called passing in the response.
275
- # @param [String] uri. A relative URI where to perform the OPTIONS on the server.
276
- # @param [Block] hndlr. The handler to be called with the {HttpClientResponse}
277
- def options(uri, &hndlr)
278
- HttpClientRequest.new(@j_del.options(uri, resp_handler(hndlr)))
279
- end
280
-
281
- # This method returns an {HttpClientRequest} instance which represents an HTTP GET request with the specified uri.
282
- # When an HTTP response is received from the server the handler is called passing in the response.
283
- # @param [String] uri. A relative URI where to perform the GET on the server.
284
- # @param [Block] hndlr. The handler to be called with the {HttpClientResponse}
285
- def get(uri, &hndlr)
286
- HttpClientRequest.new(@j_del.get(uri, resp_handler(hndlr)))
287
- end
288
-
289
- # This method returns an {HttpClientRequest} instance which represents an HTTP HEAD request with the specified uri.
290
- # When an HTTP response is received from the server the handler is called passing in the response.
291
- # @param [String] uri. A relative URI where to perform the HEAD on the server.
292
- # @param [Block] hndlr. The handler to be called with the {HttpClientResponse}
293
- def head(uri, &hndlr)
294
- HttpClientRequest.new(@j_del.head(uri, resp_handler(hndlr)))
295
- end
296
-
297
- # This method returns an {HttpClientRequest} instance which represents an HTTP POST request with the specified uri.
298
- # When an HTTP response is received from the server the handler is called passing in the response.
299
- # @param [String] uri. A relative URI where to perform the POST on the server.
300
- # @param [Block] hndlr. The handler to be called with the {HttpClientResponse}
301
- def post(uri, &hndlr)
302
- HttpClientRequest.new(@j_del.post(uri, resp_handler(hndlr)))
303
- end
304
-
305
- # This method returns an {HttpClientRequest} instance which represents an HTTP PUT request with the specified uri.
306
- # When an HTTP response is received from the server the handler is called passing in the response.
307
- # @param [String] uri. A relative URI where to perform the PUT on the server.
308
- # @param [Block] hndlr. The handler to be called with the {HttpClientResponse}
309
- def put(uri, &hndlr)
310
- HttpClientRequest.new(@j_del.put(uri, resp_handler(hndlr)))
311
- end
312
-
313
- # This method returns an {HttpClientRequest} instance which represents an HTTP DELETE request with the specified uri.
314
- # When an HTTP response is received from the server the handler is called passing in the response.
315
- # @param [String] uri. A relative URI where to perform the DELETE on the server.
316
- # @param [Block] hndlr. The handler to be called with the {HttpClientResponse}
317
- def delete(uri, &hndlr)
318
- HttpClientRequest.new(@j_del.delete(uri, resp_handler(hndlr)))
319
- end
320
-
321
- # This method returns an {HttpClientRequest} instance which represents an HTTP TRACE request with the specified uri.
322
- # When an HTTP response is received from the server the handler is called passing in the response.
323
- # @param [String] uri. A relative URI where to perform the TRACE on the server.
324
- # @param [Block] hndlr. The handler to be called with the {HttpClientResponse}
325
- def trace(uri, &hndlr)
326
- HttpClientRequest.new(@j_del.trace(uri, resp_handler(hndlr)))
327
- end
328
-
329
- # This method returns an {HttpClientRequest} instance which represents an HTTP CONNECT request with the specified uri.
330
- # When an HTTP response is received from the server the handler is called passing in the response.
331
- # @param [String] uri. A relative URI where to perform the CONNECT on the server.
332
- # @param [Block] hndlr. The handler to be called with the {HttpClientResponse}
333
- def connect(uri, &hndlr)
334
- HttpClientRequest.new(@j_del.connect(uri, resp_handler(hndlr)))
335
- end
336
-
337
- # This method returns an {HttpClientRequest} instance which represents an HTTP PATCH request with the specified uri.
338
- # When an HTTP response is received from the server the handler is called passing in the response.
339
- # @param [String] uri. A relative URI where to perform the PATCH on the server.
340
- # @param [Block] hndlr. The handler to be called with the {HttpClientResponse}
341
- def patch(uri, &hndlr)
342
- HttpClientRequest.new(@j_del.patch(uri, resp_handler(hndlr)))
343
- end
344
-
345
- # This method returns an {HttpClientRequest} instance which represents an HTTP request with the specified method and uri.
346
- # When an HTTP response is received from the server the handler is called passing in the response.
347
- # @param [String] method. The HTTP method. Can be one of OPTIONS, HEAD, GET, POST, PUT, DELETE, TRACE, CONNECT.
348
- # @param [String] uri. A relative URI where to perform the OPTIONS on the server.
349
- # @param [Block] hndlr. The handler to be called with the {HttpClientResponse}
350
- def request(method, uri, &hndlr)
351
- HttpClientRequest.new(@j_del.request(method, uri, resp_handler(hndlr)))
352
- end
353
-
354
- # Close the client. Any unclosed connections will be closed.
355
- def close
356
- @j_del.close
357
- end
358
-
359
- # @private
360
- def resp_handler(hndlr)
361
- Proc.new { |j_del| hndlr.call(HttpClientResponse.new(j_del)) }
362
- end
363
-
364
- private :resp_handler
365
-
366
- end
367
-
368
- # Encapsulates a client-side HTTP request.
369
- #
370
- # Instances of this class are created by an {HttpClient} instance, via one of the methods corresponding to the
371
- # specific HTTP methods, or the generic {HttpClient#request} method.
372
- #
373
- # Once an instance of this class has been obtained, headers can be set on it, and data can be written to its body,
374
- # if required. Once you are ready to send the request, the {#end} method must called.
375
- #
376
- # Nothing is sent until the request has been internally assigned an HTTP connection. The {HttpClient} instance
377
- # will return an instance of this class immediately, even if there are no HTTP connections available in the pool. Any requests
378
- # sent before a connection is assigned will be queued internally and actually sent when an HTTP connection becomes
379
- # available from the pool.
380
- #
381
- # The headers of the request are actually sent either when the {#end} method is called, or, when the first
382
- # part of the body is written, whichever occurs first.
383
- #
384
- # This class supports both chunked and non-chunked HTTP.
385
- #
386
- # @author {http://tfox.org Tim Fox}
387
- class HttpClientRequest
388
-
389
- include WriteStream
390
-
391
- # @private
392
- def initialize(j_del)
393
- @j_del = j_del
394
- end
395
-
396
- # MultiMap of headers for the request
397
- def headers
398
- if !@headers
399
- @headers = MultiMap.new(@j_del.headers)
400
- end
401
- @headers
402
- end
403
-
404
- # Inserts a header into the request.
405
- # @param [String] key The header key
406
- # @param [Object] value The header value. to_s will be called on the value to determine the actual String value to insert.
407
- # @return [HttpClientRequest] self So multiple operations can be chained.
408
- def put_header(key, value)
409
- @j_del.putHeader(key, value.to_s)
410
- self
411
- end
412
-
413
- # Write a [String] to the request body.
414
- # @param [String] str. The string to write.
415
- # @param [String] enc. The encoding to use.
416
- # @return [HttpClientRequest] self So multiple operations can be chained.
417
- def write_str(str, enc = "UTF-8")
418
- @j_del.write(str, enc)
419
- self
420
- end
421
-
422
- # Forces the head of the request to be written before {#end} is called on the request. This is normally used
423
- # to implement HTTP 100-continue handling, see {#continue_handler} for more information.
424
- # @return [HttpClientRequest] self So multiple operations can be chained.
425
- def send_head
426
- @j_del.sendHead
427
- self
428
- end
429
-
430
- # Ends the request. If no data has been written to the request body, and {#send_head} has not been called then
431
- # the actual request won't get written until this method gets called.
432
- # Once the request has ended, it cannot be used any more, and if keep alive is true the underlying connection will
433
- # be returned to the {HttpClient} pool so it can be assigned to another request.
434
- def end
435
- @j_del.end
436
- self
437
- end
438
-
439
- # Same as {#write_buffer_and_end} but writes a String
440
- # @param [String] str The String to write
441
- # @param [String] enc The encoding
442
- def write_str_and_end(str, enc = "UTF-8")
443
- @j_del.end(str, enc)
444
- self
445
- end
446
-
447
- # Same as {#end} but writes some data to the response body before ending. If the response is not chunked and
448
- # no other data has been written then the Content-Length header will be automatically set
449
- # @param [Buffer] chunk The Buffer to write
450
- def write_buffer_and_end(chunk)
451
- @j_del.end(chunk._to_java_buffer)
452
- self
453
- end
454
-
455
- # Sets whether the request should used HTTP chunked encoding or not.
456
- # @param [Boolean] val. If val is true, this request will use HTTP chunked encoding, and each call to write to the body
457
- # will correspond to a new HTTP chunk sent on the wire. If chunked encoding is used the HTTP header
458
- # 'Transfer-Encoding' with a value of 'Chunked' will be automatically inserted in the request.
459
- # If chunked is false, this request will not use HTTP chunked encoding, and therefore if any data is written the
460
- # body of the request, the total size of that data must be set in the 'Content-Length' header before any
461
- # data is written to the request body.
462
- # @return [HttpClientRequest] self So multiple operations can be chained.
463
- def chunked=(val)
464
- @j_del.setChunked(val)
465
- self
466
- end
467
-
468
- # Get or set chunked
469
- def chunked(val = nil)
470
- if val
471
- @j_del.setChunked(val)
472
- self
473
- else
474
- @j_del.getChunked
475
- end
476
- end
477
-
478
- # If you send an HTTP request with the header 'Expect' set to the value '100-continue'
479
- # and the server responds with an interim HTTP response with a status code of '100' and a continue handler
480
- # has been set using this method, then the handler will be called.
481
- # You can then continue to write data to the request body and later end it. This is normally used in conjunction with
482
- # the {#send_head} method to force the request header to be written before the request has ended.
483
- # @param [Block] hndlr. The handler
484
- def continue_handler(&hndlr)
485
- @j_del.continueHandler(hndlr)
486
- self
487
- end
488
-
489
- # Get or set timeout
490
- def timeout(val = nil)
491
- if val
492
- @j_del.setTimeout(val)
493
- self
494
- else
495
- @j_del.getTimeout
496
- end
497
- end
498
-
499
- end
500
-
501
- # Encapsulates a client-side HTTP response.
502
- #
503
- # An instance of this class is provided to the user via a handler that was specified when one of the
504
- # HTTP method operations, or the generic {HttpClient#request} method was called on an instance of {HttpClient}.
505
- #
506
- # @author {http://tfox.org Tim Fox}
507
- class HttpClientResponse
508
-
509
- include ReadStream
510
-
511
- # @private
512
- def initialize(j_del)
513
- @j_del = j_del
514
- end
515
-
516
- # @return [FixNum] the HTTP status code of the response.
517
- def status_code
518
- @j_del.statusCode
519
- end
520
-
521
- # @return [String] the status message
522
- def status_message
523
- @j_del.statusMessage
524
- end
525
-
526
- # Get a header value
527
- # @param [String] key. The key of the header.
528
- # @return [String] the header value.
529
- def header(key)
530
- @j_del.getHeader(key)
531
- end
532
-
533
- # Get all the headers in the response.
534
- # @return [MultiMap]. The headers
535
- def headers
536
- if !@headers
537
- @headers = MultiMap.new(@j_del.headers)
538
- end
539
- @headers
540
- end
541
-
542
- # Get all the trailers in the response.
543
- # @return [MultiMap]. The trailers
544
- def trailers
545
- if !@trailers
546
- @trailers = MultiMap.new(@j_del.trailers)
547
- end
548
- @trailers
549
- end
550
-
551
- # Get all cookies
552
- def cookies
553
- if !@cookies
554
- @cookies = @j_del.cookies
555
- end
556
- @cookies
557
- end
558
-
559
- # Set a handler to receive the entire body in one go - do not use this for large bodies
560
- def body_handler(&hndlr)
561
- @j_del.bodyHandler(hndlr)
562
- self
563
- end
564
-
565
- end
566
-
567
- # Encapsulates a server-side HTTP request.
568
- #
569
- # An instance of this class is created for each request that is handled by the server and is passed to the user via the
570
- # handler specified using {HttpServer#request_handler}.
571
- #
572
- # Each instance of this class is associated with a corresponding {HttpServerResponse} instance via the field {#response}.
573
- #
574
- # @author {http://tfox.org Tim Fox}
575
- class HttpServerRequest
576
-
577
- include ReadStream
578
-
579
- # @private
580
- def initialize(j_del)
581
- @j_del = j_del
582
- @resp = HttpServerResponse.new(@j_del.response)
583
- end
584
-
585
- # @return [String] The Http version
586
- def version
587
- if !@vrsn
588
- @vrsn = @j_del.version.toString
589
- end
590
- @vrsn
591
- end
592
-
593
- # @return [String] The HTTP method, one of HEAD, OPTIONS, GET, POST, PUT, DELETE, CONNECT, TRACE
594
- def method
595
- @j_del.method
596
- end
597
-
598
- # @return [String] The uri of the request. For example 'http://www.somedomain.com/somepath/somemorepath/somresource.foo?someparam=32&someotherparam=x'
599
- def uri
600
- @j_del.uri
601
- end
602
-
603
- # @return [String] The path part of the uri. For example /somepath/somemorepath/somresource.foo
604
- def path
605
- @j_del.path
606
- end
607
-
608
- # @return [String] The query part of the uri. For example someparam=32&someotherparam=x
609
- def query
610
- @j_del.query
611
- end
612
-
613
- # @return [MultiMap] The request parameters
614
- def params
615
- if !@params
616
- @params = MultiMap.new(@j_del.params)
617
- end
618
- @params
619
- end
620
-
621
- # @return [HttpServerResponse] The response. Each instance of this class has an {HttpServerResponse} instance attached to it. This is used
622
- # to send the response back to the client.
623
- def response
624
- @resp
625
- end
626
-
627
- # @return [MultiMap] The request headers
628
- def headers
629
- if !@headers
630
- @headers = MultiMap.new(@j_del.headers)
631
- end
632
- @headers
633
- end
634
-
635
- # You must call this function with true before receiving the request body if you expect it to
636
- # contain a multi-part form
637
- def expect_multipart=(expect)
638
- @j_del.expectMultiPart(expect)
639
- self
640
- end
641
-
642
- # @return [MultiMap] Returns a map of all form attributes which was found in the request. Be aware that this
643
- # message should only get
644
- # called after the endHandler was notified as the map will be filled on-the-fly.
645
- def form_attributes
646
- if !@attrs
647
- @attrs = MultiMap.new(@j_del.formAttributes)
648
- end
649
- @attrs
650
- end
651
-
652
- # Set the upload handler. The handler will get notified once a new file upload was received and so allow to
653
- # get notified by the upload in progress.
654
- def upload_handler(&hndlr)
655
- @j_del.uploadHandler do |j_upload|
656
- hndlr.call(HttpServerFileUpload.new(j_upload))
657
- end
658
- self
659
- end
660
-
661
- # Set a handler to receive the entire body in one go - do not use this for large bodies
662
- def body_handler(&hndlr)
663
- @j_del.bodyHandler(hndlr)
664
- self
665
- end
666
-
667
- # Get the remote address
668
- def remote_address
669
- @j_del.remoteAddress
670
- end
671
-
672
- # Get the absolute URI
673
- def absolute_uri
674
- @j_del.absoluteURI
675
- end
676
-
677
- def _to_java_request
678
- @j_del
679
- end
680
-
681
- end
682
-
683
- # Encapsulates a server-side HTTP response.
684
- #
685
- # An instance of this class is created and associated to every instance of {HttpServerRequest} that is created.
686
- #
687
- # It allows the developer to control the HTTP response that is sent back to the client for the corresponding HTTP
688
- # request. It contains methods that allow HTTP headers and trailers to be set, and for a body to be written out
689
- # to the response.
690
- #
691
- # @author {http://tfox.org Tim Fox}
692
- class HttpServerResponse
693
-
694
- include WriteStream
695
-
696
- # @private
697
- def initialize(j_del)
698
- @j_del = j_del
699
- end
700
-
701
- def status_code=(val)
702
- @j_del.setStatusCode(val)
703
- end
704
-
705
- # Get or set the status code
706
- def status_code(val = nil)
707
- if val
708
- @j_del.setStatusCode(val)
709
- self
710
- else
711
- @j_del.getStatusCode
712
- end
713
- end
714
-
715
- # Set the status message
716
- def status_message=(val)
717
- @j_del.setStatusMessage(val)
718
- end
719
-
720
- # Get or set the status message
721
- def status_message(val = nil)
722
- if val
723
- @j_del.setStatusMessage(val)
724
- self
725
- else
726
- @j_del.getStatusMessage
727
- end
728
- end
729
-
730
- # Sets whether this response uses HTTP chunked encoding or not.
731
- # @param [Boolean] val. If val is true, this response will use HTTP chunked encoding, and each call to write to the body
732
- # will correspond to a new HTTP chunk sent on the wire. If chunked encoding is used the HTTP header
733
- # 'Transfer-Encoding' with a value of 'Chunked' will be automatically inserted in the response.
734
- # If chunked is false, this response will not use HTTP chunked encoding, and therefore if any data is written the
735
- # body of the response, the total size of that data must be set in the 'Content-Length' header before any
736
- # data is written to the response body.
737
- # An HTTP chunked response is typically used when you do not know the total size of the request body up front.
738
- # @return [HttpServerResponse] self So multiple operations can be chained.
739
- def chunked=(val)
740
- @j_del.setChunked(val)
741
- self
742
- end
743
-
744
- # Get or set chunked
745
- def chunked(val = nil)
746
- if val
747
- @j_del.setChunked(val)
748
- self
749
- else
750
- @j_del.getChunked
751
- end
752
- end
753
-
754
- # @return [MultiMap] The response headers
755
- def headers
756
- if !@headers
757
- @headers = MultiMap.new(@j_del.headers)
758
- end
759
- @headers
760
- end
761
-
762
- # Inserts a header into the response.
763
- # @param [String] key The header key
764
- # @param [Object] value The header value. to_s will be called on the value to determine the actual String value to insert.
765
- # @return [HttpClientRequest] self So multiple operations can be chained.
766
- def put_header(key, value)
767
- @j_del.putHeader(key, value.to_s)
768
- self
769
- end
770
-
771
- # Inserts a trailer into the response.
772
- # @param [String] key The header key
773
- # @param [Object] value The header value. to_s will be called on the value to determine the actual String value to insert.
774
- # @return [HttpClientRequest] self So multiple operations can be chained.
775
- def put_trailer(key, value)
776
- @j_del.putTrailer(key, value.to_s)
777
- self
778
- end
779
-
780
- # The response trailers
781
- def trailers
782
- if !@trailers
783
- @trailers = MultiMap.new(@j_del.trailers)
784
- end
785
- @trailers
786
- end
787
-
788
- # Write a String to the response. The handler will be called when the String has actually been written to the wire.
789
- # @param [String] str. The string to write
790
- # @param [String] enc. Encoding to use.
791
- # @return [HttpServerResponse] self So multiple operations can be chained.
792
- def write_str(str, enc = "UTF-8")
793
- @j_del.write(str, enc)
794
- self
795
- end
796
-
797
- # Tell the kernel to stream a file directly from disk to the outgoing connection, bypassing user-space altogether
798
- # (where supported by the underlying operating system. This is a very efficient way to serve files.
799
- # @param [String] path. Path to file to send.
800
- # @param [String] not_found_file Path to file containing 404 resource in case resource can't be found
801
- # @return [HttpServerResponse] self So multiple operations can be chained.
802
- def send_file(path, not_found_file = nil, &block)
803
- if not_found_file.nil?
804
- if block_given?
805
- @j_del.sendFile(path, ARWrappedHandler.new(block))
806
- else
807
- @j_del.sendFile(path)
808
- end
809
- else
810
- if block_given?
811
- @j_del.sendFile(path, not_found_file, ARWrappendHandler.new(block))
812
- else
813
- @j_del.sendFile(path, not_found_file)
814
- end
815
- end
816
- self
817
- end
818
-
819
- # Ends the response. If no data has been written to the response body, the actual response won't get written until this method gets called.
820
- # Once the response has ended, it cannot be used any more, and if keep alive is true the underlying connection will
821
- # be closed.
822
- # @param [String,Buffer] data. Optional String or Buffer to write before ending the response
823
- def end(data = nil)
824
- if (data.is_a? String) || (data.is_a? Buffer)
825
- @j_del.end(data)
826
- else
827
- @j_del.end
828
- end
829
- end
830
-
831
- # Close the underlying TCP connection
832
- def close
833
- @j_del.close
834
- end
835
-
836
- end
837
-
838
- # Represents a WebSocket.
839
- #
840
- # Instances of this class are created by an {HttpClient} instance when a client succeeds in a WebSocket handshake with a server.
841
- # Once an instance has been obtained it can be used to send or receive buffers of data from the connection,
842
- # a bit like a TCP socket.
843
- #
844
- # @author {http://tfox.org Tim Fox}
845
- class WebSocket
846
-
847
- include ReadStream, WriteStream
848
-
849
- # @private
850
- def initialize(j_ws)
851
- @j_del = j_ws
852
- @binary_handler_id = EventBus.register_simple_handler { |msg|
853
- write_binary_frame(msg.body)
854
- }
855
- @text_handler_id = EventBus.register_simple_handler { |msg|
856
- write_text_frame(msg.body)
857
- }
858
- @j_del.closeHandler(Proc.new {
859
- EventBus.unregister_handler(@binary_handler_id)
860
- EventBus.unregister_handler(@text_handler_id)
861
- @close_handler.call if @close_handler
862
- })
863
- end
864
-
865
- # Write data to the WebSocket as a binary frame
866
- # @param [Buffer] buffer. Data to write.
867
- def write_binary_frame(buffer)
868
- @j_del.writeBinaryFrame(buffer._to_java_buffer)
869
- self
870
- end
871
-
872
- # Write data to the WebSocket as a text frame
873
- # @param [String] str. String to write.
874
- def write_text_frame(str)
875
- @j_del.writeTextFrame(str)
876
- self
877
- end
878
-
879
- # Close the WebSocket
880
- def close
881
- @j_del.close
882
- end
883
-
884
- # When a Websocket is created it automatically registers an event handler with the system, the ID of that
885
- # handler is given by {#binary_handler_id}.
886
- # Given this ID, a different event loop can send a binary frame to that event handler using the event bus. This
887
- # allows you to write data to other WebSockets which are owned by different event loops.
888
- def binary_handler_id
889
- @binary_handler_id
890
- end
891
-
892
- # When a Websocket is created it automatically registers an event handler with the system, the ID of that
893
- # handler is given by {#text_handler_id}.
894
- # Given this ID, a different event loop can send a text frame to that event handler using the event bus. This
895
- # allows you to write data to other WebSockets which are owned by different event loops.
896
- def text_handler_id
897
- @text_handler_id
898
- end
899
-
900
- # Set a closed handler on the WebSocket.
901
- # @param [Block] hndlr A block to be used as the handler
902
- def close_handler(&hndlr)
903
- @close_handler = hndlr;
904
- end
905
-
906
- end
907
-
908
- # Instances of this class are created when a WebSocket is accepted on the server.
909
- # It extends {WebSocket} and adds methods to reject the WebSocket and to get path and headers
910
- class ServerWebSocket < WebSocket
911
-
912
- # @private
913
- def initialize(j_ws)
914
- super(j_ws)
915
- @j_del = j_ws
916
- end
917
-
918
- # Reject the WebSocket
919
- # This can be called in the WebSocket connect handler on the server side and
920
- # will cause the WebSocket connection attempt to be rejected, returning a
921
- # 404 to the client.
922
- def reject
923
- @j_del.reject
924
- end
925
-
926
- # Return the headers of the handshake request
927
- # @return [MultiMap] The handshake headers
928
- def headers
929
- if !@headers
930
- @headers = MultiMap.new(@j_del.headers)
931
- end
932
- @headers
933
- end
934
-
935
- # The path the WebSocket connect was attempted at.
936
- def path
937
- @j_del.path
938
- end
939
- end
940
-
941
- # This class allows you to do route requests based on the HTTP verb and the request URI, in a manner similar
942
- # to <a href="http://www.sinatrarb.com/">Sinatra</a> or <a href="http://expressjs.com/">Express</a>.
943
- #
944
- # RouteMatcher also lets you extract parameters from the request URI either a simple pattern or using
945
- # regular expressions for more complex matches. Any parameters extracted will be added to the requests parameters
946
- # which will be available to you in your request handler.
947
- #
948
- # It's particularly useful when writing REST-ful web applications.
949
- #
950
- # To use a simple pattern to extract parameters simply prefix the parameter name in the pattern with a ':' (colon).
951
- #
952
- # Different handlers can be specified for each of the HTTP verbs, GET, POST, PUT, DELETE etc.
953
- #
954
- # For more complex matches regular expressions can be used in the pattern. When regular expressions are used, the extracted
955
- # parameters do not have a name, so they are put into the HTTP request with names of param0, param1, param2 etc.
956
- #
957
- # Multiple matches can be specified for each HTTP verb. In the case there are more than one matching patterns for
958
- # a particular request, the first matching one will be used.
959
- #
960
- # @author {http://tfox.org Tim Fox}
961
- class RouteMatcher
962
- def initialize
963
- @j_del = org.vertx.java.core.http.RouteMatcher.new
964
- end
965
-
966
- # This method is called to provide the matcher with data.
967
- # @param [HttpServerRequest] request. Input request to the parser.
968
- def input(request)
969
- @j_del.handle(request._to_java_request)
970
- end
971
-
972
- # Specify a handler that will be called for a matching HTTP GET
973
- # @param [String] The simple pattern
974
- # @param [Block] hndlr A block to be used as the handler
975
- def get(pattern, &hndlr)
976
- @j_del.get(pattern) { |j_req| hndlr.call(HttpServerRequest.new(j_req)) }
977
- end
978
-
979
- # Specify a handler that will be called for a matching HTTP PUT
980
- # @param [String] The simple pattern
981
- # @param [Block] hndlr A block to be used as the handler
982
- def put(pattern, &hndlr)
983
- @j_del.put(pattern) { |j_req| hndlr.call(HttpServerRequest.new(j_req)) }
984
- end
985
-
986
- # Specify a handler that will be called for a matching HTTP POST
987
- # @param [String] The simple pattern
988
- # @param [Block] hndlr A block to be used as the handler
989
- def post(pattern, &hndlr)
990
- @j_del.post(pattern) { |j_req| hndlr.call(HttpServerRequest.new(j_req)) }
991
- end
992
-
993
- # Specify a handler that will be called for a matching HTTP DELETE
994
- # @param [String] The simple pattern
995
- # @param [Block] hndlr A block to be used as the handler
996
- def delete(pattern, &hndlr)
997
- @j_del.delete(pattern) { |j_req| hndlr.call(HttpServerRequest.new(j_req)) }
998
- end
999
-
1000
- # Specify a handler that will be called for a matching HTTP OPTIONS
1001
- # @param [String] The simple pattern
1002
- # @param [Block] hndlr A block to be used as the handler
1003
- def options(pattern, &hndlr)
1004
- @j_del.options(pattern) { |j_req| hndlr.call(HttpServerRequest.new(j_req)) }
1005
- end
1006
-
1007
- # Specify a handler that will be called for a matching HTTP HEAD
1008
- # @param [String] The simple pattern
1009
- # @param [Block] hndlr A block to be used as the handler
1010
- def head(pattern, &hndlr)
1011
- @j_del.head(pattern) { |j_req| hndlr.call(HttpServerRequest.new(j_req)) }
1012
- end
1013
-
1014
- # Specify a handler that will be called for a matching HTTP TRACE
1015
- # @param [String] The simple pattern
1016
- # @param [Block] hndlr A block to be used as the handler
1017
- def trace(pattern, &hndlr)
1018
- @j_del.trace(pattern) { |j_req| hndlr.call(HttpServerRequest.new(j_req)) }
1019
- end
1020
-
1021
- # Specify a handler that will be called for a matching HTTP PATCH
1022
- # @param [String] The simple pattern
1023
- # @param [Block] hndlr A block to be used as the handler
1024
- def patch(pattern, &hndlr)
1025
- @j_del.patch(pattern) { |j_req| hndlr.call(HttpServerRequest.new(j_req)) }
1026
- end
1027
-
1028
- # Specify a handler that will be called for a matching HTTP CONNECT
1029
- # @param [String] The simple pattern
1030
- # @param [Block] hndlr A block to be used as the handler
1031
- def connect(pattern, &hndlr)
1032
- @j_del.connect(pattern) { |j_req| hndlr.call(HttpServerRequest.new(j_req)) }
1033
- end
1034
-
1035
- # Specify a handler that will be called for any matching HTTP request
1036
- # @param [String] The simple pattern
1037
- # @param [Block] hndlr A block to be used as the handler
1038
- def all(pattern, &hndlr)
1039
- @j_del.all(pattern) { |j_req| hndlr.call(HttpServerRequest.new(j_req)) }
1040
- end
1041
-
1042
- # Specify a handler that will be called for a matching HTTP GET
1043
- # @param [String] A regular expression for a pattern
1044
- # @param [Block] hndlr A block to be used as the handler
1045
- def get_re(pattern, &hndlr)
1046
-
1047
- @j_del.getWithRegEx(pattern) { |j_req| hndlr.call(HttpServerRequest.new(j_req)) }
1048
- end
1049
-
1050
- # Specify a handler that will be called for a matching HTTP PUT
1051
- # @param [String] A regular expression for a pattern
1052
- # @param [Block] hndlr A block to be used as the handler
1053
- def put_re(pattern, &hndlr)
1054
- @j_del.putWithRegEx(pattern) { |j_req| hndlr.call(HttpServerRequest.new(j_req)) }
1055
- end
1056
-
1057
- # Specify a handler that will be called for a matching HTTP POST
1058
- # @param [String] A regular expression for a pattern
1059
- # @param [Block] hndlr A block to be used as the handler
1060
- def post_re(pattern, &hndlr)
1061
- @j_del.postWithRegEx(pattern) { |j_req| hndlr.call(HttpServerRequest.new(j_req)) }
1062
- end
1063
-
1064
- # Specify a handler that will be called for a matching HTTP DELETE
1065
- # @param [String] A regular expression for a pattern
1066
- # @param [Block] hndlr A block to be used as the handler
1067
- def delete_re(pattern, &hndlr)
1068
- @j_del.deleteWithRegEx(pattern) { |j_req| hndlr.call(HttpServerRequest.new(j_req)) }
1069
- end
1070
-
1071
- # Specify a handler that will be called for a matching HTTP OPTIONS
1072
- # @param [String] A regular expression for a pattern
1073
- # @param [Block] hndlr A block to be used as the handler
1074
- def options_re(pattern, &hndlr)
1075
- @j_del.optionsWithRegEx(pattern) { |j_req| hndlr.call(HttpServerRequest.new(j_req)) }
1076
- end
1077
-
1078
- # Specify a handler that will be called for a matching HTTP HEAD
1079
- # @param [String] A regular expression for a pattern
1080
- # @param [Block] hndlr A block to be used as the handler
1081
- def head_re(pattern, &hndlr)
1082
- @j_del.headWithRegEx(pattern) { |j_req| hndlr.call(HttpServerRequest.new(j_req)) }
1083
- end
1084
-
1085
- # Specify a handler that will be called for a matching HTTP TRACE
1086
- # @param [String] A regular expression for a pattern
1087
- # @param [Block] hndlr A block to be used as the handler
1088
- def trace_re(pattern, proc = nil, &hndlr)
1089
- @j_del.traceWithRegEx(pattern) { |j_req| hndlr.call(HttpServerRequest.new(j_req)) }
1090
- end
1091
-
1092
- # Specify a handler that will be called for a matching HTTP PATCH
1093
- # @param [String] A regular expression for a pattern
1094
- # @param [Block] hndlr A block to be used as the handler
1095
- def patch_re(pattern, &hndlr)
1096
- @j_del.patchWithRegEx(pattern) { |j_req| hndlr.call(HttpServerRequest.new(j_req)) }
1097
- end
1098
-
1099
- # Specify a handler that will be called for a matching HTTP CONNECT
1100
- # @param [String] A regular expression for a pattern
1101
- # @param [Block] hndlr A block to be used as the handler
1102
- def connect_re(pattern, &hndlr)
1103
- @j_del.connectWithRegEx(pattern) { |j_req| hndlr.call(HttpServerRequest.new(j_req)) }
1104
- end
1105
-
1106
- # Specify a handler that will be called for any matching HTTP request
1107
- # @param [String] A regular expression for a pattern
1108
- # @param [Block] hndlr A block to be used as the handler
1109
- def all_re(pattern, &hndlr)
1110
- @j_del.allWithRegEx(pattern) { |j_req| hndlr.call(HttpServerRequest.new(j_req)) }
1111
- end
1112
-
1113
- # Specify a handler that will be called when nothing matches
1114
- # Default behaviour is to return a 404
1115
- # @param [Block] hndlr A block to be used as the handler
1116
- def no_match(&hndlr)
1117
- @j_del.noMatch { |j_req| hndlr.call(HttpServerRequest.new(j_req)) }
1118
- end
1119
-
1120
- end
1121
-
1122
-
1123
- # A map which can hold multiple values for one name / key
1124
- #
1125
- # @author Norman Maurer
1126
- class MultiMap
1127
-
1128
- # @private
1129
- def initialize(j_map)
1130
- @j_map = j_map
1131
- end
1132
-
1133
- # Call the handler for each header name and its value. If there are multiple values are stored for
1134
- # a header name it will be called for each of them
1135
- #
1136
- def each(&hndlr)
1137
- names.each do |name|
1138
- values = @j_map.getAll(name)
1139
- for v in values
1140
- hndlr.call(name, v)
1141
- end
1142
- end
1143
- end
1144
-
1145
- # Returns the value of with the specified name. If there are
1146
- # more than one values for the specified name, the first value is returned.
1147
- #
1148
- # @param name The name of the header to search
1149
- # @return The first header value or nil if there is no such entry
1150
- def get(name)
1151
- @j_map.get(name)
1152
- end
1153
-
1154
- # Returns the value of with the specified name. If there are
1155
- # more than one values for the specified name, the first value is returned.
1156
- #
1157
- # @param name The name of the header to search
1158
- # @return The first header value or nil if there is no such entry
1159
- def [](name)
1160
- @j_map.get(name)
1161
- end
1162
-
1163
-
1164
- # Set a value with the specified name and value.
1165
- #
1166
- # @param name The name
1167
- # @param value The value being added
1168
- # @return self
1169
- def []=(name, value)
1170
- @j_map.set(name, value)
1171
- self
1172
- end
1173
-
1174
- # Returns the values with the specified name
1175
- #
1176
- # @param name The name to search
1177
- # @return [Array] A immutable array of values which will be empty if no values
1178
- # are found
1179
- def get_all(name)
1180
- @j_map.getAll(name).to_a
1181
- end
1182
-
1183
- # Returns true if an entry with the given name was found
1184
- def contains(name)
1185
- @j_map.contains(name)
1186
- end
1187
-
1188
- # Returns true if the map is empty
1189
- def empty?
1190
- @j_map.isEmpty()
1191
- end
1192
-
1193
- # Return a Set which holds all names of the entries
1194
- #
1195
- # @return [Set] The set which holds all names or an empty set if it is empty
1196
- def names
1197
- @j_map.names()
1198
- end
1199
-
1200
-
1201
- # Adds a new value with the specified name and value.
1202
- #
1203
- # @param name The name
1204
- # @param value The value being added
1205
- # @return self
1206
- def add(name, value)
1207
- @j_map.add(name, value)
1208
- self
1209
- end
1210
-
1211
- # Set a value with the specified name and value.
1212
- #
1213
- # @param name The name
1214
- # @param value The value being added
1215
- # @return self
1216
- def set(name, value)
1217
- @j_map.set(name, value)
1218
- self
1219
- end
1220
-
1221
- # Set a value with the specified name and value.
1222
- #
1223
- # @param name The name
1224
- # @param value The value being added
1225
- # @return self
1226
- def set_all(map)
1227
- @j_map.set(map._j_map)
1228
- self
1229
- end
1230
-
1231
- # Remove the values with the given name
1232
- #
1233
- # @param name The name
1234
- # @return self
1235
- def remove(name)
1236
- @j_map.remove(name)
1237
- self
1238
- end
1239
-
1240
- # Remove all entries
1241
- #
1242
- # @return self
1243
- def clear
1244
- @j_map.clear()
1245
- self
1246
- end
1247
-
1248
- # Return the number of names in this instance
1249
- def size
1250
- @j_map.size()
1251
- end
1252
-
1253
- def _j_map
1254
- @j_map
1255
- end
1256
- end
1257
-
1258
- # An Upload which was found in the HttpServerMultipartRequest while handling it.
1259
- #
1260
- # @author Norman Maurer
1261
- #
1262
- class HttpServerFileUpload
1263
-
1264
- include ReadStream
1265
-
1266
- # @private
1267
- def initialize(j_del)
1268
- @j_del = j_del
1269
- end
1270
-
1271
- # Stream the content of this upload to the given filename.
1272
- def stream_to_file_system(filename)
1273
- @j_del.streamToFileSystem(filename)
1274
- self
1275
- end
1276
-
1277
- # Returns the filename of the attribute
1278
- def filename
1279
- @j_del.filename()
1280
- end
1281
-
1282
- # Returns the name of the attribute
1283
- def name
1284
- @j_del.name()
1285
- end
1286
-
1287
- # Returns the contentType for the upload
1288
- def content_type
1289
- @j_del.contentType()
1290
- end
1291
-
1292
- #Returns the contentTransferEncoding for the upload
1293
- def content_transfer_encoding
1294
- @j_del.contentTransferEncoding()
1295
- end
1296
-
1297
- # Returns the charset for the upload
1298
- def charset
1299
- @j_del.charset().toString()
1300
- end
1301
-
1302
- #Returns the size of the upload (in bytes)
1303
- def size
1304
- @j_del.size()
1305
- end
1306
- end
1307
- end