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);
+    }
   }
 }


Reply via email to