golf 0.0.1 → 0.0.2

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.
Files changed (123) hide show
  1. data/golf.gemspec +1 -1
  2. data/lib/golf/version.rb +1 -1
  3. metadata +1 -121
  4. data/golf-java/README.markdown +0 -41
  5. data/golf-java/THANKS.markdown +0 -14
  6. data/golf-java/build/classes.zip +0 -0
  7. data/golf-java/build/com/thinkminimo/golf/GolfResource$MimeMapping$MimeMappingSingleton.class +0 -0
  8. data/golf-java/build/com/thinkminimo/golf/GolfResource$MimeMapping.class +0 -0
  9. data/golf-java/build/com/thinkminimo/golf/GolfResource.class +0 -0
  10. data/golf-java/build/com/thinkminimo/golf/GolfServlet$1.class +0 -0
  11. data/golf-java/build/com/thinkminimo/golf/GolfServlet$GolfContext.class +0 -0
  12. data/golf-java/build/com/thinkminimo/golf/GolfServlet$GolfParams.class +0 -0
  13. data/golf-java/build/com/thinkminimo/golf/GolfServlet$GolfSession.class +0 -0
  14. data/golf-java/build/com/thinkminimo/golf/GolfServlet$PermanentRedirectException.class +0 -0
  15. data/golf-java/build/com/thinkminimo/golf/GolfServlet$RedirectException.class +0 -0
  16. data/golf-java/build/com/thinkminimo/golf/GolfServlet$StoredJSVM.class +0 -0
  17. data/golf-java/build/com/thinkminimo/golf/GolfServlet.class +0 -0
  18. data/golf-java/build/com/thinkminimo/golf/JsonpTunnel.class +0 -0
  19. data/golf-java/build/com/thinkminimo/golf/Main$1.class +0 -0
  20. data/golf-java/build/com/thinkminimo/golf/Main$RingList.class +0 -0
  21. data/golf-java/build/com/thinkminimo/golf/Main.class +0 -0
  22. data/golf-java/build/com/thinkminimo/golf/ProxyServlet.class +0 -0
  23. data/golf-java/build/com/yahoo/platform/yui/compressor/CssCompressor.class +0 -0
  24. data/golf-java/build/com/yahoo/platform/yui/compressor/JarClassLoader.class +0 -0
  25. data/golf-java/build/com/yahoo/platform/yui/compressor/JavaScriptCompressor.class +0 -0
  26. data/golf-java/build/com/yahoo/platform/yui/compressor/JavaScriptIdentifier.class +0 -0
  27. data/golf-java/build/com/yahoo/platform/yui/compressor/JavaScriptToken.class +0 -0
  28. data/golf-java/build/com/yahoo/platform/yui/compressor/ScriptOrFnScope.class +0 -0
  29. data/golf-java/build/depends.zip +0 -0
  30. data/golf-java/build/golf +0 -2
  31. data/golf-java/build/org/json/JSONArray.class +0 -0
  32. data/golf-java/build/org/json/JSONException.class +0 -0
  33. data/golf-java/build/org/json/JSONObject$1.class +0 -0
  34. data/golf-java/build/org/json/JSONObject$Null.class +0 -0
  35. data/golf-java/build/org/json/JSONObject.class +0 -0
  36. data/golf-java/build/org/json/JSONString.class +0 -0
  37. data/golf-java/build/org/json/JSONStringer.class +0 -0
  38. data/golf-java/build/org/json/JSONTokener.class +0 -0
  39. data/golf-java/build/org/json/JSONWriter.class +0 -0
  40. data/golf-java/build/resources.zip +0 -0
  41. data/golf-java/build.xml +0 -174
  42. data/golf-java/dist/golf.zip +0 -0
  43. data/golf-java/lib/ant-launcher.jar +0 -0
  44. data/golf-java/lib/ant.jar +0 -0
  45. data/golf-java/lib/commons-codec-1.4.jar +0 -0
  46. data/golf-java/lib/commons-collections-3.2.1.jar +0 -0
  47. data/golf-java/lib/commons-fileupload-1.2.1.jar +0 -0
  48. data/golf-java/lib/commons-httpclient-3.1.jar +0 -0
  49. data/golf-java/lib/commons-io-1.4.jar +0 -0
  50. data/golf-java/lib/commons-lang-2.4.jar +0 -0
  51. data/golf-java/lib/commons-logging-1.1.1.jar +0 -0
  52. data/golf-java/lib/cssparser-0.9.5.jar +0 -0
  53. data/golf-java/lib/getopt-0.1-dev.jar +0 -0
  54. data/golf-java/lib/htmlunit-2.6.jar +0 -0
  55. data/golf-java/lib/htmlunit-core-js-2.6.jar +0 -0
  56. data/golf-java/lib/java-xmlbuilder-1.jar +0 -0
  57. data/golf-java/lib/jets3t-0.7.0.jar +0 -0
  58. data/golf-java/lib/jetty-6.1.15.jar +0 -0
  59. data/golf-java/lib/jetty-util-6.1.15.jar +0 -0
  60. data/golf-java/lib/log4j-1.2.15.jar +0 -0
  61. data/golf-java/lib/nekohtml-1.9.13.jar +0 -0
  62. data/golf-java/lib/sac-1.3.jar +0 -0
  63. data/golf-java/lib/serializer-2.7.1.jar +0 -0
  64. data/golf-java/lib/servlet-api-2.5-20081211.jar +0 -0
  65. data/golf-java/lib/xalan-2.7.1.jar +0 -0
  66. data/golf-java/lib/xercesImpl-2.9.1.jar +0 -0
  67. data/golf-java/lib/xml-apis-1.3.04.jar +0 -0
  68. data/golf-java/resources/app_error.html +0 -60
  69. data/golf-java/resources/error.html +0 -29
  70. data/golf-java/resources/forcebot.txt +0 -0
  71. data/golf-java/resources/forceclient.txt +0 -0
  72. data/golf-java/resources/forceproxy.txt +0 -0
  73. data/golf-java/resources/head.html +0 -0
  74. data/golf-java/resources/jquery.address.js +0 -439
  75. data/golf-java/resources/jquery.golf.js +0 -945
  76. data/golf-java/resources/jquery.js +0 -4376
  77. data/golf-java/resources/jsdetect.html +0 -23
  78. data/golf-java/resources/loading.gif +0 -0
  79. data/golf-java/resources/new.html +0 -45
  80. data/golf-java/resources/new.static.html +0 -45
  81. data/golf-java/resources/noscript.forceclient.html +0 -11
  82. data/golf-java/resources/noscript.html +0 -18
  83. data/golf-java/resources/noscript.static.html +0 -15
  84. data/golf-java/resources/project.xml +0 -21
  85. data/golf-java/resources/proxy_project.xml +0 -11
  86. data/golf-java/resources/proxy_web.xml +0 -40
  87. data/golf-java/resources/static_project.xml +0 -37
  88. data/golf-java/resources/version +0 -1
  89. data/golf-java/resources/web.xml +0 -36
  90. data/golf-java/resources/welcome2golf.html +0 -50
  91. data/golf-java/src/com/thinkminimo/golf/GolfResource.java +0 -582
  92. data/golf-java/src/com/thinkminimo/golf/GolfServlet.java +0 -1055
  93. data/golf-java/src/com/thinkminimo/golf/JsonpTunnel.java +0 -86
  94. data/golf-java/src/com/thinkminimo/golf/Main.java +0 -1299
  95. data/golf-java/src/com/thinkminimo/golf/ProxyServlet.java +0 -577
  96. data/golf-java/src/com/yahoo/platform/yui/compressor/CssCompressor.java +0 -188
  97. data/golf-java/src/com/yahoo/platform/yui/compressor/JarClassLoader.java +0 -158
  98. data/golf-java/src/com/yahoo/platform/yui/compressor/JavaScriptCompressor.java +0 -1281
  99. data/golf-java/src/com/yahoo/platform/yui/compressor/JavaScriptIdentifier.java +0 -55
  100. data/golf-java/src/com/yahoo/platform/yui/compressor/JavaScriptToken.java +0 -28
  101. data/golf-java/src/com/yahoo/platform/yui/compressor/ScriptOrFnScope.java +0 -160
  102. data/golf-java/src/org/json/JSONArray.java +0 -934
  103. data/golf-java/src/org/json/JSONException.java +0 -27
  104. data/golf-java/src/org/json/JSONObject.java +0 -1550
  105. data/golf-java/src/org/json/JSONString.java +0 -18
  106. data/golf-java/src/org/json/JSONStringer.java +0 -78
  107. data/golf-java/src/org/json/JSONTokener.java +0 -422
  108. data/golf-java/src/org/json/JSONWriter.java +0 -323
  109. data/golf-java/test/client/golftest/README.markdown +0 -3
  110. data/golf-java/test/client/golftest/components/com/thinkminimo/golf/test/Harness.css +0 -114
  111. data/golf-java/test/client/golftest/components/com/thinkminimo/golf/test/Harness.html +0 -17
  112. data/golf-java/test/client/golftest/components/com/thinkminimo/golf/test/Harness.js +0 -81
  113. data/golf-java/test/client/golftest/components/com/thinkminimo/golf/test/Harness.res/asc.gif +0 -0
  114. data/golf-java/test/client/golftest/components/com/thinkminimo/golf/test/Harness.res/bg.gif +0 -0
  115. data/golf-java/test/client/golftest/components/com/thinkminimo/golf/test/Harness.res/desc.gif +0 -0
  116. data/golf-java/test/client/golftest/components/com/thinkminimo/golf/test/Harness.res/test/test.html +0 -1
  117. data/golf-java/test/client/golftest/controller.js +0 -131
  118. data/golf-java/test/client/golftest/forceclient.txt +0 -0
  119. data/golf-java/test/client/golftest/forceproxy.txt +0 -0
  120. data/golf-java/test/client/golftest/head.html +0 -1
  121. data/golf-java/test/client/golftest/scripts/jquery.tablesort.js +0 -75
  122. data/golf-java/test/client/golftest/styles/style.css +0 -18
  123. data/golf-java/test/client/golftest/test/test.html +0 -1
@@ -1,577 +0,0 @@
1
- package com.thinkminimo.golf;
2
-
3
- /*
4
- * Based on ProxyServlet from Jason Edwards. Thanks, man!
5
- * http://edwardstx.net/wiki/Wiki.jsp?page=HttpProxyServlet
6
- */
7
-
8
-
9
- import java.io.BufferedInputStream;
10
- import java.io.File;
11
- import java.io.IOException;
12
- import java.io.InputStream;
13
- import java.io.OutputStream;
14
- import java.util.ArrayList;
15
- import java.util.Enumeration;
16
- import java.util.List;
17
- import java.util.Map;
18
-
19
- import javax.servlet.ServletConfig;
20
- import javax.servlet.ServletException;
21
- import javax.servlet.http.HttpServlet;
22
- import javax.servlet.http.HttpServletRequest;
23
- import javax.servlet.http.HttpServletResponse;
24
-
25
- import org.apache.commons.fileupload.FileItem;
26
- import org.apache.commons.fileupload.FileUploadException;
27
- import org.apache.commons.fileupload.disk.DiskFileItemFactory;
28
- import org.apache.commons.fileupload.servlet.ServletFileUpload;
29
- import org.apache.commons.httpclient.Header;
30
- import org.apache.commons.httpclient.HttpClient;
31
- import org.apache.commons.httpclient.HttpMethod;
32
- import org.apache.commons.httpclient.NameValuePair;
33
- import org.apache.commons.httpclient.methods.GetMethod;
34
- import org.apache.commons.httpclient.methods.PostMethod;
35
- import org.apache.commons.httpclient.methods.PutMethod;
36
- import org.apache.commons.httpclient.methods.DeleteMethod;
37
- import org.apache.commons.httpclient.methods.InputStreamRequestEntity;
38
- import org.apache.commons.httpclient.methods.multipart.ByteArrayPartSource;
39
- import org.apache.commons.httpclient.methods.multipart.FilePart;
40
- import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity;
41
- import org.apache.commons.httpclient.methods.multipart.Part;
42
- import org.apache.commons.httpclient.methods.multipart.StringPart;
43
-
44
-
45
- public class ProxyServlet extends HttpServlet {
46
- /**
47
- * Serialization UID.
48
- */
49
- private static final long serialVersionUID = 1L;
50
- /**
51
- * Key for redirect location header.
52
- */
53
- private static final String STRING_LOCATION_HEADER = "Location";
54
- /**
55
- * Key for content type header.
56
- */
57
- private static final String STRING_CONTENT_TYPE_HEADER_NAME = "Content-Type";
58
-
59
- /**
60
- * Key for content length header.
61
- */
62
- private static final String STRING_CONTENT_LENGTH_HEADER_NAME = "Content-Length";
63
- /**
64
- * Key for host header
65
- */
66
- private static final String STRING_HOST_HEADER_NAME = "Host";
67
- /**
68
- * The directory to use to temporarily store uploaded files
69
- */
70
- private static final File FILE_UPLOAD_TEMP_DIRECTORY = new File(System.getProperty("java.io.tmpdir"));
71
-
72
- // Proxy host params
73
- /**
74
- * The host to which we are proxying requests
75
- */
76
- private String stringProxyHost;
77
- /**
78
- * The port on the proxy host to wihch we are proxying requests. Default value is 80.
79
- */
80
- private int intProxyPort = 80;
81
- /**
82
- * The (optional) path on the proxy host to wihch we are proxying requests. Default value is "".
83
- */
84
- private String stringProxyPath = "";
85
- /**
86
- * The (optional) extra query string parameters to add onto any request for proxy. Default value is "".
87
- */
88
- private String stringProxyQuery = "";
89
- /**
90
- * The maximum size for uploaded files in bytes. Default value is 5MB.
91
- */
92
- private int intMaxFileUploadSize = 5 * 1024 * 1024;
93
-
94
- /**
95
- * Initialize the <code>ProxyServlet</code>
96
- * @param servletConfig The Servlet configuration passed in by the servlet conatiner
97
- */
98
- public void init(ServletConfig servletConfig) {
99
- // Get the proxy host
100
- String stringProxyHostNew = servletConfig.getInitParameter("proxyHost");
101
- if(stringProxyHostNew == null || stringProxyHostNew.length() == 0) {
102
- throw new IllegalArgumentException("Proxy host not set, please set init-param 'proxyHost' in web.xml");
103
- }
104
- this.setProxyHost(stringProxyHostNew);
105
- // Get the proxy port if specified
106
- String stringProxyPortNew = servletConfig.getInitParameter("proxyPort");
107
- if(stringProxyPortNew != null && stringProxyPortNew.length() > 0) {
108
- this.setProxyPort(Integer.parseInt(stringProxyPortNew));
109
- }
110
- // Get the proxy path if specified
111
- String stringProxyPathNew = servletConfig.getInitParameter("proxyPath");
112
- if(stringProxyPathNew != null && stringProxyPathNew.length() > 0) {
113
- this.setProxyPath(stringProxyPathNew);
114
- }
115
- // Get the extra query params if specified
116
- String stringProxyQueryNew = servletConfig.getInitParameter("proxyQuery");
117
- if(stringProxyQueryNew != null && stringProxyQueryNew.length() > 0) {
118
- this.setProxyQuery(stringProxyQueryNew);
119
- }
120
- // Get the maximum file upload size if specified
121
- String stringMaxFileUploadSize = servletConfig.getInitParameter("maxFileUploadSize");
122
- if(stringMaxFileUploadSize != null && stringMaxFileUploadSize.length() > 0) {
123
- this.setMaxFileUploadSize(Integer.parseInt(stringMaxFileUploadSize));
124
- }
125
- }
126
-
127
- /**
128
- * Performs an HTTP GET request
129
- * @param httpServletRequest The {@link HttpServletRequest} object passed
130
- * in by the servlet engine representing the
131
- * client request to be proxied
132
- * @param httpServletResponse The {@link HttpServletResponse} object by which
133
- * we can send a proxied response to the client
134
- */
135
- public void doGet (HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse)
136
- throws IOException, ServletException {
137
- // Create a GET request
138
- GetMethod getMethodProxyRequest = new GetMethod(this.getProxyURL(httpServletRequest));
139
- // Forward the request headers
140
- setProxyRequestHeaders(httpServletRequest, getMethodProxyRequest);
141
- // Execute the proxy request
142
- this.executeProxyRequest(getMethodProxyRequest, httpServletRequest, httpServletResponse);
143
- }
144
-
145
- /**
146
- * Performs an HTTP DELETE request
147
- * @param httpServletRequest The {@link HttpServletRequest} object passed
148
- * in by the servlet engine representing the
149
- * client request to be proxied
150
- * @param httpServletResponse The {@link HttpServletResponse} object by which
151
- * we can send a proxied response to the client
152
- */
153
- public void doDelete (HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse)
154
- throws IOException, ServletException {
155
- // Create a DELETE request
156
- DeleteMethod delMethodProxyRequest = new DeleteMethod(this.getProxyURL(httpServletRequest));
157
- // Forward the request headers
158
- setProxyRequestHeaders(httpServletRequest, delMethodProxyRequest);
159
- // Execute the proxy request
160
- this.executeProxyRequest(delMethodProxyRequest, httpServletRequest, httpServletResponse);
161
- }
162
-
163
- /**
164
- * Performs an HTTP PUT request
165
- * @param httpServletRequest The {@link HttpServletRequest} object passed
166
- * in by the servlet engine representing the
167
- * client request to be proxied
168
- * @param httpServletResponse The {@link HttpServletResponse} object by which
169
- * we can send a proxied response to the client
170
- */
171
- public void doPut(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse)
172
- throws IOException, ServletException {
173
- // Create a standard PUT request
174
- PutMethod putMethodProxyRequest = new PutMethod(this.getProxyURL(httpServletRequest));
175
- // Forward the request headers
176
- setProxyRequestHeaders(httpServletRequest, putMethodProxyRequest);
177
- // Check if this is a mulitpart (file upload) PUT
178
- if(ServletFileUpload.isMultipartContent(httpServletRequest)) {
179
- this.handleMultipartPut(putMethodProxyRequest, httpServletRequest);
180
- } else {
181
- this.handleStandardPut(putMethodProxyRequest, httpServletRequest);
182
- }
183
- // Execute the proxy request
184
- this.executeProxyRequest(putMethodProxyRequest, httpServletRequest, httpServletResponse);
185
- }
186
-
187
- /**
188
- * Sets up the given {@link PutMethod} to send the same multipart PUT
189
- * data as was sent in the given {@link HttpServletRequest}
190
- * @param putMethodProxyRequest The {@link PutMethod} that we are
191
- * configuring to send a multipart PUT request
192
- * @param httpServletRequest The {@link HttpServletRequest} that contains
193
- * the mutlipart PUT data to be sent via the {@link PutMethod}
194
- */
195
- @SuppressWarnings("unchecked")
196
- private void handleMultipartPut(PutMethod putMethodProxyRequest, HttpServletRequest httpServletRequest)
197
- throws ServletException {
198
- // Create a factory for disk-based file items
199
- DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
200
- // Set factory constraints
201
- diskFileItemFactory.setSizeThreshold(this.getMaxFileUploadSize());
202
- diskFileItemFactory.setRepository(FILE_UPLOAD_TEMP_DIRECTORY);
203
- // Create a new file upload handler
204
- ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
205
- // Parse the request
206
- try {
207
- // Get the multipart items as a list
208
- List<FileItem> listFileItems = (List<FileItem>) servletFileUpload.parseRequest(httpServletRequest);
209
- // Create a list to hold all of the parts
210
- List<Part> listParts = new ArrayList<Part>();
211
- // Iterate the multipart items list
212
- for(FileItem fileItemCurrent : listFileItems) {
213
- // If the current item is a form field, then create a string part
214
- if (fileItemCurrent.isFormField()) {
215
- StringPart stringPart = new StringPart(
216
- fileItemCurrent.getFieldName(), // The field name
217
- fileItemCurrent.getString() // The field value
218
- );
219
- // Add the part to the list
220
- listParts.add(stringPart);
221
- } else {
222
- // The item is a file upload, so we create a FilePart
223
- FilePart filePart = new FilePart(
224
- fileItemCurrent.getFieldName(), // The field name
225
- new ByteArrayPartSource(
226
- fileItemCurrent.getName(), // The uploaded file name
227
- fileItemCurrent.get() // The uploaded file contents
228
- )
229
- );
230
- // Add the part to the list
231
- listParts.add(filePart);
232
- }
233
- }
234
- MultipartRequestEntity multipartRequestEntity = new MultipartRequestEntity(
235
- listParts.toArray(new Part[] {}),
236
- putMethodProxyRequest.getParams()
237
- );
238
- putMethodProxyRequest.setRequestEntity(multipartRequestEntity);
239
- // The current content-type header (received from the client) IS of
240
- // type "multipart/form-data", but the content-type header also
241
- // contains the chunk boundary string of the chunks. Currently, this
242
- // header is using the boundary of the client request, since we
243
- // blindly copied all headers from the client request to the proxy
244
- // request. However, we are creating a new request with a new chunk
245
- // boundary string, so it is necessary that we re-set the
246
- // content-type string to reflect the new chunk boundary string
247
- putMethodProxyRequest.setRequestHeader(STRING_CONTENT_TYPE_HEADER_NAME, multipartRequestEntity.getContentType());
248
- } catch (FileUploadException fileUploadException) {
249
- throw new ServletException(fileUploadException);
250
- }
251
- }
252
-
253
- /**
254
- * Sets up the given {@link PutMethod} to send the same standard PUT
255
- * data as was sent in the given {@link HttpServletRequest}
256
- * @param putMethodProxyRequest The {@link PutMethod} that we are
257
- * configuring to send a standard PUT request
258
- * @param httpServletRequest The {@link HttpServletRequest} that contains
259
- * the PUT data to be sent via the {@link PutMethod}
260
- */
261
- @SuppressWarnings("unchecked")
262
- private void handleStandardPut(PutMethod putMethodProxyRequest, HttpServletRequest httpServletRequest)
263
- throws IOException {
264
- // Get the client PUT data as a Map
265
- Map<String, String[]> mapPutParameters = (Map<String,String[]>) httpServletRequest.getParameterMap();
266
- // Create a List to hold the NameValuePairs to be passed to the PutMethod
267
- List<NameValuePair> listNameValuePairs = new ArrayList<NameValuePair>();
268
- // Iterate the parameter names
269
- for(String stringParameterName : mapPutParameters.keySet()) {
270
- // Iterate the values for each parameter name
271
- String[] stringArrayParameterValues = mapPutParameters.get(stringParameterName);
272
- for(String stringParamterValue : stringArrayParameterValues) {
273
- // Create a NameValuePair and store in list
274
- NameValuePair nameValuePair = new NameValuePair(stringParameterName, stringParamterValue);
275
- listNameValuePairs.add(nameValuePair);
276
- }
277
- }
278
- // Set the proxy request PUT data
279
- putMethodProxyRequest.setRequestEntity(new InputStreamRequestEntity(httpServletRequest.getInputStream()));
280
- }
281
-
282
- /**
283
- * Performs an HTTP POST request
284
- * @param httpServletRequest The {@link HttpServletRequest} object passed
285
- * in by the servlet engine representing the
286
- * client request to be proxied
287
- * @param httpServletResponse The {@link HttpServletResponse} object by which
288
- * we can send a proxied response to the client
289
- */
290
- public void doPost(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse)
291
- throws IOException, ServletException {
292
- // Create a standard POST request
293
- PostMethod postMethodProxyRequest = new PostMethod(this.getProxyURL(httpServletRequest));
294
- // Forward the request headers
295
- setProxyRequestHeaders(httpServletRequest, postMethodProxyRequest);
296
- // Check if this is a mulitpart (file upload) POST
297
- if(ServletFileUpload.isMultipartContent(httpServletRequest)) {
298
- this.handleMultipartPost(postMethodProxyRequest, httpServletRequest);
299
- } else {
300
- this.handleStandardPost(postMethodProxyRequest, httpServletRequest);
301
- }
302
- // Execute the proxy request
303
- this.executeProxyRequest(postMethodProxyRequest, httpServletRequest, httpServletResponse);
304
- }
305
-
306
- /**
307
- * Sets up the given {@link PostMethod} to send the same multipart POST
308
- * data as was sent in the given {@link HttpServletRequest}
309
- * @param postMethodProxyRequest The {@link PostMethod} that we are
310
- * configuring to send a multipart POST request
311
- * @param httpServletRequest The {@link HttpServletRequest} that contains
312
- * the mutlipart POST data to be sent via the {@link PostMethod}
313
- */
314
- @SuppressWarnings("unchecked")
315
- private void handleMultipartPost(PostMethod postMethodProxyRequest, HttpServletRequest httpServletRequest)
316
- throws ServletException {
317
- // Create a factory for disk-based file items
318
- DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
319
- // Set factory constraints
320
- diskFileItemFactory.setSizeThreshold(this.getMaxFileUploadSize());
321
- diskFileItemFactory.setRepository(FILE_UPLOAD_TEMP_DIRECTORY);
322
- // Create a new file upload handler
323
- ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
324
- // Parse the request
325
- try {
326
- // Get the multipart items as a list
327
- List<FileItem> listFileItems = (List<FileItem>) servletFileUpload.parseRequest(httpServletRequest);
328
- // Create a list to hold all of the parts
329
- List<Part> listParts = new ArrayList<Part>();
330
- // Iterate the multipart items list
331
- for(FileItem fileItemCurrent : listFileItems) {
332
- // If the current item is a form field, then create a string part
333
- if (fileItemCurrent.isFormField()) {
334
- StringPart stringPart = new StringPart(
335
- fileItemCurrent.getFieldName(), // The field name
336
- fileItemCurrent.getString() // The field value
337
- );
338
- // Add the part to the list
339
- listParts.add(stringPart);
340
- } else {
341
- // The item is a file upload, so we create a FilePart
342
- FilePart filePart = new FilePart(
343
- fileItemCurrent.getFieldName(), // The field name
344
- new ByteArrayPartSource(
345
- fileItemCurrent.getName(), // The uploaded file name
346
- fileItemCurrent.get() // The uploaded file contents
347
- )
348
- );
349
- // Add the part to the list
350
- listParts.add(filePart);
351
- }
352
- }
353
- MultipartRequestEntity multipartRequestEntity = new MultipartRequestEntity(
354
- listParts.toArray(new Part[] {}),
355
- postMethodProxyRequest.getParams()
356
- );
357
- postMethodProxyRequest.setRequestEntity(multipartRequestEntity);
358
- // The current content-type header (received from the client) IS of
359
- // type "multipart/form-data", but the content-type header also
360
- // contains the chunk boundary string of the chunks. Currently, this
361
- // header is using the boundary of the client request, since we
362
- // blindly copied all headers from the client request to the proxy
363
- // request. However, we are creating a new request with a new chunk
364
- // boundary string, so it is necessary that we re-set the
365
- // content-type string to reflect the new chunk boundary string
366
- postMethodProxyRequest.setRequestHeader(STRING_CONTENT_TYPE_HEADER_NAME, multipartRequestEntity.getContentType());
367
- } catch (FileUploadException fileUploadException) {
368
- throw new ServletException(fileUploadException);
369
- }
370
- }
371
-
372
- /**
373
- * Sets up the given {@link PostMethod} to send the same standard POST
374
- * data as was sent in the given {@link HttpServletRequest}
375
- * @param postMethodProxyRequest The {@link PostMethod} that we are
376
- * configuring to send a standard POST request
377
- * @param httpServletRequest The {@link HttpServletRequest} that contains
378
- * the POST data to be sent via the {@link PostMethod}
379
- */
380
- @SuppressWarnings("unchecked")
381
- private void handleStandardPost(PostMethod postMethodProxyRequest, HttpServletRequest httpServletRequest) throws IOException {
382
- /*
383
- // Get the client POST data as a Map
384
- Map<String, String[]> mapPostParameters = (Map<String,String[]>) httpServletRequest.getParameterMap();
385
- // Create a List to hold the NameValuePairs to be passed to the PostMethod
386
- List<NameValuePair> listNameValuePairs = new ArrayList<NameValuePair>();
387
- // Iterate the parameter names
388
- for(String stringParameterName : mapPostParameters.keySet()) {
389
- // Iterate the values for each parameter name
390
- String[] stringArrayParameterValues = mapPostParameters.get(stringParameterName);
391
- for(String stringParamterValue : stringArrayParameterValues) {
392
- // Create a NameValuePair and store in list
393
- NameValuePair nameValuePair = new NameValuePair(stringParameterName, stringParamterValue);
394
- listNameValuePairs.add(nameValuePair);
395
- }
396
- }
397
- // Set the proxy request POST data
398
- postMethodProxyRequest.setRequestBody(listNameValuePairs.toArray(new NameValuePair[] { }));
399
- */
400
- postMethodProxyRequest.setRequestEntity(new InputStreamRequestEntity(httpServletRequest.getInputStream()));
401
- }
402
-
403
- /**
404
- * Executes the {@link HttpMethod} passed in and sends the proxy response
405
- * back to the client via the given {@link HttpServletResponse}
406
- * @param httpMethodProxyRequest An object representing the proxy request to be made
407
- * @param httpServletResponse An object by which we can send the proxied
408
- * response back to the client
409
- * @throws IOException Can be thrown by the {@link HttpClient}.executeMethod
410
- * @throws ServletException Can be thrown to indicate that another error has occurred
411
- */
412
- private void executeProxyRequest(
413
- HttpMethod httpMethodProxyRequest,
414
- HttpServletRequest httpServletRequest,
415
- HttpServletResponse httpServletResponse)
416
- throws IOException, ServletException {
417
- // Create a default HttpClient
418
- HttpClient httpClient = new HttpClient();
419
- httpMethodProxyRequest.setFollowRedirects(false);
420
- // Execute the request
421
- int intProxyResponseCode = httpClient.executeMethod(httpMethodProxyRequest);
422
-
423
- // Check if the proxy response is a redirect
424
- // The following code is adapted from org.tigris.noodle.filters.CheckForRedirect
425
- // Hooray for open source software
426
- if(intProxyResponseCode >= HttpServletResponse.SC_MULTIPLE_CHOICES /* 300 */
427
- && intProxyResponseCode < HttpServletResponse.SC_NOT_MODIFIED /* 304 */) {
428
- String stringStatusCode = Integer.toString(intProxyResponseCode);
429
- String stringLocation = httpMethodProxyRequest.getResponseHeader(STRING_LOCATION_HEADER).getValue();
430
- if(stringLocation == null) {
431
- throw new ServletException("Recieved status code: " + stringStatusCode
432
- + " but no " + STRING_LOCATION_HEADER + " header was found in the response");
433
- }
434
- // Modify the redirect to go to this proxy servlet rather that the proxied host
435
- String stringMyHostName = httpServletRequest.getServerName();
436
- if(httpServletRequest.getServerPort() != 80) {
437
- stringMyHostName += ":" + httpServletRequest.getServerPort();
438
- }
439
- stringMyHostName += httpServletRequest.getContextPath();
440
- httpServletResponse.sendRedirect(stringLocation.replace(getProxyHostAndPort() + this.getProxyPath(), stringMyHostName));
441
- return;
442
- } else if(intProxyResponseCode == HttpServletResponse.SC_NOT_MODIFIED) {
443
- // 304 needs special handling. See:
444
- // http://www.ics.uci.edu/pub/ietf/http/rfc1945.html#Code304
445
- // We get a 304 whenever passed an 'If-Modified-Since'
446
- // header and the data on disk has not changed; server
447
- // responds w/ a 304 saying I'm not going to send the
448
- // body because the file has not changed.
449
- httpServletResponse.setIntHeader(STRING_CONTENT_LENGTH_HEADER_NAME, 0);
450
- httpServletResponse.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
451
- return;
452
- }
453
-
454
- // Pass the response code back to the client
455
- httpServletResponse.setStatus(intProxyResponseCode);
456
-
457
- // Pass response headers back to the client
458
- Header[] headerArrayResponse = httpMethodProxyRequest.getResponseHeaders();
459
- for(Header header : headerArrayResponse) {
460
- httpServletResponse.setHeader(header.getName(), header.getValue());
461
- }
462
-
463
- // Send the content to the client
464
- InputStream inputStreamProxyResponse = httpMethodProxyRequest.getResponseBodyAsStream();
465
- BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStreamProxyResponse);
466
- OutputStream outputStreamClientResponse = httpServletResponse.getOutputStream();
467
- int intNextByte;
468
- while ( ( intNextByte = bufferedInputStream.read() ) != -1 ) {
469
- outputStreamClientResponse.write(intNextByte);
470
- }
471
- }
472
-
473
- public String getServletInfo() {
474
- return "Jason's Proxy Servlet";
475
- }
476
-
477
- /**
478
- * Retreives all of the headers from the servlet request and sets them on
479
- * the proxy request
480
- *
481
- * @param httpServletRequest The request object representing the client's
482
- * request to the servlet engine
483
- * @param httpMethodProxyRequest The request that we are about to send to
484
- * the proxy host
485
- */
486
- @SuppressWarnings("unchecked")
487
- private void setProxyRequestHeaders(HttpServletRequest httpServletRequest, HttpMethod httpMethodProxyRequest) {
488
- // Get an Enumeration of all of the header names sent by the client
489
- Enumeration enumerationOfHeaderNames = httpServletRequest.getHeaderNames();
490
- while(enumerationOfHeaderNames.hasMoreElements()) {
491
- String stringHeaderName = (String) enumerationOfHeaderNames.nextElement();
492
- if(stringHeaderName.equalsIgnoreCase(STRING_CONTENT_LENGTH_HEADER_NAME))
493
- continue;
494
- // As per the Java Servlet API 2.5 documentation:
495
- // Some headers, such as Accept-Language can be sent by clients
496
- // as several headers each with a different value rather than
497
- // sending the header as a comma separated list.
498
- // Thus, we get an Enumeration of the header values sent by the client
499
- Enumeration enumerationOfHeaderValues = httpServletRequest.getHeaders(stringHeaderName);
500
- while(enumerationOfHeaderValues.hasMoreElements()) {
501
- String stringHeaderValue = (String) enumerationOfHeaderValues.nextElement();
502
- // In case the proxy host is running multiple virtual servers,
503
- // rewrite the Host header to ensure that we get content from
504
- // the correct virtual server
505
- if(stringHeaderName.equalsIgnoreCase(STRING_HOST_HEADER_NAME)){
506
- stringHeaderValue = getProxyHostAndPort();
507
- }
508
- Header header = new Header(stringHeaderName, stringHeaderValue);
509
- // Set the same header on the proxy request
510
- httpMethodProxyRequest.setRequestHeader(header);
511
- }
512
- }
513
- }
514
-
515
- // Accessors
516
- private String getProxyURL(HttpServletRequest httpServletRequest) {
517
- // Set the protocol to HTTP
518
- String stringProxyURL = "http://" + this.getProxyHostAndPort();
519
- // Check if we are proxying to a path other that the document root
520
- if(!this.getProxyPath().equalsIgnoreCase("")){
521
- stringProxyURL += this.getProxyPath();
522
- }
523
- // Handle the path given to the servlet
524
- stringProxyURL += httpServletRequest.getRequestURI()
525
- .substring(httpServletRequest.getContextPath().length());
526
- System.err.println("PROXY: '"+stringProxyURL+"'");
527
- // Handle the query string
528
- String query1 = (httpServletRequest.getQueryString() == null ? "" : httpServletRequest.getQueryString());
529
- String query2 = this.getProxyQuery();
530
- if (query1.length() > 0 && query2.length() > 0)
531
- stringProxyURL += "?" + query1 + "&" + query2;
532
- else if (query1.length() > 0)
533
- stringProxyURL += "?" + query1;
534
- else if (query2.length() > 0)
535
- stringProxyURL += "?" + query2;
536
- return stringProxyURL;
537
- }
538
-
539
- private String getProxyHostAndPort() {
540
- if(this.getProxyPort() == 80) {
541
- return this.getProxyHost();
542
- } else {
543
- return this.getProxyHost() + ":" + this.getProxyPort();
544
- }
545
- }
546
-
547
- private String getProxyHost() {
548
- return this.stringProxyHost;
549
- }
550
- private void setProxyHost(String stringProxyHostNew) {
551
- this.stringProxyHost = stringProxyHostNew;
552
- }
553
- private int getProxyPort() {
554
- return this.intProxyPort;
555
- }
556
- private void setProxyPort(int intProxyPortNew) {
557
- this.intProxyPort = intProxyPortNew;
558
- }
559
- private String getProxyPath() {
560
- return this.stringProxyPath;
561
- }
562
- private void setProxyPath(String stringProxyPathNew) {
563
- this.stringProxyPath = stringProxyPathNew;
564
- }
565
- private String getProxyQuery() {
566
- return this.stringProxyQuery;
567
- }
568
- private void setProxyQuery(String stringProxyQueryNew) {
569
- this.stringProxyQuery = stringProxyQueryNew;
570
- }
571
- private int getMaxFileUploadSize() {
572
- return this.intMaxFileUploadSize;
573
- }
574
- private void setMaxFileUploadSize(int intMaxFileUploadSizeNew) {
575
- this.intMaxFileUploadSize = intMaxFileUploadSizeNew;
576
- }
577
- }