Author: lryan
Date: Tue Jun  2 06:22:12 2009
New Revision: 780949

URL: http://svn.apache.org/viewvc?rev=780949&view=rev
Log:
Make proxy enforce a mime wildcard match on the requested mime type. Image link 
rewriters are passing the expected mime as "image/*" which is causing the 
output to have that literal mime type. This breaks IE8 which is no longer 
content sniffing.

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

Modified: 
incubator/shindig/trunk/java/common/src/test/java/org/apache/shindig/common/servlet/HttpServletResponseRecorder.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/common/src/test/java/org/apache/shindig/common/servlet/HttpServletResponseRecorder.java?rev=780949&r1=780948&r2=780949&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/common/src/test/java/org/apache/shindig/common/servlet/HttpServletResponseRecorder.java
 (original)
+++ 
incubator/shindig/trunk/java/common/src/test/java/org/apache/shindig/common/servlet/HttpServletResponseRecorder.java
 Tue Jun  2 06:22:12 2009
@@ -42,7 +42,6 @@
   private PrintWriter writer;
   private final Map<String, String> headers = 
Maps.newTreeMap(String.CASE_INSENSITIVE_ORDER);
   private int httpStatusCode = 200;
-  private String contentType;
   private String encoding = Charset.defaultCharset().name();
 
   public HttpServletResponseRecorder(HttpServletResponse response) {
@@ -146,12 +145,12 @@
 
   @Override
   public void setContentType(String type) {
-    this.contentType = type;
+    headers.put("Content-Type", type);
   }
 
   @Override
   public String getContentType() {
-    return contentType;
+    return headers.get("Content-Type");
   }
 
   @Override

Modified: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ProxyHandler.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ProxyHandler.java?rev=780949&r1=780948&r2=780949&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ProxyHandler.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ProxyHandler.java
 Tue Jun  2 06:22:12 2009
@@ -27,6 +27,7 @@
 
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang.math.NumberUtils;
+import org.apache.commons.lang.StringUtils;
 import org.apache.shindig.common.uri.Uri;
 import org.apache.shindig.gadgets.GadgetException;
 import org.apache.shindig.gadgets.LockedDomainService;
@@ -152,8 +153,19 @@
       }
     }
 
-    if (rcr.getRewriteMimeType() != null) {
-      response.setContentType(rcr.getRewriteMimeType());
+    if (!StringUtils.isEmpty(rcr.getRewriteMimeType())) {
+      String requiredType = rcr.getRewriteMimeType();
+      String responseType = results.getHeader("Content-Type");
+      // Use a 'Vary' style check on the response
+      if (requiredType.endsWith("/*") &&
+          !StringUtils.isEmpty(responseType)) {
+        requiredType = requiredType.substring(0, requiredType.length() - 2);
+        if 
(!responseType.toLowerCase().startsWith(requiredType.toLowerCase())) {
+          response.setContentType(requiredType);
+        }
+      } else {
+        response.setContentType(requiredType);
+      }
     }
 
     if (results.getHttpStatusCode() != HttpResponse.SC_OK) {

Modified: 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/ProxyHandlerTest.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/ProxyHandlerTest.java?rev=780949&r1=780948&r2=780949&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/ProxyHandlerTest.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/ProxyHandlerTest.java
 Tue Jun  2 06:22:12 2009
@@ -164,4 +164,47 @@
 
     verify();
   }
+
+  private void expectMime(String expectedMime, String contentMime, String 
outputMime)
+      throws Exception {
+    String url = "http://example.org/file.img?"; + 
ProxyHandler.REWRITE_MIME_TYPE_PARAM +
+        "=" + expectedMime;
+    String domain = "example.org";
+
+    
expect(lockedDomainService.isSafeForOpenProxy(domain)).andReturn(true).atLeastOnce();
+    setupProxyRequestMock(domain, url);
+    expect(request.getParameter(ProxyHandler.REWRITE_MIME_TYPE_PARAM))
+        .andReturn(expectedMime).anyTimes();
+
+    HttpRequest req = new HttpRequest(Uri.parse(url))
+        .setRewriteMimeType(expectedMime);
+
+    HttpResponse resp = new HttpResponseBuilder()
+      .setResponseString("Hello")
+      .addHeader("Content-Type", contentMime)
+      .create();
+
+    expect(pipeline.execute(req)).andReturn(resp);
+    replay();
+    proxyHandler.fetch(request, recorder);
+    verify();
+    assertEquals(recorder.getContentType(), outputMime);
+    reset();
+  }
+
+  public void testMimeMatchPass() throws Exception {
+    expectMime("text/css", "text/css", "text/css");
+  }
+
+  public void testMimeMatchPassWithAdditionalAttributes() throws Exception {
+    expectMime("text/css", "text/css; charset=UTF-8", "text/css");
+  }
+
+  public void testMimeMatchOverrideNonMatch() throws Exception {
+    expectMime("text/css", "image/png; charset=UTF-8", "text/css");
+  }
+
+  public void testMimeMatchVarySupport() throws Exception {
+    expectMime("image/*", "image/gif", "image/gif");
+  }
 }


Reply via email to