fishwife 1.7.1-java → 1.8.0-java

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 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