rjack-jetty 6.1.22.1-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.
- 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
|