Author: johnh
Date: Wed Apr 21 03:24:33 2010
New Revision: 936149

URL: http://svn.apache.org/viewvc?rev=936149&view=rev
Log:
When performing requests as a proxy, use the user-agent string provided by the
client, plus a "Shindig" ident to identify requests from Apache Shindig. This is
done for the benefit of user-agent-sniffing applications.

Patch provided by Jacobo Tarrio.


Modified:
    
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetContext.java
    
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/ProxyRenderer.java
    
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/HttpGadgetContext.java
    
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/ProxyRendererTest.java
    
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/HttpGadgetContextTest.java

Modified: 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetContext.java
URL: 
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetContext.java?rev=936149&r1=936148&r2=936149&view=diff
==============================================================================
--- 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetContext.java
 (original)
+++ 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetContext.java
 Wed Apr 21 03:24:33 2010
@@ -132,4 +132,11 @@ public class GadgetContext {
   public SecurityToken getToken() {
     return delegate == null ? null : delegate.getToken();
   }
+  
+  /**
+   * @return The user agent string, or null if not present.
+   */
+  public String getUserAgent() {
+    return delegate == null ? null : delegate.getUserAgent();
+  }
 }

Modified: 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/ProxyRenderer.java
URL: 
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/ProxyRenderer.java?rev=936149&r1=936148&r2=936149&view=diff
==============================================================================
--- 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/ProxyRenderer.java
 (original)
+++ 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/ProxyRenderer.java
 Wed Apr 21 03:24:33 2010
@@ -31,6 +31,7 @@ import org.apache.shindig.gadgets.http.H
 import org.apache.shindig.gadgets.http.RequestPipeline;
 import org.apache.shindig.gadgets.oauth.OAuthArguments;
 import org.apache.shindig.gadgets.preload.PipelineExecutor;
+import org.apache.shindig.gadgets.servlet.HttpGadgetContext;
 import org.apache.shindig.gadgets.spec.PipelinedData;
 import org.apache.shindig.gadgets.spec.View;
 
@@ -45,6 +46,7 @@ import javax.servlet.http.HttpServletRes
  */
 public class ProxyRenderer {
   public static final String PATH_PARAM = "path";
+  public static final String UA_IDENT = "Shindig";
 
   private final RequestPipeline requestPipeline;
   private final HttpCache httpCache;
@@ -97,6 +99,7 @@ public class ProxyRenderer {
         .setSecurityToken(context.getToken())
         .setContainer(context.getContainer())
         .setGadget(gadget.getSpec().getUrl());
+    setUserAgent(request, context);
 
     HttpResponse response = httpCache.getResponse(request);
 
@@ -139,4 +142,27 @@ public class ProxyRenderer {
 
     return request;
   }
+
+  /**
+   * Sets the User-Agent header in the new request to a variant of the original
+   * request's User-Agent, plus a small ident string for the gadget server.
+   */
+  private void setUserAgent(HttpRequest request, GadgetContext context) {
+    String userAgent = context.getUserAgent();
+    if (userAgent != null) {
+      String myIdent = getUAIdent();
+      if (myIdent != null) {
+        userAgent = userAgent + " " + myIdent;
+      }
+      request.setHeader("User-Agent", userAgent);
+    }
+  }
+  
+  /**
+   * Returns the program name which will be added at the end of the User-Agent
+   * string, to identify the gadget server.
+   */
+  protected String getUAIdent() {
+    return UA_IDENT;
+  }
 }

Modified: 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/HttpGadgetContext.java
URL: 
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/HttpGadgetContext.java?rev=936149&r1=936148&r2=936149&view=diff
==============================================================================
--- 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/HttpGadgetContext.java
 (original)
+++ 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/HttpGadgetContext.java
 Wed Apr 21 03:24:33 2010
@@ -166,6 +166,15 @@ public class HttpGadgetContext extends G
     return view;
   }
 
+  @Override
+  public String getUserAgent() {
+    String userAgent = request.getHeader("User-Agent");
+    if (userAgent == null) {
+      return super.getUserAgent();
+    }
+    return userAgent;
+  }
+  
   /**
    * @param req
    * @return The container, if set, or null.

Modified: 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/ProxyRendererTest.java
URL: 
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/ProxyRendererTest.java?rev=936149&r1=936148&r2=936149&view=diff
==============================================================================
--- 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/ProxyRendererTest.java
 (original)
+++ 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/ProxyRendererTest.java
 Wed Apr 21 03:24:33 2010
@@ -60,11 +60,17 @@ public class ProxyRendererTest {
   private static final Uri PROXIED_HTML_HREF = 
Uri.parse("http://example.org/proxied.php";);
   private static final Uri EXPECTED_PROXIED_HTML_HREF
       = Uri.parse("http://example.org/proxied.php?lang=all&country=ALL";);
+  private static final String USER_AGENT = "TestUserAgent/1.0";
   private static final GadgetContext CONTEXT = new GadgetContext() {
     @Override
     public SecurityToken getToken() {
       return new AnonymousSecurityToken();
     }
+    
+    @Override
+    public String getUserAgent() {
+      return USER_AGENT;
+    }    
   };
 
   private final FakeHttpCache cache = new FakeHttpCache();
@@ -216,6 +222,18 @@ public class ProxyRendererTest {
     JsonAssert.assertJsonEquals(JsonSerializer.serialize(prefetchedJson), 
postBody);
     assertTrue(pipelineExecutor.wasPreloaded);
   }
+  
+  @Test
+  public void appendUserAgent() throws Exception {
+    String expectedUA = USER_AGENT + " Shindig";
+    HttpRequest request = new HttpRequest(EXPECTED_PROXIED_HTML_HREF);
+    HttpResponse response = new HttpResponse(PROXIED_HTML_CONTENT);
+    pipeline.plainResponses.put(EXPECTED_PROXIED_HTML_HREF, response);
+    
+    String content = proxyRenderer.render(makeHrefGadget("none"));
+    String actualUA = pipeline.lastHttpRequest.getHeader("User-Agent");
+    assertEquals(expectedUA, actualUA);
+  }
 
   private static class FakeHttpCache extends AbstractHttpCache {
     private final Map<String, HttpResponse> map = Maps.newHashMap();

Modified: 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/HttpGadgetContextTest.java
URL: 
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/HttpGadgetContextTest.java?rev=936149&r1=936148&r2=936149&view=diff
==============================================================================
--- 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/HttpGadgetContextTest.java
 (original)
+++ 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/HttpGadgetContextTest.java
 Wed Apr 21 03:24:33 2010
@@ -85,4 +85,12 @@ public class HttpGadgetContextTest exten
     GadgetContext context = new HttpGadgetContext(request);
     assertEquals(expected, context.getToken());
   }
+  
+  @Test
+  public void testGetUserAgent() throws Exception {
+    expect(request.getHeader("User-Agent")).andReturn("Mozilla/4.0");
+    replay();
+    GadgetContext context = new HttpGadgetContext(request);
+    assertEquals("Mozilla/4.0", context.getUserAgent());
+  }
 }
\ No newline at end of file


Reply via email to