fishwife 1.2.0-java → 1.3.0-java

Sign up to get free protection for your applications and to get access to all the features.
data/History.rdoc CHANGED
@@ -1,3 +1,10 @@
1
+ === 1.3.0 (2012-2-12)
2
+ * Add OutputUtil JRuby java extension for write_body and
3
+ write_file. This increases single threaded output performance from
4
+ 78Mb/s to 238Mb/s on my dev. host using curl against the included
5
+ example/giant.ru test app.
6
+ * Upgrade to rack ~> 1.4.1
7
+
1
8
  === 1.2.0 (2012-1-29)
2
9
  * Upgrade, widen to rjack-jetty >= 7.5.4, < 7.7 (incl. 7.6.0.0 release)
3
10
  * Fixed, tests passing in 1.9 mode; at least with jruby pre-release
data/Manifest.txt CHANGED
@@ -3,8 +3,10 @@ LICENSE
3
3
  Manifest.txt
4
4
  README.rdoc
5
5
  Rakefile
6
+ pom.xml
6
7
  bin/fishwife
7
8
  example/config.ru
9
+ example/giant.ru
8
10
  lib/fishwife/base.rb
9
11
  lib/fishwife.rb
10
12
  lib/fishwife/http_server.rb
@@ -15,3 +17,4 @@ spec/spec_helper.rb
15
17
  spec/test_app.rb
16
18
  spec/data/hello.txt
17
19
  spec/data/reddit-icon.png
20
+ lib/fishwife/fishwife-1.3.0.jar
data/example/config.ru CHANGED
@@ -7,8 +7,6 @@
7
7
  require 'rjack-logback'
8
8
  RJack::Logback.config_console( :stderr => true, :thread => true )
9
9
 
10
- # FIXME: Currently Need Content-Length set to avoid double chunked
11
- # transfer-encoding with rack 1.3 (not a problem in rack 1.2)!
12
10
  use Rack::ContentLength
13
11
 
14
12
  run lambda { |env| [200, { "Content-Type" => "text/plain" }, ["Hello"]] }
data/example/giant.ru ADDED
@@ -0,0 +1,28 @@
1
+ #\ -s Fishwife -p 9297 -E production
2
+ # -*- ruby -*-
3
+
4
+ require 'rjack-logback'
5
+ RJack::Logback.config_console( :stderr => true, :thread => true )
6
+
7
+ class GiantGenerator
8
+ FILLER = <<-END
9
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do
10
+ eiusmod tempor incididunt ut labore et dolore magna aliqua.
11
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do
12
+ eiusmod tempor incididunt ut labore et dolore magna aliqua.
13
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do
14
+ eiusmod tempor incididunt ut labore et dolore magna aliqua.
15
+ END
16
+
17
+ def each
18
+ loop { yield FILLER[0..rand( FILLER.size)] }
19
+ end
20
+ end
21
+
22
+ class App
23
+ def call( env )
24
+ [ 200, { 'Content-Type' => 'text/plain' }, GiantGenerator.new ]
25
+ end
26
+ end
27
+
28
+ run App.new
data/lib/fishwife.rb CHANGED
@@ -23,6 +23,12 @@ require 'rjack-slf4j'
23
23
  # Load Jetty JARs.
24
24
  require 'rjack-jetty'
25
25
 
26
+ require 'fishwife/base'
27
+
28
+ module Fishwife
29
+ require "#{LIB_DIR}/fishwife-#{VERSION}.jar"
30
+ end
31
+
26
32
  require 'rack'
27
33
  require 'fishwife/rack_servlet'
28
34
  require 'fishwife/http_server'
data/lib/fishwife/base.rb CHANGED
@@ -15,5 +15,6 @@
15
15
  #++
16
16
 
17
17
  module Fishwife
18
- VERSION = '1.2.0'
18
+ VERSION = '1.3.0'
19
+ LIB_DIR = File.dirname( __FILE__ )
19
20
  end
Binary file
@@ -15,6 +15,9 @@
15
15
  # permissions and limitations under the License.
16
16
  #++
17
17
 
18
+ # Magic loader hook -> JRubyService
19
+ require 'fishwife/JRuby'
20
+
18
21
  #
19
22
  # Wraps a Rack application in a Java servlet.
20
23
  #
@@ -214,29 +217,20 @@ module Fishwife
214
217
  end
215
218
  end
216
219
 
217
- # How else would we write output?
218
220
  output = response.getOutputStream
219
221
 
220
- # Turn the body into something nice and Java-y.
221
- if(body.respond_to?(:to_path))
222
- # We've been told to serve a file; use FileInputStream to
223
- # stream the file directly to the servlet, because this is a
224
- # lot faster than doing it with Ruby.
225
- file = java.io.File.new(body.to_path)
226
-
227
- # We set the content-length so we can use Keep-Alive, unless
228
- # this is an async request.
229
- response.setContentLength(file.length) unless content_length
230
-
231
- # Stream the file directly.
232
- buffer = Java::byte[4096].new
233
- input_stream = FileInputStream.new(file)
234
- while((count = input_stream.read(buffer)) != -1)
235
- output.write(buffer, 0, count)
236
- end
237
- input_stream.close
222
+ if body.respond_to?( :to_path )
223
+
224
+ path = body.to_path
225
+
226
+ # Set Content-Length unless this is an async request.
227
+ response.setContentLength( File.size( path ) ) unless content_length
228
+
229
+ # FIXME: Support ranges?
230
+
231
+ OutputUtil.write_file( path, output )
238
232
  else
239
- body.each { |l| output.write(l.to_java_bytes) }
233
+ OutputUtil.write_body( body, output )
240
234
  end
241
235
 
242
236
  # Close the body if we're supposed to.
data/pom.xml ADDED
@@ -0,0 +1,52 @@
1
+ <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
2
+
3
+ <modelVersion>4.0.0</modelVersion>
4
+ <groupId>fishwife</groupId>
5
+ <artifactId>fishwife</artifactId>
6
+ <packaging>jar</packaging>
7
+ <version>1.3.0</version>
8
+ <name>Fishwife Java Extension</name>
9
+
10
+ <properties>
11
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
12
+ </properties>
13
+
14
+ <dependencies>
15
+
16
+ <dependency>
17
+ <groupId>org.jruby.extras</groupId>
18
+ <artifactId>bytelist</artifactId>
19
+ <version>1.0.10</version>
20
+ <optional>true</optional>
21
+ </dependency>
22
+
23
+ <dependency>
24
+ <groupId>org.jruby</groupId>
25
+ <artifactId>jruby-core</artifactId>
26
+ <version>1.6.6</version>
27
+ <optional>true</optional>
28
+ </dependency>
29
+
30
+ </dependencies>
31
+
32
+ <build>
33
+ <plugins>
34
+
35
+ <plugin>
36
+ <artifactId>maven-compiler-plugin</artifactId>
37
+ <version>2.3.2</version>
38
+ <configuration>
39
+ <source>1.6</source>
40
+ <target>1.6</target>
41
+ <optimize>true</optimize>
42
+ <debug>true</debug>
43
+ <encoding>UTF-8</encoding>
44
+ <showDeprecation>true</showDeprecation>
45
+ <showWarnings>true</showWarnings>
46
+ </configuration>
47
+ </plugin>
48
+
49
+ </plugins>
50
+ </build>
51
+
52
+ </project>
@@ -50,6 +50,7 @@ describe Fishwife do
50
50
 
51
51
  after(:all) do
52
52
  @server.stop
53
+ @server.join
53
54
  end
54
55
 
55
56
  it "returns 200 OK" do
@@ -134,8 +135,6 @@ describe Fishwife do
134
135
  response = get("/download")
135
136
  response.code.should == "200"
136
137
  response['Content-Type'].should == 'image/png'
137
- response['Content-Disposition'].should ==
138
- 'attachment; filename=reddit-icon.png'
139
138
  checksum = Digest::MD5.hexdigest(response.body)
140
139
  checksum.should == '8da4b60a9bbe205d4d3699985470627e'
141
140
  end
@@ -161,6 +160,7 @@ describe Fishwife do
161
160
  end
162
161
 
163
162
  it "handles async requests" do
163
+ pending "Causes intermittent 30s pauses, TestApp.push/pull is sketchy"
164
164
  lock = Mutex.new
165
165
  buffer = Array.new
166
166
 
data/spec/spec_helper.rb CHANGED
@@ -31,3 +31,20 @@ require 'rack/lint'
31
31
  require 'fishwife'
32
32
 
33
33
  Thread.abort_on_exception = true
34
+
35
+ # Adjust Rack::Lint to not interfere with File body.to_path
36
+ class Rack::Lint
37
+
38
+ def respond_to?( mth )
39
+ if mth == :to_path
40
+ @body.respond_to?( :to_path )
41
+ else
42
+ super
43
+ end
44
+ end
45
+
46
+ def to_path
47
+ @body.to_path
48
+ end
49
+
50
+ end
data/spec/test_app.rb CHANGED
@@ -104,12 +104,11 @@ class TestApp
104
104
  end
105
105
 
106
106
  def download(request)
107
- file = File.new('spec/data/reddit-icon.png', 'r')
108
- response = Rack::Response.new(file)
109
- response['Content-Type'] = 'image/png'
110
- response['Content-Disposition'] =
111
- 'attachment; filename=reddit-icon.png'
112
- response.finish
107
+ file = File.new( File.dirname( __FILE__ ) + "/data/reddit-icon.png" )
108
+ def file.to_path
109
+ path
110
+ end
111
+ [ 200, { "Content-Type" => "image/png" }, file ]
113
112
  end
114
113
 
115
114
  def upload(request)
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: fishwife
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 1.2.0
5
+ version: 1.3.0
6
6
  platform: java
7
7
  authors:
8
8
  - David Kellum
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2012-01-30 00:00:00 Z
13
+ date: 2012-02-12 00:00:00 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rack
@@ -19,7 +19,7 @@ dependencies:
19
19
  requirements:
20
20
  - - ~>
21
21
  - !ruby/object:Gem::Version
22
- version: 1.3.6
22
+ version: 1.4.1
23
23
  requirement: *id001
24
24
  prerelease: false
25
25
  type: :runtime
@@ -108,8 +108,10 @@ files:
108
108
  - Manifest.txt
109
109
  - README.rdoc
110
110
  - Rakefile
111
+ - pom.xml
111
112
  - bin/fishwife
112
113
  - example/config.ru
114
+ - example/giant.ru
113
115
  - lib/fishwife/base.rb
114
116
  - lib/fishwife.rb
115
117
  - lib/fishwife/http_server.rb
@@ -120,6 +122,7 @@ files:
120
122
  - spec/test_app.rb
121
123
  - spec/data/hello.txt
122
124
  - spec/data/reddit-icon.png
125
+ - lib/fishwife/fishwife-1.3.0.jar
123
126
  homepage: http://github.com/dekellum/fishwife
124
127
  licenses: []
125
128