rjack-jetty 6.1.22.1-java
Sign up to get free protection for your applications and to get access to all the features.
- data/History.rdoc +42 -0
- data/Manifest.static +18 -0
- data/Manifest.txt +24 -0
- data/README.rdoc +117 -0
- data/Rakefile +72 -0
- data/assembly.xml +19 -0
- data/bin/rjack-jetty-service +79 -0
- data/lib/rjack-jetty/base.rb +26 -0
- data/lib/rjack-jetty/jetty-6.1.22.jar +0 -0
- data/lib/rjack-jetty/jetty-rewrite-handler-6.1.22.jar +0 -0
- data/lib/rjack-jetty/jetty-util-6.1.22.jar +0 -0
- data/lib/rjack-jetty/rewrite.rb +2 -0
- data/lib/rjack-jetty/rjack-jetty-1.0.jar +0 -0
- data/lib/rjack-jetty/servlet-api-2.5-20081211.jar +0 -0
- data/lib/rjack-jetty/test-servlets.rb +36 -0
- data/lib/rjack-jetty.rb +272 -0
- data/pom.xml +67 -0
- data/src/main/java/rjack/testservlets/PerfTestServlet.java +153 -0
- data/src/main/java/rjack/testservlets/SnoopServlet.java +97 -0
- data/test/test.txt +1 -0
- data/test/test_jetty.rb +160 -0
- data/webapps/test/WEB-INF/web.xml +28 -0
- data/webapps/test/index.html +11 -0
- data/webapps/test.war +0 -0
- metadata +113 -0
data/lib/rjack-jetty.rb
ADDED
@@ -0,0 +1,272 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (C) 2008-2009 David Kellum
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License"); you
|
5
|
+
# may not use this file except in compliance with the License. You
|
6
|
+
# may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
13
|
+
# implied. See the License for the specific language governing
|
14
|
+
# permissions and limitations under the License.
|
15
|
+
#++
|
16
|
+
|
17
|
+
require 'rjack-jetty/base'
|
18
|
+
|
19
|
+
module RJack
|
20
|
+
|
21
|
+
# {Jetty Web Server}[http://www.mortbay.org/jetty/] module including
|
22
|
+
# a ServerFactory
|
23
|
+
module Jetty
|
24
|
+
|
25
|
+
def self.require_jar( name )
|
26
|
+
require File.join( JETTY_DIR, "#{name}-#{ JETTY_VERSION }.jar" )
|
27
|
+
end
|
28
|
+
|
29
|
+
require_jar 'jetty'
|
30
|
+
require_jar 'jetty-util'
|
31
|
+
|
32
|
+
require File.join( JETTY_DIR,
|
33
|
+
"servlet-api-#{ SERVLET_API_VERSION }-#{ SERVLET_API_DATE }.jar" )
|
34
|
+
|
35
|
+
import 'org.mortbay.jetty.Connector'
|
36
|
+
import 'org.mortbay.jetty.Handler'
|
37
|
+
import 'org.mortbay.jetty.NCSARequestLog'
|
38
|
+
import 'org.mortbay.jetty.Server'
|
39
|
+
import 'org.mortbay.jetty.handler.ContextHandler'
|
40
|
+
import 'org.mortbay.jetty.handler.ContextHandlerCollection'
|
41
|
+
import 'org.mortbay.jetty.handler.DefaultHandler'
|
42
|
+
import 'org.mortbay.jetty.handler.HandlerCollection'
|
43
|
+
import 'org.mortbay.jetty.handler.RequestLogHandler'
|
44
|
+
import 'org.mortbay.jetty.handler.ResourceHandler'
|
45
|
+
import 'org.mortbay.jetty.nio.SelectChannelConnector'
|
46
|
+
import 'org.mortbay.jetty.servlet.Context'
|
47
|
+
import 'org.mortbay.jetty.servlet.ServletHolder'
|
48
|
+
import 'org.mortbay.jetty.webapp.WebAppContext'
|
49
|
+
import 'org.mortbay.thread.QueuedThreadPool'
|
50
|
+
|
51
|
+
# A factory for creating complete org.morbay.jetty.Server
|
52
|
+
# instances. Provides a general purpose facade for setup including
|
53
|
+
# the Server, a ThreadPool, a Connector, and various Handlers. It
|
54
|
+
# is non-exhaustive (not every Jetty facility is provided) but is
|
55
|
+
# designed to be easily extended.
|
56
|
+
#
|
57
|
+
# == Example
|
58
|
+
#
|
59
|
+
# factory = Jetty::ServerFactory.new
|
60
|
+
# factory.max_threads = 20
|
61
|
+
# factory.port = 8080
|
62
|
+
#
|
63
|
+
# # Set static resource context mapping URI to directory
|
64
|
+
# factory.static_contexts[ '/html' ] = '/var/www/html'
|
65
|
+
#
|
66
|
+
# # Implement custom handler and register it.
|
67
|
+
# import 'org.mortbay.jetty.handler.AbstractHandler'
|
68
|
+
# class RedirectHandler < AbstractHandler
|
69
|
+
#
|
70
|
+
# def initialize( redirects )
|
71
|
+
# super()
|
72
|
+
# @redirects = redirects
|
73
|
+
# end
|
74
|
+
#
|
75
|
+
# def handle( target, request, response, dispatch )
|
76
|
+
# goto = @redirects[ target ]
|
77
|
+
# unless goto.nil?
|
78
|
+
# response.send_redirect( goto )
|
79
|
+
# request.handled = true
|
80
|
+
# end
|
81
|
+
# end
|
82
|
+
# end
|
83
|
+
#
|
84
|
+
# def factory.create_pre_handlers
|
85
|
+
# [ RedirectHandler.new( '/' => '/html/' ) ] + super
|
86
|
+
# end
|
87
|
+
#
|
88
|
+
# # Create a webapp context (war file or webapp expanded)
|
89
|
+
# factory.webapp_contexts[ '/test' ] = Jetty::TestServlets::WEBAPP_TEST_WAR
|
90
|
+
#
|
91
|
+
# # Create a context for a custom HelloServlet
|
92
|
+
# import 'javax.servlet.http.HttpServlet'
|
93
|
+
# class HelloServlet < HttpServlet
|
94
|
+
# def doGet( request, response )
|
95
|
+
# response.content_type = "text/plain"
|
96
|
+
# response.writer.write( 'Hello World!' )
|
97
|
+
# end
|
98
|
+
# end
|
99
|
+
#
|
100
|
+
# factory.set_context_servlets( '/hello', { '/*' => HelloServlet.new } )
|
101
|
+
#
|
102
|
+
# # Create, start, and join (wait for shutdown)
|
103
|
+
# server = factory.create
|
104
|
+
# server.start
|
105
|
+
# server.join
|
106
|
+
#
|
107
|
+
class ServerFactory
|
108
|
+
attr_accessor( :port, :max_idle_time_ms,
|
109
|
+
:max_threads, :low_threads, :min_threads,
|
110
|
+
:static_contexts, :static_welcome_files,
|
111
|
+
:webapp_contexts,
|
112
|
+
:servlet_contexts,
|
113
|
+
:stop_at_shutdown,
|
114
|
+
:request_log_file )
|
115
|
+
|
116
|
+
def initialize
|
117
|
+
@port = 0 # Use any available port
|
118
|
+
@max_threads = 20
|
119
|
+
@low_threads = 0 # No low thread threshold
|
120
|
+
@min_threads = nil # Compute from max_threads
|
121
|
+
@max_idle_time_ms = 10000
|
122
|
+
@static_contexts = {}
|
123
|
+
@static_welcome_files = [ 'index.html' ]
|
124
|
+
@webapp_contexts = {}
|
125
|
+
@request_log_file = nil
|
126
|
+
@servlet_contexts = {}
|
127
|
+
@stop_at_shutdown = true
|
128
|
+
end
|
129
|
+
|
130
|
+
# Returns a new org.morbay.jetty.Server that is ready to
|
131
|
+
# be started.
|
132
|
+
def create
|
133
|
+
server = Server.new
|
134
|
+
|
135
|
+
server.thread_pool = create_pool
|
136
|
+
|
137
|
+
server.connectors = create_connectors.to_java( Connector )
|
138
|
+
|
139
|
+
hcol = HandlerCollection.new
|
140
|
+
hcol.handlers = create_handlers.compact.to_java( Handler )
|
141
|
+
server.handler = hcol
|
142
|
+
|
143
|
+
server.stop_at_shutdown = @stop_at_shutdown
|
144
|
+
|
145
|
+
server
|
146
|
+
end
|
147
|
+
|
148
|
+
# Return a org.mortbay.thread.ThreadPool implementation.
|
149
|
+
#
|
150
|
+
# This implementation creates a QueuedThreadPool with min_threads
|
151
|
+
# (default max_threads / 4), any low_threads, and max_threads
|
152
|
+
# (default 20).
|
153
|
+
def create_pool
|
154
|
+
pool = QueuedThreadPool.new
|
155
|
+
pool.min_threads = [ @min_threads || ( @max_threads / 4 ), 1 ].max
|
156
|
+
pool.low_threads = @low_threads
|
157
|
+
pool.max_threads = [ @max_threads, 2 ].max
|
158
|
+
pool
|
159
|
+
end
|
160
|
+
|
161
|
+
# Return array of org.mortbay.jetty.Connector instances.
|
162
|
+
#
|
163
|
+
# This implementation returns a single SelectChannelConnector
|
164
|
+
# listening to the given port or an auto-selected avaiable
|
165
|
+
# port. Connections are retained for max_idle_time_ms.
|
166
|
+
def create_connectors
|
167
|
+
connector = SelectChannelConnector.new
|
168
|
+
connector.port = @port
|
169
|
+
connector.max_idle_time = @max_idle_time_ms
|
170
|
+
[ connector ]
|
171
|
+
end
|
172
|
+
|
173
|
+
# Returns an Array of org.mortbay.jetty.Handler instances.
|
174
|
+
#
|
175
|
+
# This implementation concatenates create_pre_handlers and
|
176
|
+
# create_post_handlers.
|
177
|
+
def create_handlers
|
178
|
+
( create_pre_handlers + create_post_handlers )
|
179
|
+
end
|
180
|
+
|
181
|
+
# Returns an Array of "pre" org.mortbay.jetty.Handler instances.
|
182
|
+
#
|
183
|
+
# This implementation returns an array containing a single
|
184
|
+
# ContextHandlerCollection which itself contains the context
|
185
|
+
# handlers set by create_context_handlers, or an empty array
|
186
|
+
# if no context handlers were set.
|
187
|
+
def create_pre_handlers
|
188
|
+
ctx_handlers = ContextHandlerCollection.new
|
189
|
+
create_context_handlers( ctx_handlers )
|
190
|
+
h = ctx_handlers.handlers
|
191
|
+
if( h.nil? || h.length == 0 )
|
192
|
+
[ ]
|
193
|
+
else
|
194
|
+
[ ctx_handlers ]
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
# Returns an Array of "post" org.mortbay.jetty.Handler instances.
|
199
|
+
#
|
200
|
+
# This implementation returns a DefaultHandler instance, and any
|
201
|
+
# handler returned by create_request_log_handler.
|
202
|
+
def create_post_handlers
|
203
|
+
[ DefaultHandler.new, # Handle errors, etc.
|
204
|
+
create_request_log_handler ]
|
205
|
+
end
|
206
|
+
|
207
|
+
# Create context handlers on the provided ContextHandlerCollection
|
208
|
+
#
|
209
|
+
# This implementation calls create_static_contexts,
|
210
|
+
# create_webapp_contexts, and create_servlet_context.
|
211
|
+
def create_context_handlers( context_handler_collection )
|
212
|
+
create_static_contexts( context_handler_collection )
|
213
|
+
create_webapp_contexts( context_handler_collection )
|
214
|
+
create_servlet_contexts( context_handler_collection )
|
215
|
+
end
|
216
|
+
|
217
|
+
# Create context handlers for static resources from static_contexts
|
218
|
+
def create_static_contexts( context_handler_collection )
|
219
|
+
@static_contexts.each do |ctx, rpath|
|
220
|
+
ch = ContextHandler.new( context_handler_collection, ctx )
|
221
|
+
ch.resource_base = rpath
|
222
|
+
ch.handler = ResourceHandler.new
|
223
|
+
ch.handler.welcome_files =
|
224
|
+
@static_welcome_files.to_java( java.lang.String )
|
225
|
+
end
|
226
|
+
end
|
227
|
+
|
228
|
+
# Set a context of servlets given context_path, a servlets hash
|
229
|
+
# (mapping path to Servlet), and options.
|
230
|
+
def set_context_servlets( context_path, servlets,
|
231
|
+
options = Context::NO_SESSIONS )
|
232
|
+
@servlet_contexts[ context_path ] = [ servlets, options ]
|
233
|
+
end
|
234
|
+
|
235
|
+
# Create context handlers from servlet_contexts.
|
236
|
+
def create_servlet_contexts( context_handler_collection )
|
237
|
+
@servlet_contexts.each do |ctx, s_o|
|
238
|
+
servlets, options = s_o
|
239
|
+
context = Context.new( context_handler_collection, ctx, options )
|
240
|
+
servlets.each do |path, servlet|
|
241
|
+
context.add_servlet( ServletHolder.new( servlet ), path )
|
242
|
+
end
|
243
|
+
end
|
244
|
+
end
|
245
|
+
|
246
|
+
# Create webapp context handlers from webapp_contexts.
|
247
|
+
def create_webapp_contexts( context_handler_collection )
|
248
|
+
@webapp_contexts.each do |ctx, webapp_path|
|
249
|
+
WebAppContext.new( context_handler_collection, webapp_path, ctx )
|
250
|
+
end
|
251
|
+
end
|
252
|
+
|
253
|
+
# Create RequestLogHandler from any set request_log_file
|
254
|
+
def create_request_log_handler
|
255
|
+
if @request_log_file
|
256
|
+
log_handler = RequestLogHandler.new
|
257
|
+
log_handler.request_log = create_request_log( @request_log_file )
|
258
|
+
log_handler
|
259
|
+
end
|
260
|
+
end
|
261
|
+
|
262
|
+
# Create a NCSARequestLog to append to log_file
|
263
|
+
def create_request_log( log_file )
|
264
|
+
log = NCSARequestLog.new( log_file )
|
265
|
+
log.log_time_zone = java.util.TimeZone::getDefault.getID
|
266
|
+
log.append = true;
|
267
|
+
log
|
268
|
+
end
|
269
|
+
|
270
|
+
end
|
271
|
+
end
|
272
|
+
end
|
data/pom.xml
ADDED
@@ -0,0 +1,67 @@
|
|
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>rjack</groupId>
|
5
|
+
<artifactId>rjack-jetty</artifactId>
|
6
|
+
<packaging>jar</packaging>
|
7
|
+
<version>1.0</version>
|
8
|
+
<name>Gravitext Test Servlets</name> -->
|
9
|
+
|
10
|
+
<dependencies>
|
11
|
+
|
12
|
+
<dependency>
|
13
|
+
<groupId>org.mortbay.jetty</groupId>
|
14
|
+
<artifactId>jetty</artifactId>
|
15
|
+
<version>6.1.22</version>
|
16
|
+
</dependency>
|
17
|
+
|
18
|
+
<dependency>
|
19
|
+
<groupId>org.mortbay.jetty</groupId>
|
20
|
+
<artifactId>jetty-util</artifactId>
|
21
|
+
<version>6.1.22</version>
|
22
|
+
</dependency>
|
23
|
+
|
24
|
+
<dependency>
|
25
|
+
<groupId>org.mortbay.jetty</groupId>
|
26
|
+
<artifactId>jetty-rewrite-handler</artifactId>
|
27
|
+
<version>6.1.22</version>
|
28
|
+
</dependency>
|
29
|
+
|
30
|
+
</dependencies>
|
31
|
+
|
32
|
+
<build>
|
33
|
+
<plugins>
|
34
|
+
<plugin>
|
35
|
+
<artifactId>maven-assembly-plugin</artifactId>
|
36
|
+
<configuration>
|
37
|
+
<descriptors>
|
38
|
+
<descriptor>assembly.xml</descriptor>
|
39
|
+
</descriptors>
|
40
|
+
<tarLongFileMode>gnu</tarLongFileMode>
|
41
|
+
</configuration>
|
42
|
+
<executions>
|
43
|
+
<execution>
|
44
|
+
<id>assembly</id>
|
45
|
+
<phase>package</phase>
|
46
|
+
<goals>
|
47
|
+
<goal>attached</goal>
|
48
|
+
</goals>
|
49
|
+
</execution>
|
50
|
+
</executions>
|
51
|
+
</plugin>
|
52
|
+
<plugin>
|
53
|
+
<artifactId>maven-compiler-plugin</artifactId>
|
54
|
+
<configuration>
|
55
|
+
<source>1.5</source>
|
56
|
+
<target>1.5</target>
|
57
|
+
<optimize>true</optimize>
|
58
|
+
<debug>true</debug>
|
59
|
+
<encoding>UTF-8</encoding>
|
60
|
+
<showDeprecation>true</showDeprecation>
|
61
|
+
<showWarnings>true</showWarnings>
|
62
|
+
</configuration>
|
63
|
+
</plugin>
|
64
|
+
</plugins>
|
65
|
+
</build>
|
66
|
+
|
67
|
+
</project>
|
@@ -0,0 +1,153 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (C) 2008 David Kellum
|
3
|
+
*
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
* you may not use this file except in compliance with the License.
|
6
|
+
* You may obtain a copy of the License at
|
7
|
+
*
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
*
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
* See the License for the specific language governing permissions and
|
14
|
+
* limitations under the License.
|
15
|
+
*/
|
16
|
+
|
17
|
+
package rjack.testservlets;
|
18
|
+
|
19
|
+
import java.io.IOException;
|
20
|
+
import java.io.PrintWriter;
|
21
|
+
import java.math.BigInteger;
|
22
|
+
import java.util.Random;
|
23
|
+
|
24
|
+
import javax.servlet.ServletException;
|
25
|
+
import javax.servlet.http.HttpServlet;
|
26
|
+
import javax.servlet.http.HttpServletRequest;
|
27
|
+
import javax.servlet.http.HttpServletResponse;
|
28
|
+
|
29
|
+
/**
|
30
|
+
* Servlet for perform and chunked output testing.
|
31
|
+
* @author David Kellum
|
32
|
+
*/
|
33
|
+
public class PerfTestServlet extends HttpServlet
|
34
|
+
{
|
35
|
+
|
36
|
+
@Override
|
37
|
+
protected void doGet( HttpServletRequest req, HttpServletResponse resp )
|
38
|
+
throws ServletException, IOException
|
39
|
+
{
|
40
|
+
int delayConst = getParam( req, "delay", 0 );
|
41
|
+
int delayRandom = getParam( req, "rdelay", 0 );
|
42
|
+
|
43
|
+
int burnConst = getParam( req, "burn", 0 );
|
44
|
+
int burnRandom = getParam( req, "rburn", 0 );
|
45
|
+
|
46
|
+
int size = getParam( req, "size", 0 );
|
47
|
+
int sizeRandom = getParam( req, "rsize", 0 );
|
48
|
+
|
49
|
+
int count = getParam( req, "count", 0 );
|
50
|
+
count += random( getParam( req, "rcount", 0 ) );
|
51
|
+
|
52
|
+
resp.setContentType("text/html; charset=ISO-8859-1" );
|
53
|
+
|
54
|
+
PrintWriter out = resp.getWriter();
|
55
|
+
|
56
|
+
out.println( "<html>" );
|
57
|
+
out.println( "<head>" );
|
58
|
+
out.println( "<title>Wait/Flush Test</title>" );
|
59
|
+
out.println( "</head>" );
|
60
|
+
out.println( "<body>" );
|
61
|
+
|
62
|
+
out.println( "<h2>Usage</h2>" );
|
63
|
+
out.println( "<table><tr><th>GET Parameter</th><th>Meaning</th></tr>" );
|
64
|
+
out.println( "<tr><td>size</td><td>Chunk constant size ~characters.</td></tr>" );
|
65
|
+
out.println( "<tr><td>rsize</td><td>Chunk random [0,n) size ~characters.</td></tr>" );
|
66
|
+
out.println( "<tr><td>delay</td><td>Constant chunk delay in ms</td></tr>" );
|
67
|
+
out.println( "<tr><td>rdelay</td><td>Random [0,n) chunk delay in ms</td></tr>" );
|
68
|
+
out.println( "<tr><td>burn</td><td>Constant chunk CPU burn time in ms</td></tr>" );
|
69
|
+
out.println( "<tr><td>rburn</td><td>Random [0,n) chunk burn time in ms</td></tr>" );
|
70
|
+
out.println( "</table>" );
|
71
|
+
|
72
|
+
out.println( "<h2>Output</h2>" );
|
73
|
+
out.flush();
|
74
|
+
|
75
|
+
out.println( "<p>Writing " + count + " (delayed) chunks...</p>" );
|
76
|
+
out.flush();
|
77
|
+
|
78
|
+
try {
|
79
|
+
for( int b = 0; b < count; ++b ) {
|
80
|
+
|
81
|
+
long delay = delayConst + random( delayRandom );
|
82
|
+
if( delay > 0 ) Thread.sleep( delay );
|
83
|
+
|
84
|
+
int burn = burnConst + random ( burnRandom );
|
85
|
+
if( burn > 0 ) {
|
86
|
+
delay += burnTime( burn );
|
87
|
+
}
|
88
|
+
|
89
|
+
out.println( "<p>(Delayed " + delay + " ms) " );
|
90
|
+
|
91
|
+
int f = size + random( sizeRandom );
|
92
|
+
while( f > 0 ) {
|
93
|
+
out.print( FILLER );
|
94
|
+
f -= FILLER.length();
|
95
|
+
}
|
96
|
+
|
97
|
+
out.println( "</p>" );
|
98
|
+
out.flush();
|
99
|
+
}
|
100
|
+
}
|
101
|
+
catch( InterruptedException x ) {}
|
102
|
+
out.println( "</body>" );
|
103
|
+
out.println( "</html>" );
|
104
|
+
out.flush();
|
105
|
+
}
|
106
|
+
|
107
|
+
private long burnTime( int burn_ms )
|
108
|
+
{
|
109
|
+
long prime = 2;
|
110
|
+
long begin = System.currentTimeMillis();
|
111
|
+
long endTime = begin + burn_ms;
|
112
|
+
long last = 0;
|
113
|
+
do {
|
114
|
+
prime = BigInteger.probablePrime( 64, new Random() ).longValue();
|
115
|
+
last = System.currentTimeMillis();
|
116
|
+
} while( last < endTime );
|
117
|
+
|
118
|
+
if( prime == 2 ) {
|
119
|
+
throw new IllegalStateException( "Not a prime!" );
|
120
|
+
}
|
121
|
+
return last - begin;
|
122
|
+
}
|
123
|
+
|
124
|
+
private int getParam( HttpServletRequest req, String name, int defVal )
|
125
|
+
{
|
126
|
+
int value = defVal;
|
127
|
+
String strVal = req.getParameter( name );
|
128
|
+
if( strVal != null ) {
|
129
|
+
value = Integer.parseInt( strVal );
|
130
|
+
}
|
131
|
+
|
132
|
+
return value;
|
133
|
+
}
|
134
|
+
|
135
|
+
private int random( int range )
|
136
|
+
{
|
137
|
+
Random _random = new Random();
|
138
|
+
if( range > 0 ) return _random.nextInt( range );
|
139
|
+
return 0;
|
140
|
+
}
|
141
|
+
|
142
|
+
private static final String FILLER =
|
143
|
+
"Lorem ipsum dolor sit amet, consectetur adipisicing elit, " +
|
144
|
+
"sed do eiusmod tempor incididunt ut labore et dolore magna " +
|
145
|
+
"aliqua. Ut enim ad minim veniam, quis nostrud exercitation " +
|
146
|
+
"ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis " +
|
147
|
+
"aute irure dolor in reprehenderit in voluptate velit esse cillum " +
|
148
|
+
"dolore eu fugiat nulla pariatur. Excepteur sint occaecat " +
|
149
|
+
"cupidatat non proident, sunt in culpa qui officia deserunt " +
|
150
|
+
"mollit anim id est laborum. ";
|
151
|
+
|
152
|
+
private static final long serialVersionUID = 1L;
|
153
|
+
}
|
@@ -0,0 +1,97 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (C) 2008 David Kellum
|
3
|
+
*
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
* you may not use this file except in compliance with the License.
|
6
|
+
* You may obtain a copy of the License at
|
7
|
+
*
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
*
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
* See the License for the specific language governing permissions and
|
14
|
+
* limitations under the License.
|
15
|
+
*/
|
16
|
+
|
17
|
+
package rjack.testservlets;
|
18
|
+
|
19
|
+
import java.io.IOException;
|
20
|
+
import java.io.PrintWriter;
|
21
|
+
import java.util.Enumeration;
|
22
|
+
|
23
|
+
import javax.servlet.ServletException;
|
24
|
+
import javax.servlet.http.Cookie;
|
25
|
+
import javax.servlet.http.HttpServlet;
|
26
|
+
import javax.servlet.http.HttpServletRequest;
|
27
|
+
import javax.servlet.http.HttpServletResponse;
|
28
|
+
|
29
|
+
public class SnoopServlet extends HttpServlet
|
30
|
+
{
|
31
|
+
|
32
|
+
@Override
|
33
|
+
protected void doGet( HttpServletRequest request,
|
34
|
+
HttpServletResponse response )
|
35
|
+
throws ServletException, IOException
|
36
|
+
{
|
37
|
+
response.setContentType("text/html; charset=UTF-8" );
|
38
|
+
|
39
|
+
PrintWriter out = response.getWriter();
|
40
|
+
|
41
|
+
out.println( "<html>" );
|
42
|
+
out.println( "<head>" );
|
43
|
+
out.println( "<title>Wait/Flush Test</title>" );
|
44
|
+
out.println( "</head>" );
|
45
|
+
out.println( "<body>" );
|
46
|
+
|
47
|
+
writeTableHeader( out, "Request Properties", "Property" );
|
48
|
+
writeRow( out, "Request URI", request.getRequestURI() );
|
49
|
+
writeRow( out, "HTTP Method", request.getMethod() );
|
50
|
+
writeRow( out, "Path Info", request.getPathInfo() );
|
51
|
+
writeRow( out, "Path Trans", request.getPathTranslated() );
|
52
|
+
writeRow( out, "Query String", request.getQueryString() );
|
53
|
+
writeRow( out, "Context Path", request.getContextPath() );
|
54
|
+
writeRow( out, "Servlet Path", request.getServletPath() );
|
55
|
+
writeRow( out, "Is Secure", String.valueOf( request.isSecure() ) );
|
56
|
+
writeRow( out, "Auth Type", request.getAuthType() );
|
57
|
+
writeRow( out, "Remote User", request.getRemoteUser() );
|
58
|
+
out.println( "</table>" );
|
59
|
+
|
60
|
+
writeTableHeader( out, "Request Headers", "Header" );
|
61
|
+
Enumeration<?> hNames = request.getHeaderNames();
|
62
|
+
while( hNames.hasMoreElements() ) {
|
63
|
+
String hname = hNames.nextElement().toString();
|
64
|
+
String hvalue = request.getHeader( hname );
|
65
|
+
writeRow( out, hname, hvalue );
|
66
|
+
}
|
67
|
+
out.println( "</table>" );
|
68
|
+
|
69
|
+
Cookie[] cookies = request.getCookies();
|
70
|
+
if (cookies != null) {
|
71
|
+
writeTableHeader( out, "Cookies", "Cookie" );
|
72
|
+
for( Cookie cookie : cookies ) {
|
73
|
+
writeRow( out, cookie.getName(), cookie.getValue() );
|
74
|
+
}
|
75
|
+
out.println( "</table>" );
|
76
|
+
}
|
77
|
+
|
78
|
+
out.println( "</body>" );
|
79
|
+
out.println( "</html>" );
|
80
|
+
out.close();
|
81
|
+
}
|
82
|
+
|
83
|
+
private void writeTableHeader( PrintWriter out,
|
84
|
+
String heading, String name )
|
85
|
+
{
|
86
|
+
out.println( "<h2>" + heading + "</h2>" );
|
87
|
+
out.println( "<table><tr><th>" + name + "</th><th>Value</th></tr>" );
|
88
|
+
}
|
89
|
+
|
90
|
+
private void writeRow( PrintWriter out, String name, String value )
|
91
|
+
{
|
92
|
+
out.println( String.format( "<tr><td>%s</td><td>%s</td></tr>",
|
93
|
+
name, value ) );
|
94
|
+
}
|
95
|
+
|
96
|
+
private static final long serialVersionUID = 1L;
|
97
|
+
}
|
data/test/test.txt
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
test text over http
|