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