fishwife 1.7.1-java → 1.8.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 49ba88942b20584f44b25aefd7bf7e89b7aca866
4
- data.tar.gz: 852715381ce87883a6eb97faf83e3bf79721ff48
3
+ metadata.gz: dde09a0a87fbd2aa589d44a02616cb08993cca24
4
+ data.tar.gz: b88680fc0b5dfa5ab36e111310fec7a087ead6c1
5
5
  SHA512:
6
- metadata.gz: 05b6d43b0a0322c543c81d8adb212fa56f6f4104d2f70234af482e2cec75c35e7901952d92c25df9f39be9280ca40fe1a1e5b80e138994247f761e82aecf63e5
7
- data.tar.gz: f96dfb3a3322d399189362c76ac84befa24348c2b82ffc7343ef2e83d1c0768022aed4f3992073dcf7a782895ae5ce53b17f626216804a6e3b1be56b3fd5aba9
6
+ metadata.gz: 1bdd3ba4110e324a8a5b678102c25edab31872633f29ffab82fc523f1f964eb3c9d3d750ed09fda8832edbcb3f6aa82018a7485824c22f4420b9bff55307fb68
7
+ data.tar.gz: df9ce253c9096bf6db08b5f058a1c377b408dd4f8b781a42d73ac7014b15f4a8eec920d71ee480ff3b66b7753cbb04d88634a29086ef5aef3db8d31a8cc89266
data/History.rdoc CHANGED
@@ -1,3 +1,11 @@
1
+ === 1.8.0 (2015-5-3)
2
+ * Added Fishwife::HttpServer::new :connections configuration, allowing
3
+ multiple connectors and including SSL support. (#10 with Gregory
4
+ Huczynski)
5
+ * Upgrade/broaden to rjack-jetty [9.2.11, 9.4), for SSL/connections
6
+ support. Tested with 9.3.0.0 (M2 prerelease). Note that 9.2.11 is
7
+ awaiting upstream release and backport of the same features.
8
+
1
9
  === 1.7.1 (2015-3-30)
2
10
  * Add missing StringIO require from 1.7.0 rewind feature
3
11
  changes (Theo Hultberg, #8)
data/Manifest.txt CHANGED
@@ -7,6 +7,7 @@ pom.xml
7
7
  bin/fishwife
8
8
  example/config.ru
9
9
  example/giant.ru
10
+ example/ssl.ru
10
11
  lib/fishwife/base.rb
11
12
  lib/fishwife.rb
12
13
  lib/fishwife/http_server.rb
@@ -16,5 +17,6 @@ spec/fishwife_spec.rb
16
17
  spec/spec_helper.rb
17
18
  spec/test_app.rb
18
19
  spec/data/hello.txt
20
+ spec/data/localhost.keystore
19
21
  spec/data/reddit-icon.png
20
- lib/fishwife/fishwife-1.7.1.jar
22
+ lib/fishwife/fishwife-1.8.0.jar
data/README.rdoc CHANGED
@@ -40,15 +40,21 @@ unique features:
40
40
  To use Fishwife with your Rack app and config.ru:
41
41
 
42
42
  gem install fishwife
43
-
44
43
  cd /path/to/my/rack/app
44
+
45
+ Then:
46
+
45
47
  fishwife
46
48
 
47
49
  -or-
48
50
 
49
51
  rackup -s Fishwife
50
52
 
51
- See included example/config.ru and the note below on logging.
53
+ See also:
54
+
55
+ * Fishwife::HttpServer::new supported options
56
+ * example/config.ru
57
+ * Notes below on Logging and Process Monitoring
52
58
 
53
59
  == Logging
54
60
 
@@ -82,6 +88,8 @@ using:
82
88
  desired. For an example see:
83
89
  {boxed-geminabox}[https://github.com/dekellum/boxed-geminabox#readme].
84
90
 
91
+ * Linux systemd
92
+
85
93
  All options also support redirecting log output (including any
86
94
  JVM-level errors) to a file. Iyyov supports log rotation internally.
87
95
  Unix-like logrotate(8) may be used with the former process monitors.
data/example/ssl.ru ADDED
@@ -0,0 +1,10 @@
1
+ # -*- ruby -*-
2
+ #\ -s Fishwife -O connections=tcp://127.0.0.1:9292|ssl://0.0.0.0:9433?key_store_path=spec/data/localhost.keystore&key_store_password=password
3
+
4
+ # We don't assume SLF4J log output handler when launching via
5
+ # 'rackup', so you should do something like this here.
6
+ # If launching via bin/fishwife, this isn't required.
7
+ require 'rjack-logback'
8
+ RJack::Logback.config_console( :stderr => true, :thread => true )
9
+
10
+ run proc { [ 200, {"Content-Type" => "text/plain"}, ["Hello", " world!\n"] ] }
data/lib/fishwife/base.rb CHANGED
@@ -15,6 +15,6 @@
15
15
  #++
16
16
 
17
17
  module Fishwife
18
- VERSION = '1.7.1'
18
+ VERSION = '1.8.0'
19
19
  LIB_DIR = File.dirname( __FILE__ )
20
20
  end
@@ -17,17 +17,20 @@
17
17
  module Fishwife
18
18
  class HttpServer < RJack::Jetty::ServerFactory
19
19
 
20
- attr_accessor :host
21
-
22
20
  # Create the server with specified options:
23
21
  #
24
22
  # :host::
25
- # String specifying the IP address to bind to (default: 0.0.0.0)
23
+ # The interface to bind to (default: 0.0.0.0 -> all)
26
24
  #
27
25
  # :port::
28
- # String or integer with the port to bind to (default: 9292).
29
- # Jetty picks if given port 0 (and port can be read on return
30
- # from start.)
26
+ # The local port to bind to, for the first connection. Jetty
27
+ # picks if given port 0, and first connection port can be read
28
+ # on return from start. (default: 9292)
29
+ #
30
+ # :connections::
31
+ # An array, or a string that will be split on '|', where each
32
+ # element is a connection URI String or a hash of
33
+ # parameters. See details below.
31
34
  #
32
35
  # :min_threads::
33
36
  # Minimum number of threads to keep in pool (default: 5)
@@ -54,11 +57,29 @@ module Fishwife
54
57
  # request will be rejected with status 413. This limit is
55
58
  # provided to avoid pathologic resource exhaustion. (default: 8 MiB)
56
59
  #
60
+ # === Options in connections
61
+ #
62
+ # Each member of the connections array is either a hash with
63
+ # the following properties or an equivalent URI string:
64
+ #
65
+ # :scheme:: Values 'tcp' or 'ssl'
66
+ # :host:: The local interface to bind
67
+ # (default: top level #host or 0.0.0.0)
68
+ # :port:: Port number or 0 to select an available port
69
+ # (default: top level #port for first connection or 0)
70
+ # :max_idle_time_ms:: See above
71
+ # :key_store_path:: For ssl, the path to the (Java JKS) keystore
72
+ # :key_store_password:: For ssl, the password to the keystore
73
+ #
74
+ # URI examples:
75
+ #
76
+ # tcp://127.0.0.1
77
+ # ssl://0.0.0.0:8443?key_store_path=keystore&key_store_password=399as8d9
78
+ #
57
79
  def initialize( options = {} )
58
80
  super()
59
81
 
60
82
  @server = nil
61
- @host = nil
62
83
 
63
84
  self.min_threads = 5
64
85
  self.max_threads = 50
@@ -76,6 +97,9 @@ module Fishwife
76
97
  v = options[ :request_log_file ]
77
98
  options[ :request_log_file ] = v.to_sym if v == 'stderr'
78
99
 
100
+ v = options[ :connections ]
101
+ options[ :connections ] = v.split('|') if v.is_a?( String )
102
+
79
103
  # Split out servlet options.
80
104
  @servlet_options = {}
81
105
  [ :request_body_ram, :request_body_tmpdir, :request_body_max ].each do |k|
@@ -111,12 +135,5 @@ module Fishwife
111
135
  def stop
112
136
  @server.stop if @server
113
137
  end
114
-
115
- def create_connectors( *args )
116
- super.tap do |ctrs|
117
- ctrs.first.host = @host if ctrs.first
118
- end
119
- end
120
-
121
138
  end
122
139
  end
data/pom.xml CHANGED
@@ -4,7 +4,7 @@
4
4
  <groupId>fishwife</groupId>
5
5
  <artifactId>fishwife</artifactId>
6
6
  <packaging>jar</packaging>
7
- <version>1.7.1</version>
7
+ <version>1.8.0</version>
8
8
  <name>Fishwife Java Extension</name>
9
9
 
10
10
  <properties>
Binary file
@@ -23,203 +23,228 @@ require 'base64'
23
23
  require 'json'
24
24
 
25
25
  describe Fishwife do
26
- def get(path, headers = {})
27
- Net::HTTP.start(@options[:host], @options[:port]) do |http|
28
- request = Net::HTTP::Get.new(path, headers)
29
- http.request(request)
30
- end
31
- end
32
26
 
33
- def post(path, params = nil, headers = {}, body = nil)
34
- Net::HTTP.start(@options[:host], @options[:port]) do |http|
35
- request = Net::HTTP::Post.new(path, headers)
36
- request.form_data = params if params
37
- if body
38
- if body.respond_to?( :read )
39
- request.body_stream = body
40
- else
41
- request.body = body
27
+ [:http, :https].each do |scheme|
28
+
29
+ describe "for #{scheme.to_s} scheme" do
30
+
31
+ def get(path, headers = {})
32
+ Net::HTTP.start(@options[:host], @options[:port],
33
+ nil, nil, nil, nil, #Irrelevant http proxy parameters
34
+ @https_client_opts) do |http|
35
+ request = Net::HTTP::Get.new(path, headers)
36
+ http.request(request)
42
37
  end
43
38
  end
44
- http.request(request)
45
- end
46
- end
47
39
 
48
- before(:all) do
49
- @lock = Mutex.new
50
- @app = Rack::Lint.new(TestApp.new)
51
- @options = { :host => '127.0.0.1',
52
- :port => 9201,
53
- :request_body_ram => 256,
54
- :request_body_max => 96 * 1024,
55
- :request_body_tmpdir => File.dirname( __FILE__ ) }
56
- Net::HTTP.version_1_2
57
- @server = Fishwife::HttpServer.new(@options)
58
- @server.start(@app)
59
- end
40
+ def post(path, params = nil, headers = {}, body = nil)
41
+ Net::HTTP.start(@options[:host], @options[:port],
42
+ nil, nil, nil, nil, #Irrelevant http proxy parameters
43
+ @https_client_opts) do |http|
44
+ request = Net::HTTP::Post.new(path, headers)
45
+ request.form_data = params if params
46
+ if body
47
+ if body.respond_to?( :read )
48
+ request.body_stream = body
49
+ else
50
+ request.body = body
51
+ end
52
+ end
53
+ http.request(request)
54
+ end
55
+ end
60
56
 
61
- after(:all) do
62
- @server.stop
63
- @server.join
64
- end
57
+ before(:all) do
58
+ @scheme = scheme
59
+ @options = { :host => '127.0.0.1',
60
+ :port => 9201,
61
+ :request_body_ram => 256,
62
+ :request_body_max => 96 * 1024,
63
+ :request_body_tmpdir => File.dirname( __FILE__ ) }
64
+ @https_client_opts = {}
65
+ if @scheme == :https
66
+ @https_client_opts = {
67
+ :use_ssl => true,
68
+ :verify_mode => OpenSSL::SSL::VERIFY_NONE }
69
+ @options[:connections] = [ {
70
+ :scheme => 'ssl',
71
+ :key_store_path => 'spec/data/localhost.keystore',
72
+ :key_store_password => 'password' } ]
73
+ end
65
74
 
66
- it "returns 200 OK" do
67
- response = get("/ping")
68
- response.code.should == "200"
69
- end
75
+ @lock = Mutex.new
76
+ @app = Rack::Lint.new(TestApp.new)
77
+ Net::HTTP.version_1_2
78
+ @server = Fishwife::HttpServer.new(@options)
79
+ @server.start(@app)
80
+ end
70
81
 
71
- it "returns 403 FORBIDDEN" do
72
- response = get("/error/403")
73
- response.code.should == "403"
74
- end
82
+ after(:all) do
83
+ @server.stop
84
+ @server.join
85
+ end
75
86
 
76
- it "returns 404 NOT FOUND" do
77
- response = get("/jimmy/hoffa")
78
- response.code.should == "404"
79
- end
87
+ it "returns 200 OK" do
88
+ response = get("/ping")
89
+ response.code.should == "200"
90
+ end
80
91
 
81
- it "sets Rack headers" do
82
- response = get("/echo")
83
- response.code.should == "200"
84
- content = JSON.parse(response.body)
85
- content["rack.multithread"].should be_true
86
- content["rack.multiprocess"].should be_false
87
- content["rack.run_once"].should be_false
88
- end
92
+ it "returns 403 FORBIDDEN" do
93
+ response = get("/error/403")
94
+ response.code.should == "403"
95
+ end
89
96
 
90
- it "passes form variables via GET" do
91
- response = get("/echo?answer=42")
92
- response.code.should == "200"
93
- content = JSON.parse(response.body)
94
- content['request.params']['answer'].should == '42'
95
- end
97
+ it "returns 404 NOT FOUND" do
98
+ response = get("/jimmy/hoffa")
99
+ response.code.should == "404"
100
+ end
96
101
 
97
- it "passes form variables via POST" do
98
- question = "What is the answer to life, the universe, and everything?"
99
- response = post("/echo", 'question' => question)
100
- response.code.should == "200"
101
- content = JSON.parse(response.body)
102
- content['request.params']['question'].should == question
103
- end
102
+ it "sets Rack headers" do
103
+ response = get("/echo")
104
+ response.code.should == "200"
105
+ content = JSON.parse(response.body)
106
+ content["rack.multithread"].should be_true
107
+ content["rack.multiprocess"].should be_false
108
+ content["rack.run_once"].should be_false
109
+ end
104
110
 
105
- it "Passes along larger non-form POST body" do
106
- body = '<' + "f" * (93*1024) + '>'
107
- headers = { "Content-Type" => "text/plain" }
108
- response = post("/dcount", nil, headers, body)
109
- response.code.should == "200"
110
- response.body.to_i.should == body.size * 2
111
- end
111
+ it "passes form variables via GET" do
112
+ response = get("/echo?answer=42")
113
+ response.code.should == "200"
114
+ content = JSON.parse(response.body)
115
+ content['request.params']['answer'].should == '42'
116
+ end
112
117
 
113
- it "Passes along larger non-form POST body when chunked" do
114
- body = '<' + "f" * (93*1024) + '>'
115
- headers = { "Content-Type" => "text/plain",
116
- "Transfer-Encoding" => "chunked" }
117
- response = post("/dcount", nil, headers, StringIO.new( body ) )
118
- response.code.should == "200"
119
- response.body.to_i.should == body.size * 2
120
- end
121
-
122
- it "Rejects request body larger than maximum" do
123
- body = '<' + "f" * (100*1024) + '>'
124
- headers = { "Content-Type" => "text/plain" }
125
- response = post("/count", nil, headers, body)
126
- response.code.should == "413"
127
- end
118
+ it "passes form variables via POST" do
119
+ question = "What is the answer to life, the universe, and everything?"
120
+ response = post("/echo", 'question' => question)
121
+ response.code.should == "200"
122
+ content = JSON.parse(response.body)
123
+ content['request.params']['question'].should == question
124
+ end
128
125
 
129
- it "Rejects request body larger than maximum in chunked request" do
130
- body = '<' + "f" * (100*1024) + '>'
131
- headers = { "Content-Type" => "text/plain",
132
- "Transfer-Encoding" => "chunked" }
133
- response = post("/count", nil, headers, StringIO.new( body ) )
134
- response.code.should == "413"
135
- end
126
+ it "Passes along larger non-form POST body" do
127
+ body = '<' + "f" * (93*1024) + '>'
128
+ headers = { "Content-Type" => "text/plain" }
129
+ response = post("/dcount", nil, headers, body)
130
+ response.code.should == "200"
131
+ response.body.to_i.should == body.size * 2
132
+ end
136
133
 
137
- it "passes custom headers" do
138
- response = get("/echo", "X-My-Header" => "Pancakes")
139
- response.code.should == "200"
140
- content = JSON.parse(response.body)
141
- content["HTTP_X_MY_HEADER"].should == "Pancakes"
142
- end
134
+ it "Passes along larger non-form POST body when chunked" do
135
+ body = '<' + "f" * (93*1024) + '>'
136
+ headers = { "Content-Type" => "text/plain",
137
+ "Transfer-Encoding" => "chunked" }
138
+ response = post("/dcount", nil, headers, StringIO.new( body ) )
139
+ response.code.should == "200"
140
+ response.body.to_i.should == body.size * 2
141
+ end
142
+
143
+ it "Rejects request body larger than maximum" do
144
+ body = '<' + "f" * (100*1024) + '>'
145
+ headers = { "Content-Type" => "text/plain" }
146
+ response = post("/count", nil, headers, body)
147
+ response.code.should == "413"
148
+ end
143
149
 
144
- it "returns multiple values of the same header" do
145
- response = get("/multi_headers")
146
- response['Warning'].should == "warn-1, warn-2"
147
- # Net::HTTP handle multiple headers with join( ", " )
148
- end
150
+ it "Rejects request body larger than maximum in chunked request" do
151
+ body = '<' + "f" * (100*1024) + '>'
152
+ headers = { "Content-Type" => "text/plain",
153
+ "Transfer-Encoding" => "chunked" }
154
+ response = post("/count", nil, headers, StringIO.new( body ) )
155
+ response.code.should == "413"
156
+ end
149
157
 
150
- it "lets the Rack app know it's running as a servlet" do
151
- response = get("/echo", 'answer' => '42')
152
- response.code.should == "200"
153
- content = JSON.parse(response.body)
154
- content['rack.java.servlet'].should be_true
155
- end
158
+ it "passes custom headers" do
159
+ response = get("/echo", "X-My-Header" => "Pancakes")
160
+ response.code.should == "200"
161
+ content = JSON.parse(response.body)
162
+ content["HTTP_X_MY_HEADER"].should == "Pancakes"
163
+ end
156
164
 
157
- it "is clearly Jetty" do
158
- response = get("/ping")
159
- response['server'].should =~ /jetty/i
160
- end
165
+ it "returns multiple values of the same header" do
166
+ response = get("/multi_headers")
167
+ response['Warning'].should == "warn-1, warn-2"
168
+ # Net::HTTP handle multiple headers with join( ", " )
169
+ end
161
170
 
162
- it "sets the server port and hostname" do
163
- response = get("/echo")
164
- content = JSON.parse(response.body)
165
- content["SERVER_PORT"].should == "9201"
166
- content["SERVER_NAME"].should == "127.0.0.1"
167
- end
171
+ it "lets the Rack app know it's running as a servlet" do
172
+ response = get("/echo", 'answer' => '42')
173
+ response.code.should == "200"
174
+ content = JSON.parse(response.body)
175
+ content['rack.java.servlet'].should be_true
176
+ end
168
177
 
169
- it "passes the URI scheme" do
170
- response = get("/echo")
171
- content = JSON.parse(response.body)
172
- content['rack.url_scheme'].should == 'http'
173
- end
178
+ it "is clearly Jetty" do
179
+ response = get("/ping")
180
+ response['server'].should =~ /jetty/i
181
+ end
174
182
 
175
- it "supports file downloads" do
176
- response = get("/download")
177
- response.code.should == "200"
178
- response['Content-Type'].should == 'image/png'
179
- checksum = Digest::MD5.hexdigest(response.body)
180
- checksum.should == '8da4b60a9bbe205d4d3699985470627e'
181
- end
183
+ it "sets the server port and hostname" do
184
+ response = get("/echo")
185
+ content = JSON.parse(response.body)
186
+ content["SERVER_PORT"].should == "9201"
187
+ content["SERVER_NAME"].should == "127.0.0.1"
188
+ end
182
189
 
183
- it "supports file uploads" do
184
- boundary = '349832898984244898448024464570528145'
185
- content = []
186
- content << "--#{boundary}"
187
- content << 'Content-Disposition: form-data; name="file"; ' +
188
- 'filename="reddit-icon.png"'
189
- content << 'Content-Type: image/png'
190
- content << 'Content-Transfer-Encoding: base64'
191
- content << ''
192
- content <<
193
- Base64.encode64( File.read('spec/data/reddit-icon.png') ).strip
194
- content << "--#{boundary}--"
195
- body = content.map { |l| l + "\r\n" }.join('')
196
- headers = { "Content-Type" =>
197
- "multipart/form-data; boundary=#{boundary}" }
198
- response = post("/upload", nil, headers, body)
199
- response.code.should == "200"
200
- response.body.should == '8da4b60a9bbe205d4d3699985470627e'
201
- end
190
+ it "passes the URI scheme" do
191
+ response = get("/echo")
192
+ content = JSON.parse(response.body)
193
+ content['rack.url_scheme'].should == @scheme.to_s
194
+ end
202
195
 
203
- it "handles async requests" do
204
- pending "Causes intermittent 30s pauses, TestApp.push/pull is sketchy"
205
- lock = Mutex.new
206
- buffer = Array.new
207
-
208
- clients = 10.times.map do |index|
209
- Thread.new do
210
- Net::HTTP.start(@options[:host], @options[:port]) do |http|
211
- response = http.get("/pull")
212
- lock.synchronize {
213
- buffer << "#{index}: #{response.body}" }
196
+ it "supports file downloads" do
197
+ response = get("/download")
198
+ response.code.should == "200"
199
+ response['Content-Type'].should == 'image/png'
200
+ checksum = Digest::MD5.hexdigest(response.body)
201
+ checksum.should == '8da4b60a9bbe205d4d3699985470627e'
202
+ end
203
+
204
+ it "supports file uploads" do
205
+ boundary = '349832898984244898448024464570528145'
206
+ content = []
207
+ content << "--#{boundary}"
208
+ content << 'Content-Disposition: form-data; name="file"; ' +
209
+ 'filename="reddit-icon.png"'
210
+ content << 'Content-Type: image/png'
211
+ content << 'Content-Transfer-Encoding: base64'
212
+ content << ''
213
+ content <<
214
+ Base64.encode64( File.read('spec/data/reddit-icon.png') ).strip
215
+ content << "--#{boundary}--"
216
+ body = content.map { |l| l + "\r\n" }.join('')
217
+ headers = { "Content-Type" =>
218
+ "multipart/form-data; boundary=#{boundary}" }
219
+ response = post("/upload", nil, headers, body)
220
+ response.code.should == "200"
221
+ response.body.should == '8da4b60a9bbe205d4d3699985470627e'
222
+ end
223
+
224
+ it "handles async requests" do
225
+ pending "Causes intermittent 30s pauses, TestApp.push/pull is sketchy"
226
+ lock = Mutex.new
227
+ buffer = Array.new
228
+
229
+ clients = 10.times.map do |index|
230
+ Thread.new do
231
+ Net::HTTP.start(@options[:host], @options[:port]) do |http|
232
+ response = http.get("/pull")
233
+ lock.synchronize {
234
+ buffer << "#{index}: #{response.body}" }
235
+ end
236
+ end
214
237
  end
238
+
239
+ lock.synchronize { buffer.should be_empty }
240
+ post("/push", 'message' => "one")
241
+ clients.each { |c| c.join }
242
+ lock.synchronize { buffer.should_not be_empty }
243
+ lock.synchronize { buffer.count.should == 10 }
215
244
  end
245
+
216
246
  end
217
247
 
218
- lock.synchronize { buffer.should be_empty }
219
- post("/push", 'message' => "one")
220
- clients.each { |c| c.join }
221
- lock.synchronize { buffer.should_not be_empty }
222
- lock.synchronize { buffer.count.should == 10 }
223
248
  end
224
249
 
225
250
  end
data/spec/spec_helper.rb CHANGED
@@ -26,6 +26,7 @@ RJack::Logback.root.level = RJack::Logback::DEBUG if ENV['DEBUG_LOG']
26
26
  # All dependencies for testing.
27
27
  require 'yaml'
28
28
  require 'net/http'
29
+ require 'openssl'
29
30
  require 'rack/urlmap'
30
31
  require 'rack/lint'
31
32
  require 'fishwife'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fishwife
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.7.1
4
+ version: 1.8.0
5
5
  platform: java
6
6
  authors:
7
7
  - David Kellum
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-30 00:00:00.000000000 Z
11
+ date: 2015-05-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement
@@ -35,10 +35,10 @@ dependencies:
35
35
  requirements:
36
36
  - - '>='
37
37
  - !ruby/object:Gem::Version
38
- version: 9.1.3
38
+ version: 9.2.11
39
39
  - - <
40
40
  - !ruby/object:Gem::Version
41
- version: '9.3'
41
+ version: '9.4'
42
42
  name: rjack-jetty
43
43
  prerelease: false
44
44
  type: :runtime
@@ -46,10 +46,10 @@ dependencies:
46
46
  requirements:
47
47
  - - '>='
48
48
  - !ruby/object:Gem::Version
49
- version: 9.1.3
49
+ version: 9.2.11
50
50
  - - <
51
51
  - !ruby/object:Gem::Version
52
- version: '9.3'
52
+ version: '9.4'
53
53
  - !ruby/object:Gem::Dependency
54
54
  requirement: !ruby/object:Gem::Requirement
55
55
  requirements:
@@ -138,14 +138,16 @@ files:
138
138
  - bin/fishwife
139
139
  - example/config.ru
140
140
  - example/giant.ru
141
+ - example/ssl.ru
141
142
  - lib/fishwife.rb
142
143
  - lib/fishwife/base.rb
143
- - lib/fishwife/fishwife-1.7.1.jar
144
+ - lib/fishwife/fishwife-1.8.0.jar
144
145
  - lib/fishwife/http_server.rb
145
146
  - lib/fishwife/rack_servlet.rb
146
147
  - lib/rack/handler/fishwife.rb
147
148
  - pom.xml
148
149
  - spec/data/hello.txt
150
+ - spec/data/localhost.keystore
149
151
  - spec/data/reddit-icon.png
150
152
  - spec/fishwife_spec.rb
151
153
  - spec/spec_helper.rb