Author: johnh
Date: Wed Aug 18 17:28:57 2010
New Revision: 986806

URL: http://svn.apache.org/viewvc?rev=986806&view=rev
Log:
Small changes that Anupama made in this patch:
http://codereview.appspot.com/1855044/show which got reverted in this cl:
http://codereview.appspot.com/1696056/show.

Re-written patch (by me), after recent commit caused original patch at 
(http://codereview.appspot.com/1962045/) to not apply cleanly.

Original patch provided by Gagan Singh and Anupama Dutta.


Modified:
    
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ProxyHandler.java
    
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/ProxyHandlerTest.java

Modified: 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ProxyHandler.java
URL: 
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ProxyHandler.java?rev=986806&r1=986805&r2=986806&view=diff
==============================================================================
--- 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ProxyHandler.java
 (original)
+++ 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ProxyHandler.java
 Wed Aug 18 17:28:57 2010
@@ -20,9 +20,9 @@ package org.apache.shindig.gadgets.servl
 
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
-
-import org.apache.commons.io.IOUtils;
+import com.google.inject.name.Named;
 import org.apache.commons.lang.StringUtils;
+import org.apache.commons.io.IOUtils;
 import org.apache.shindig.common.uri.Uri;
 import org.apache.shindig.gadgets.GadgetException;
 import org.apache.shindig.gadgets.http.HttpRequest;
@@ -50,12 +50,16 @@ public class ProxyHandler {
 
   private final RequestPipeline requestPipeline;
   private final ResponseRewriterRegistry contentRewriterRegistry;
+  protected final boolean remapInternalServerError;
 
   @Inject
   public ProxyHandler(RequestPipeline requestPipeline,
-                      ResponseRewriterRegistry contentRewriterRegistry) {
+                      ResponseRewriterRegistry contentRewriterRegistry,
+                      @Named("shindig.proxy.remapInternalServerError")
+                      Boolean remapInternalServerError) {
     this.requestPipeline = requestPipeline;
     this.contentRewriterRegistry = contentRewriterRegistry;
+    this.remapInternalServerError = remapInternalServerError;
   }
 
   /**
@@ -102,6 +106,7 @@ public class ProxyHandler {
     }
 
     HttpResponseBuilder response = new HttpResponseBuilder(results);
+    response.clearAllHeaders();
 
     try {
       ServletUtil.setCachingHeaders(response,
@@ -110,7 +115,7 @@ public class ProxyHandler {
       return ServletUtil.errorResponse(gex);
     }
 
-    UriUtils.copyResponseHeadersAndStatusCode(results, response, true, true,
+    UriUtils.copyResponseHeadersAndStatusCode(results, response, 
remapInternalServerError, true,
         DisallowedHeaders.CACHING_DIRECTIVES,  // Proxy sets its own caching 
headers.
         DisallowedHeaders.CLIENT_STATE_DIRECTIVES,  // Overridden or 
irrelevant to proxy.
         DisallowedHeaders.OUTPUT_TRANSFER_DIRECTIVES
@@ -120,7 +125,7 @@ public class ProxyHandler {
     // in order to prevent those from overwriting the correct values.
     setResponseContentHeaders(response, results);
 
-    response.setHeader("Content-Type", getContentType(rcr, response));
+    UriUtils.maybeRewriteContentType(rcr, response);
 
     // TODO: replace this with streaming APIs when ready
     ByteArrayOutputStream baos = new ByteArrayOutputStream();
@@ -129,24 +134,6 @@ public class ProxyHandler {
     return response.create();
   }
 
-  private String getContentType(HttpRequest rcr, HttpResponseBuilder results) {
-    String contentType = results.getHeader("Content-Type");
-    if (!StringUtils.isEmpty(rcr.getRewriteMimeType())) {
-      String requiredType = rcr.getRewriteMimeType();
-      // Use a 'Vary' style check on the response
-      if (requiredType.endsWith("/*") &&
-          !StringUtils.isEmpty(contentType)) {
-        requiredType = requiredType.substring(0, requiredType.length() - 2);
-        if (!contentType.toLowerCase().startsWith(requiredType.toLowerCase())) 
{
-          contentType = requiredType;
-        }
-      } else {
-        contentType = requiredType;
-      }
-    }
-    return contentType;
-  }
-
   private void setResponseContentHeaders(HttpResponseBuilder response, 
HttpResponse results) {
     // We're skipping the content disposition header for flash due to an issue 
with Flash player 10
     // This does make some sites a higher value phishing target, but this can 
be mitigated by

Modified: 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/ProxyHandlerTest.java
URL: 
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/ProxyHandlerTest.java?rev=986806&r1=986805&r2=986806&view=diff
==============================================================================
--- 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/ProxyHandlerTest.java
 (original)
+++ 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/ProxyHandlerTest.java
 Wed Aug 18 17:28:57 2010
@@ -61,7 +61,7 @@ public class ProxyHandlerTest extends Ea
   private ProxyUriManager.ProxyUri request;
   
   private final ProxyHandler proxyHandler
-      = new ProxyHandler(pipeline, rewriterRegistry);
+      = new ProxyHandler(pipeline, rewriterRegistry, true);
   
   private void expectGetAndReturnData(String url, byte[] data) throws 
Exception {
     HttpRequest req = new HttpRequest(Uri.parse(url));
@@ -108,6 +108,35 @@ public class ProxyHandlerTest extends Ea
   }
 
   @Test
+  public void testInvalidHeaderDropped() throws Exception {
+    String url = "http://example.org/mypage.html";;
+    String domain = "example.org";
+
+    setupProxyRequestMock(domain, url, true, -1, null, null);
+
+    HttpRequest req = new HttpRequest(Uri.parse(url))
+        .setIgnoreCache(true);
+    String contentType = "text/html; charset=UTF-8";
+    HttpResponse resp = new HttpResponseBuilder()
+        .setResponseString("Hello")
+        .addHeader("Content-Type", contentType)
+        .addHeader("Content-Length", "200")  // Disallowed header.
+        .addHeader(":", "someDummyValue") // Invalid header name.
+        .create();
+
+    expect(pipeline.execute(req)).andReturn(resp);
+
+    replay();
+
+    HttpResponse recorder = proxyHandler.fetch(request);
+
+    verify();
+    assertNull(recorder.getHeader(":"));
+    assertNull(recorder.getHeader("Content-Length"));
+    assertEquals(recorder.getHeader("Content-Type"), contentType);
+  }
+
+  @Test
   public void testLockedDomainEmbed() throws Exception {
     setupNoArgsProxyRequestMock("www.example.com", URL_ONE);
     expectGetAndReturnData(URL_ONE, DATA_ONE.getBytes());
@@ -269,7 +298,7 @@ public class ProxyHandlerTest extends Ea
     ResponseRewriterRegistry rewriterRegistry =
         new DefaultResponseRewriterRegistry(
             Arrays.<ResponseRewriter>asList(rewriter), null);
-    ProxyHandler proxyHandler = new ProxyHandler(pipeline, rewriterRegistry);
+    ProxyHandler proxyHandler = new ProxyHandler(pipeline, rewriterRegistry, 
true);
 
     request.setReturnOriginalContentOnError(true);
     HttpResponse recorder = proxyHandler.fetch(request);
@@ -306,7 +335,7 @@ public class ProxyHandlerTest extends Ea
     ResponseRewriterRegistry rewriterRegistry =
         new DefaultResponseRewriterRegistry(
             Arrays.<ResponseRewriter>asList(rewriter), null);
-    ProxyHandler proxyHandler = new ProxyHandler(pipeline, rewriterRegistry);
+    ProxyHandler proxyHandler = new ProxyHandler(pipeline, rewriterRegistry, 
true);
 
     boolean exceptionCaught = false;
     try {


Reply via email to