Author: beaton
Date: Sat Jun 7 15:46:52 2008
New Revision: 664409
URL: http://svn.apache.org/viewvc?rev=664409&view=rev
Log:
Fix part of SHINDIG-331. The core.io/io.js javascript is mildly hokey
(check out what happens if params.REFRESH_INTERVAL = 0), but
should allow people to specify the method they want.
I'll take a look at io.js in a bit.
Modified:
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/BasicHttpFetcher.java
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpRequest.java
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpResponse.java
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/AbstractHttpFetcherTest.java
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/EchoServer.java
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/HttpResponseTest.java
Modified:
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/BasicHttpFetcher.java
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/BasicHttpFetcher.java?rev=664409&r1=664408&r2=664409&view=diff
==============================================================================
---
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/BasicHttpFetcher.java
(original)
+++
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/BasicHttpFetcher.java
Sat Jun 7 15:46:52 2008
@@ -23,11 +23,9 @@
import org.apache.commons.io.IOUtils;
import java.io.ByteArrayInputStream;
-import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
-import java.net.URLConnection;
import java.util.List;
import java.util.Map;
import java.util.zip.GZIPInputStream;
@@ -72,32 +70,30 @@
* @return The opened connection
* @throws IOException
*/
- private URLConnection getConnection(HttpRequest request)
+ private HttpURLConnection getConnection(HttpRequest request)
throws IOException {
- URLConnection fetcher;
- fetcher = request.getUri().toURL().openConnection();
+ HttpURLConnection fetcher =
+ (HttpURLConnection)request.getUri().toURL().openConnection();
fetcher.setConnectTimeout(CONNECT_TIMEOUT_MS);
fetcher.setRequestProperty("Accept-Encoding", "gzip, deflate");
- if (fetcher instanceof HttpURLConnection) {
- ((HttpURLConnection)fetcher).setInstanceFollowRedirects(true);
- Map<String, List<String>> reqHeaders = request.getAllHeaders();
- for (Map.Entry<String, List<String>> entry : reqHeaders.entrySet()) {
- List<String> value = entry.getValue();
- if (value.size() == 1) {
- fetcher.setRequestProperty(entry.getKey(), value.get(0));
- } else {
- StringBuilder headerList = new StringBuilder();
- boolean first = false;
- for (String val : value) {
- if (!first) {
- first = true;
- } else {
- headerList.append(',');
- }
- headerList.append(val);
+ fetcher.setInstanceFollowRedirects(true);
+ Map<String, List<String>> reqHeaders = request.getAllHeaders();
+ for (Map.Entry<String, List<String>> entry : reqHeaders.entrySet()) {
+ List<String> value = entry.getValue();
+ if (value.size() == 1) {
+ fetcher.setRequestProperty(entry.getKey(), value.get(0));
+ } else {
+ StringBuilder headerList = new StringBuilder();
+ boolean first = false;
+ for (String val : value) {
+ if (!first) {
+ first = true;
+ } else {
+ headerList.append(',');
}
- fetcher.setRequestProperty(entry.getKey(), headerList.toString());
+ headerList.append(val);
}
+ fetcher.setRequestProperty(entry.getKey(), headerList.toString());
}
}
fetcher.setDefaultUseCaches(!request.getOptions().ignoreCache);
@@ -109,16 +105,10 @@
* @return A HttpResponse object made by consuming the response of the
* given HttpURLConnection.
*/
- private HttpResponse makeResponse(URLConnection fetcher)
+ private HttpResponse makeResponse(HttpURLConnection fetcher)
throws IOException {
Map<String, List<String>> headers = fetcher.getHeaderFields();
- int responseCode;
- if (fetcher instanceof HttpURLConnection) {
- responseCode = ((HttpURLConnection)fetcher).getResponseCode();
- } else {
- responseCode = HttpResponse.SC_OK;
- }
-
+ int responseCode = fetcher.getResponseCode();
// Find the response stream - the error stream may be valid in cases
// where the input stream is not.
InputStream baseIs = null;
@@ -127,9 +117,9 @@
} catch (IOException e) {
// normal for 401, 403 and 404 responses, for example...
}
- if (baseIs == null && fetcher instanceof HttpURLConnection) {
+ if (baseIs == null) {
// Try for an error input stream
- baseIs = ((HttpURLConnection)fetcher).getErrorStream();
+ baseIs = fetcher.getErrorStream();
}
if (baseIs == null) {
// Fall back to zero length response.
@@ -159,27 +149,25 @@
return response;
}
try {
- URLConnection fetcher = getConnection(request);
- if ("POST".equals(request.getMethod()) &&
- fetcher instanceof HttpURLConnection) {
- ((HttpURLConnection)fetcher).setRequestMethod("POST");
- fetcher.setRequestProperty("Content-Length",
-
String.valueOf(request.getPostBodyLength()));
+ HttpURLConnection fetcher = getConnection(request);
+ fetcher.setRequestMethod(request.getMethod());
+ if (!"GET".equals(request.getMethod())) {
fetcher.setUseCaches(false);
- fetcher.setDoInput(true);
+ }
+ if (request.getPostBodyLength() > 0) {
fetcher.setDoOutput(true);
+ fetcher.setRequestProperty("Content-Length",
+ String.valueOf(request.getPostBodyLength()));
IOUtils.copy(request.getPostBody(), fetcher.getOutputStream());
}
response = makeResponse(fetcher);
return cache.addResponse(request, response);
} catch (IOException e) {
- if (e instanceof FileNotFoundException) {
- return HttpResponse.notFound();
- } else if (e instanceof java.net.SocketTimeoutException ||
- e instanceof java.net.SocketException) {
+ if (e instanceof java.net.SocketTimeoutException ||
+ e instanceof java.net.SocketException) {
return HttpResponse.timeout();
}
return HttpResponse.error();
}
}
-}
+}
\ No newline at end of file
Modified:
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpRequest.java
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpRequest.java?rev=664409&r1=664408&r2=664409&view=diff
==============================================================================
---
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpRequest.java
(original)
+++
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpRequest.java
Sat Jun 7 15:46:52 2008
@@ -28,7 +28,6 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
-import java.util.HashMap;
import java.util.TreeMap;
import java.util.List;
import java.util.Map;
Modified:
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpResponse.java
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpResponse.java?rev=664409&r1=664408&r2=664409&view=diff
==============================================================================
---
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpResponse.java
(original)
+++
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpResponse.java
Sat Jun 7 15:46:52 2008
@@ -30,6 +30,7 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.TreeMap;
import java.util.concurrent.ConcurrentHashMap;
/**
@@ -91,7 +92,8 @@
responseBytes, 0, this.responseBytes, 0, responseBytes.length);
}
- Map<String, List<String>> tmpHeaders = new HashMap<String, List<String>>();
+ Map<String, List<String>> tmpHeaders =
+ new TreeMap<String, List<String>>(String.CASE_INSENSITIVE_ORDER);
if (headers != null) {
for (Map.Entry<String, List<String>> entry : headers.entrySet()) {
if (entry.getKey() != null && entry.getValue() != null) {
Modified:
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/AbstractHttpFetcherTest.java
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/AbstractHttpFetcherTest.java?rev=664409&r1=664408&r2=664409&view=diff
==============================================================================
---
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/AbstractHttpFetcherTest.java
(original)
+++
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/AbstractHttpFetcherTest.java
Sat Jun 7 15:46:52 2008
@@ -4,6 +4,12 @@
import java.net.URI;
import java.net.URLEncoder;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import junitx.framework.ArrayAssert;
import org.apache.shindig.gadgets.http.EchoServer;
import org.junit.AfterClass;
@@ -13,8 +19,6 @@
/**
* Holds test cases that all HttpFetcher implementations should pass. This
* starts up an HTTP server and runs tests against it.
- *
- * TODO simulate fake POST requests, headers, options, etc.
*/
public class AbstractHttpFetcherTest {
private static final int ECHO_PORT = 9003;
@@ -89,4 +93,69 @@
assertEquals(content, response.getResponseAsString());
assertEquals("some auth data", response.getHeader("WWW-Authenticate"));
}
+
+ @Test public void testDelete() throws Exception {
+ HttpRequest request = new HttpRequest("DELETE", new URI(BASE_URL),
+ null, null, null);
+ HttpResponse response = fetcher.fetch(request);
+ assertEquals("DELETE", response.getHeader("x-method"));
+ }
+
+ @Test public void testPost_noBody() throws Exception {
+ HttpRequest request = new HttpRequest("POST", new URI(BASE_URL),
+ null, null, null);
+ HttpResponse response = fetcher.fetch(request);
+ assertEquals("POST", response.getHeader("x-method"));
+ assertEquals("", response.getResponseAsString());
+ }
+
+ @Test public void testPost_withBody() throws Exception {
+ byte[] body = new byte[5000];
+ for (int i=0; i < body.length; ++i) {
+ body[i] = (byte)(i % 255);
+ }
+ Map<String, List<String>> headers = new HashMap<String, List<String>>();
+ headers.put("content-type", Arrays.asList("application/octet-stream"));
+ HttpRequest request = new HttpRequest("POST", new URI(BASE_URL),
+ headers, body, null);
+ HttpResponse response = fetcher.fetch(request);
+ assertEquals("POST", response.getHeader("x-method"));
+ ArrayAssert.assertEquals(body, response.getResponseAsBytes());
+ }
+
+ @Test public void testPut_noBody() throws Exception {
+ HttpRequest request = new HttpRequest("PUT", new URI(BASE_URL),
+ null, null, null);
+ HttpResponse response = fetcher.fetch(request);
+ assertEquals("PUT", response.getHeader("x-method"));
+ assertEquals("", response.getResponseAsString());
+ }
+
+ @Test public void testPut_withBody() throws Exception {
+ byte[] body = new byte[5000];
+ for (int i=0; i < body.length; ++i) {
+ body[i] = (byte)i;
+ }
+ Map<String, List<String>> headers = new HashMap<String, List<String>>();
+ headers.put("content-type", Arrays.asList("application/octet-stream"));
+ HttpRequest request = new HttpRequest("PUT", new URI(BASE_URL),
+ headers, body, null);
+ HttpResponse response = fetcher.fetch(request);
+ assertEquals("PUT", response.getHeader("x-method"));
+ ArrayAssert.assertEquals(body, response.getResponseAsBytes());
+ }
+
+ @Test public void testHugeBody() throws Exception {
+ byte[] body = new byte[1024*1024]; // 1 MB
+ for (int i=0; i < body.length; ++i) {
+ body[i] = (byte)i;
+ }
+ Map<String, List<String>> headers = new HashMap<String, List<String>>();
+ headers.put("content-type", Arrays.asList("application/octet-stream"));
+ HttpRequest request = new HttpRequest("POST", new URI(BASE_URL),
+ headers, body, null);
+ HttpResponse response = fetcher.fetch(request);
+ assertEquals("POST", response.getHeader("x-method"));
+ ArrayAssert.assertEquals(body, response.getResponseAsBytes());
+ }
}
Modified:
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/EchoServer.java
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/EchoServer.java?rev=664409&r1=664408&r2=664409&view=diff
==============================================================================
---
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/EchoServer.java
(original)
+++
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/EchoServer.java
Sat Jun 7 15:46:52 2008
@@ -18,7 +18,11 @@
*/
package org.apache.shindig.gadgets.http;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
@@ -61,13 +65,32 @@
}
}
+ resp.setHeader("X-Method", req.getMethod());
+
String body = req.getParameter(BODY_PARAM);
- if (body == null) {
- body = "";
+ if (body != null) {
+ resp.getWriter().print(body);
+ } else {
+ resp.setHeader("Content-Type", "application/octet-stream");
+
+ // Read the input stream into memory
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ InputStream is = req.getInputStream();
+ byte[] buf = new byte[1024];
+ int len;
+ while ((len = is.read(buf)) > 0) {
+ baos.write(buf, 0, len);
+ }
+
+ // Echo the bytes back to the output stream
+ OutputStream os = resp.getOutputStream();
+ ByteArrayInputStream bais = new ByteArrayInputStream(
+ baos.toByteArray());
+ while ((len = bais.read(buf)) > 0) {
+ os.write(buf, 0, len);
+ }
}
- resp.getWriter().print(body);
- }
-
- };
+ }
+ }
}
Modified:
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/HttpResponseTest.java
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/HttpResponseTest.java?rev=664409&r1=664408&r2=664409&view=diff
==============================================================================
---
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/HttpResponseTest.java
(original)
+++
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/HttpResponseTest.java
Sat Jun 7 15:46:52 2008
@@ -25,6 +25,7 @@
import java.util.Arrays;
import java.util.HashMap;
+import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
@@ -132,6 +133,8 @@
public void testNullHeaderNamesStripped() {
addHeader(null, "dummy");
HttpResponse response = new HttpResponse(200, new byte[0], headers);
- assertFalse("Null header not removed.",
response.getAllHeaders().containsKey(null));
+ for (String key : response.getAllHeaders().keySet()) {
+ assertNotNull("Null header not removed.", key);
+ }
}
}