jubilee 2.1.0.beta-java → 2.1.0.rc1-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/Gemfile.lock +13 -1
- data/README.md +65 -54
- data/Rakefile +23 -21
- data/examples/chatapp/Gemfile +1 -2
- data/examples/chatapp/Gemfile.lock +2 -2
- data/examples/chatapp/README.md +14 -2
- data/examples/chatapp/app.rb +1 -0
- data/examples/chatapp/config.json +4 -0
- data/examples/chatapp/config.ru +0 -2
- data/jars/annotations-1.3.2.jar +0 -0
- data/jars/lang-jruby-2.1.0-final.jar +0 -0
- data/jars/log4j-1.2.16.jar +0 -0
- data/jars/slf4j-api-1.6.2.jar +0 -0
- data/jars/vertx-core-2.1.2.jar +0 -0
- data/jars/{vertx-hazelcast-2.1.1.jar → vertx-hazelcast-2.1.2.jar} +0 -0
- data/jars/{vertx-platform-2.1.1.jar → vertx-platform-2.1.2.jar} +0 -0
- data/lib/container.rb +117 -0
- data/lib/{vertx → core}/buffer.rb +1 -1
- data/lib/core/datagram.rb +280 -0
- data/lib/core/dns.rb +143 -0
- data/lib/{vertx → core}/event_bus.rb +79 -8
- data/lib/core/file_system.rb +479 -0
- data/lib/{vertx → core}/http.rb +635 -5
- data/lib/core/net.rb +251 -0
- data/lib/core/network_support.rb +77 -0
- data/lib/core/parsetools.rb +105 -0
- data/lib/{vertx → core}/shared_data.rb +2 -2
- data/lib/core/sock_js.rb +116 -0
- data/lib/{vertx → core}/ssl_support.rb +21 -1
- data/lib/{vertx → core}/streams.rb +32 -21
- data/lib/{vertx → core}/tcp_support.rb +22 -36
- data/lib/core/timers.rb +73 -0
- data/lib/core/vertx_require.rb +25 -0
- data/lib/{vertx → core}/wrapped_handler.rb +0 -0
- data/lib/jubilee.rb +5 -8
- data/lib/jubilee/cli.rb +1 -1
- data/lib/jubilee/jubilee.jar +0 -0
- data/lib/jubilee/jubilee_require.rb +24 -0
- data/lib/jubilee/version.rb +1 -1
- data/lib/test_utils.rb +66 -0
- data/lib/vertx.rb +13 -10
- data/lib/vertx_tests.rb +8 -0
- data/pom.xml +351 -0
- data/src/main/assembly/mod.xml +21 -0
- data/{java/src → src/main/java}/jubilee/JubileeService.java +0 -0
- data/{java/src → src/main/java}/org/jruby/jubilee/Const.java +0 -0
- data/{java/src → src/main/java}/org/jruby/jubilee/JubileeVerticle.java +12 -2
- data/src/main/java/org/jruby/jubilee/JubileeVerticleFactory.java +258 -0
- data/{java/src → src/main/java}/org/jruby/jubilee/RackApplication.java +3 -1
- data/{java/src → src/main/java}/org/jruby/jubilee/RackEnvironment.java +2 -2
- data/{java/src → src/main/java}/org/jruby/jubilee/RackEnvironmentHash.java +0 -0
- data/{java/src → src/main/java}/org/jruby/jubilee/RackInput.java +0 -0
- data/{java/src → src/main/java}/org/jruby/jubilee/RackResponse.java +0 -0
- data/{java/src → src/main/java}/org/jruby/jubilee/RubyCallable.java +0 -0
- data/{java/src → src/main/java}/org/jruby/jubilee/RubyHttpServerResponse.java +0 -0
- data/{java/src → src/main/java}/org/jruby/jubilee/RubyNetSocket.java +0 -0
- data/{java/src → src/main/java}/org/jruby/jubilee/RubyPlatformManager.java +0 -0
- data/{java/src → src/main/java}/org/jruby/jubilee/impl/RubyIORackInput.java +0 -0
- data/{java/src → src/main/java}/org/jruby/jubilee/impl/RubyNullIO.java +0 -0
- data/{java/src → src/main/java}/org/jruby/jubilee/utils/RubyHelper.java +0 -0
- data/{java/src → src/main/java}/org/jruby/jubilee/vertx/JubileeVertx.java +0 -0
- data/{java → src/main}/resources/META-INF/services/org.vertx.java.core.spi.cluster.ClusterManagerFactory +0 -0
- data/src/main/resources/META-INF/services/org.vertx.java.deploy.impl.jruby.JubileeVerticleFactory +1 -0
- data/{java → src/main}/resources/default-cluster.xml +0 -0
- data/src/main/resources/mod.json +11 -0
- data/test/jubilee/test_upload.rb +3 -1
- data/vertx_classpath.txt +12 -0
- metadata +69 -47
- data/Guardfile +0 -24
- data/jars/vertx-core-2.1.1.jar +0 -0
- data/java/src/org/jruby/jubilee/RubyChannel.java +0 -89
- data/lib/vertx/README.md +0 -7
data/lib/{vertx → core}/http.rb
RENAMED
@@ -12,12 +12,106 @@
|
|
12
12
|
# See the License for the specific language governing permissions and
|
13
13
|
# limitations under the License.
|
14
14
|
|
15
|
-
require '
|
16
|
-
require '
|
17
|
-
require '
|
18
|
-
require '
|
15
|
+
require 'core/streams'
|
16
|
+
require 'core/ssl_support'
|
17
|
+
require 'core/tcp_support'
|
18
|
+
require 'core/wrapped_handler'
|
19
19
|
|
20
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
|
+
|
21
115
|
# An HTTP client.
|
22
116
|
# A client maintains a pool of connections to a specific host, at a specific port. The HTTP connections can act
|
23
117
|
# as pipelines for HTTP requests.
|
@@ -31,7 +125,7 @@ module Vertx
|
|
31
125
|
|
32
126
|
# Create a new HttpClient
|
33
127
|
def initialize(config = {})
|
34
|
-
@j_del = org.
|
128
|
+
@j_del = org.vertx.java.platform.impl.JRubyVerticleFactory.vertx.createHttpClient
|
35
129
|
self.compression = config[:try_compression] if config.has_key?(:try_compression)
|
36
130
|
end
|
37
131
|
|
@@ -470,6 +564,277 @@ module Vertx
|
|
470
564
|
|
471
565
|
end
|
472
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
|
+
|
473
838
|
# Represents a WebSocket.
|
474
839
|
#
|
475
840
|
# Instances of this class are created by an {HttpClient} instance when a client succeeds in a WebSocket handshake with a server.
|
@@ -540,6 +905,221 @@ module Vertx
|
|
540
905
|
|
541
906
|
end
|
542
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
|
+
|
543
1123
|
# A map which can hold multiple values for one name / key
|
544
1124
|
#
|
545
1125
|
# @author Norman Maurer
|
@@ -674,4 +1254,54 @@ module Vertx
|
|
674
1254
|
@j_map
|
675
1255
|
end
|
676
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
|
677
1307
|
end
|