Author: zhoresh
Date: Tue Jul 27 20:05:09 2010
New Revision: 979836

URL: http://svn.apache.org/viewvc?rev=979836&view=rev
Log:
Handle bad header for proxy request.
http://codereview.appspot.com/1867046/show

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=979836&r1=979835&r2=979836&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
 Tue Jul 27 20:05:09 2010
@@ -52,7 +52,7 @@ public class ProxyHandler extends ProxyB
   // TODO: parameterize these.
   static final Integer LONG_LIVED_REFRESH = (365 * 24 * 60 * 60);  // 1 year
   static final Integer DEFAULT_REFRESH = (60 * 60);                // 1 hour
-  
+
   private final RequestPipeline requestPipeline;
   private final LockedDomainService lockedDomainService;
   private final ResponseRewriterRegistry contentRewriterRegistry;
@@ -99,11 +99,11 @@ public class ProxyHandler extends ProxyB
       throw new GadgetException(GadgetException.Code.INVALID_PARAMETER, msg,
           HttpResponse.SC_BAD_REQUEST);
     }
-    
+
     // Parse request uri:
     ProxyUriManager.ProxyUri proxyUri = proxyUriManager.process(
         new UriBuilder(request).toUri());
-    
+
     try {
       HttpUtil.setCachingHeaders(response,
           proxyUri.translateStatusRefresh(LONG_LIVED_REFRESH, 
DEFAULT_REFRESH), false);
@@ -115,10 +115,10 @@ public class ProxyHandler extends ProxyB
     HttpRequest rcr = buildHttpRequest(request, proxyUri, 
proxyUri.getResource());
     if (rcr == null) {
       throw new GadgetException(GadgetException.Code.INVALID_PARAMETER,
-          "No url paramater in request", HttpResponse.SC_BAD_REQUEST);      
+          "No url paramater in request", HttpResponse.SC_BAD_REQUEST);
     }
     HttpResponse results = requestPipeline.execute(rcr);
-    
+
     if (results.isError()) {
       // Error: try the fallback. Particularly useful for proxied images.
       Uri fallbackUri = proxyUri.getFallbackUri();
@@ -127,7 +127,7 @@ public class ProxyHandler extends ProxyB
         results = requestPipeline.execute(fallbackRcr);
       }
     }
-    
+
     if (contentRewriterRegistry != null) {
       try {
         results = contentRewriterRegistry.rewriteHttpResponse(rcr, results);
@@ -140,7 +140,12 @@ public class ProxyHandler extends ProxyB
     for (Map.Entry<String, String> entry : results.getHeaders().entries()) {
       String name = entry.getKey();
       if (!DISALLOWED_RESPONSE_HEADERS.contains(name.toLowerCase())) {
+        try {
           response.addHeader(name, entry.getValue());
+        } catch (IllegalArgumentException e) {
+          // Skip illegal header
+          LOG.info("Skipping illegal header:  " + name + ":" + 
entry.getValue());
+        }
       }
     }
 

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=979836&r1=979835&r2=979836&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
 Tue Jul 27 20:05:09 2010
@@ -25,6 +25,7 @@ import static org.easymock.EasyMock.isA;
 import com.google.common.base.Objects;
 import com.google.common.collect.Maps;
 
+import org.apache.shindig.common.servlet.HttpServletResponseRecorder;
 import org.apache.shindig.common.uri.Uri;
 import org.apache.shindig.common.util.Utf8UrlCoder;
 import org.apache.shindig.gadgets.GadgetException;
@@ -63,7 +64,7 @@ public class ProxyHandlerTest extends Se
     HttpResponse resp = new 
HttpResponseBuilder().addAllHeaders(headers).create();
     expect(pipeline.execute(req)).andReturn(resp);
   }
-  
+
   private void setupProxyRequestBase(String host) {
     expect(request.getServerName()).andReturn(host).anyTimes();
     expect(request.getScheme()).andReturn("http").anyTimes();
@@ -170,9 +171,12 @@ public class ProxyHandlerTest extends Se
     String domain = "example.org";
     String contentType = "text/evil; charset=UTF-8";
     String magicGarbage = "fadfdfdfd";
+    final String badHeader = "Caching Server";
+    String badValue ="server";
     Map<String, List<String>> headers = Maps.newHashMap();
     headers.put("Content-Type", Arrays.asList(contentType));
     headers.put("X-Magic-Garbage", Arrays.asList(magicGarbage));
+    headers.put(badHeader, Arrays.asList(badValue));
 
     
expect(lockedDomainService.isSafeForOpenProxy(domain)).andReturn(true).atLeastOnce();
     setupProxyRequestMock(domain, url);
@@ -180,13 +184,23 @@ public class ProxyHandlerTest extends Se
 
     replay();
 
-    proxyHandler.fetch(request, recorder);
+    HttpServletResponseRecorder newRecorder = new 
HttpServletResponseRecorder(response) {
+      @Override
+      public void addHeader(String name, String value) {
+        if (name.equals(badHeader)) {
+          throw new IllegalArgumentException("Bad header");
+        }
+        super.addHeader(name, value);
+      }
+    };
+    proxyHandler.fetch(request, newRecorder);
 
-    assertEquals(contentType, recorder.getHeader("Content-Type"));
-    assertEquals(magicGarbage, recorder.getHeader("X-Magic-Garbage"));
+    assertEquals(contentType, newRecorder.getHeader("Content-Type"));
+    assertEquals(magicGarbage, newRecorder.getHeader("X-Magic-Garbage"));
+    assertNull("Blocked header", newRecorder.getHeader(badHeader));
     assertTrue(rewriter.responseWasRewritten());
   }
-  
+
   @Test
   public void testGetFallback() throws Exception {
     String url = "http://example.org/file.evil";;


Reply via email to