Author: beaton
Date: Wed Sep 10 17:51:46 2008
New Revision: 694081

URL: http://svn.apache.org/viewvc?rev=694081&view=rev
Log:
Return cookies and location headers, as per
http://groups.google.com/group/opensocial-and-gadgets-spec/browse_thread/thread/51b016b80e9d21e6

Don't follow 302 redirects for signed fetch and OAuth, since the redirect URL
isn't signed.


Modified:
    incubator/shindig/trunk/features/core.io/io.js
    incubator/shindig/trunk/features/core.io/iotest.js
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/BasicHttpFetcher.java
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpRequest.java
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/oauth/OAuthFetcher.java
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/preload/HttpPreloader.java
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/MakeRequestHandler.java
    
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/AbstractHttpFetcherTest.java
    
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/HttpRequestTest.java
    
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/oauth/FakeOAuthServiceProvider.java
    
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/oauth/OAuthFetcherTest.java
    
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/preload/HttpPreloaderTest.java
    
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/MakeRequestHandlerTest.java

Modified: incubator/shindig/trunk/features/core.io/io.js
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/features/core.io/io.js?rev=694081&r1=694080&r2=694081&view=diff
==============================================================================
--- incubator/shindig/trunk/features/core.io/io.js (original)
+++ incubator/shindig/trunk/features/core.io/io.js Wed Sep 10 17:51:46 2008
@@ -134,6 +134,8 @@
   function transformResponseData(params, data) {
     var resp = {
      text: data.body,
+     rc: data.rc,
+     headers: data.headers,
      oauthApprovalUrl: data.oauthApprovalUrl,
      oauthError: data.oauthError,
      oauthErrorText: data.oauthErrorText,
@@ -233,6 +235,8 @@
           }
           var resp = {
             body: preload.body,
+            rc: preload.rc,
+            headers: preload.headers,
             oauthApprovalUrl: preload.oauthApprovalUrl,
             oauthError: preload.oauthError,
             oauthErrorText: preload.oauthErrorText,

Modified: incubator/shindig/trunk/features/core.io/iotest.js
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/features/core.io/iotest.js?rev=694081&r1=694080&r2=694081&view=diff
==============================================================================
--- incubator/shindig/trunk/features/core.io/iotest.js (original)
+++ incubator/shindig/trunk/features/core.io/iotest.js Wed Sep 10 17:51:46 2008
@@ -734,6 +734,10 @@
     "http://target.example.com/somepage"; : {
       "rc" : 200,
       "body" : "preloadedbody",
+      "headers": {
+        "set-cookie": ["foo=bar","baz=quux"],
+        "location": ["somewhere"],
+      }
     }
   };
 
@@ -744,6 +748,9 @@
       });
 
   this.assertEquals("preloadedbody", resp.text);
+  this.assertEquals("somewhere", resp.headers["location"][0]);
+  this.assertEquals("foo=bar", resp.headers["set-cookie"][0]);
+  this.assertEquals("baz=quux", resp.headers["set-cookie"][1]);
 
   var req = new fakeXhr.Expectation("GET", "http://example.com/json";);
   this.setStandardArgs(req, false);

Modified: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/BasicHttpFetcher.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/BasicHttpFetcher.java?rev=694081&r1=694080&r2=694081&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/BasicHttpFetcher.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/BasicHttpFetcher.java
 Wed Sep 10 17:51:46 2008
@@ -80,7 +80,7 @@
     HttpURLConnection fetcher = (HttpURLConnection)url.openConnection();
     fetcher.setConnectTimeout(CONNECT_TIMEOUT_MS);
     fetcher.setRequestProperty("Accept-Encoding", "gzip, deflate");
-    fetcher.setInstanceFollowRedirects(true);
+    fetcher.setInstanceFollowRedirects(request.getFollowRedirects());
     for (Map.Entry<String, List<String>> entry : 
request.getHeaders().entrySet()) {
       fetcher.setRequestProperty(entry.getKey(), 
StringUtils.join(entry.getValue(), ','));
     }

Modified: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpRequest.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpRequest.java?rev=694081&r1=694080&r2=694081&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpRequest.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpRequest.java
 Wed Sep 10 17:51:46 2008
@@ -58,6 +58,9 @@
   private boolean ignoreCache;
   private int cacheTtl = -1;
 
+  // Whether to follow redirects
+  private boolean followRedirects = true;
+  
   // Context for the request.
   private Uri gadget;
   private String container = ContainerConfig.DEFAULT_CONTAINER;
@@ -95,6 +98,7 @@
     }
     authType = request.authType;
     rewriteMimeType = request.rewriteMimeType;
+    followRedirects = request.followRedirects;
   }
 
   public HttpRequest setMethod(String method) {
@@ -232,6 +236,14 @@
     this.oauthArguments = oauthArguments;
     return this;
   }
+  
+  /**
+   * @param followRedirects whether this request should automatically follow 
redirects.
+   */
+  public HttpRequest setFollowRedirects(boolean followRedirects) {
+    this.followRedirects = followRedirects;
+    return this;
+  }
 
   /**
    * @param authType The type of authentication being used for this request.
@@ -374,6 +386,13 @@
   public OAuthArguments getOAuthArguments() {
     return oauthArguments;
   }
+  
+  /**
+   * @return true if redirects should be followed.
+   */
+  public boolean getFollowRedirects() {
+    return followRedirects;
+  }
 
   /**
    * @return The type of authentication being used for this request.

Modified: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/oauth/OAuthFetcher.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/oauth/OAuthFetcher.java?rev=694081&r1=694080&r2=694081&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/oauth/OAuthFetcher.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/oauth/OAuthFetcher.java
 Wed Sep 10 17:51:46 2008
@@ -429,6 +429,8 @@
       OAuthMessage signed = accessorInfo.getAccessor().newRequestMessage(
           base.getMethod(), target.toString(), params);
       HttpRequest oauthHttpRequest = createHttpRequest(base, 
selectOAuthParams(signed));
+      // Following 302s on OAuth responses is unlikely to be productive.
+      oauthHttpRequest.setFollowRedirects(false);
       return oauthHttpRequest;
     } catch (IOException e) {
       throw new GadgetException(GadgetException.Code.INTERNAL_SERVER_ERROR, e);

Modified: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/preload/HttpPreloader.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/preload/HttpPreloader.java?rev=694081&r1=694080&r2=694081&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/preload/HttpPreloader.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/preload/HttpPreloader.java
 Wed Sep 10 17:51:46 2008
@@ -24,8 +24,11 @@
 import org.apache.shindig.gadgets.http.HttpRequest;
 import org.apache.shindig.gadgets.http.HttpResponse;
 import org.apache.shindig.gadgets.oauth.OAuthArguments;
+import org.apache.shindig.gadgets.servlet.MakeRequestHandler;
 import org.apache.shindig.gadgets.spec.GadgetSpec;
 import org.apache.shindig.gadgets.spec.Preload;
+import org.json.JSONException;
+import org.json.JSONObject;
 
 import com.google.common.collect.Maps;
 import com.google.inject.Inject;
@@ -84,12 +87,16 @@
    * Implements PreloadData by returning a Map that matches the output format 
used by makeRequest.
    */
   private static class HttpPreloadData implements PreloadedData {
-    private final Map<String, String> data;
+    private final JSONObject data;
 
     public HttpPreloadData(HttpResponse response) {
-      data = Maps.newHashMap(response.getMetadata());
-      data.put("body", response.getResponseAsString());
-      data.put("rc", Integer.toString(response.getHttpStatusCode()));
+      JSONObject data = null;
+      try {
+        data = MakeRequestHandler.getResponseAsJson(response, 
response.getResponseAsString());
+      } catch (JSONException e) {
+        data = new JSONObject();
+      }
+      this.data = data;
     }
 
     public Object toJson() {

Modified: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/MakeRequestHandler.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/MakeRequestHandler.java?rev=694081&r1=694080&r2=694081&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/MakeRequestHandler.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/MakeRequestHandler.java
 Wed Sep 10 17:51:46 2008
@@ -34,10 +34,12 @@
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
 
+import org.json.JSONArray;
 import org.json.JSONException;
 import org.json.JSONObject;
 
 import java.io.IOException;
+import java.util.List;
 import java.util.Map;
 
 import javax.servlet.http.HttpServletRequest;
@@ -169,21 +171,54 @@
   }
 
   /**
+   * Convert a response to a JSON object.  static so it can be used by 
HttpPreloaders as well.
+   * 
+   * The returned JSON object contains the following values:
+   * rc: integer response code
+   * body: string response body
+   * headers: object, keys are header names, values are lists of header values
+   * 
+   * @param response the response body
+   * @param body string to use as the body of the response.
+   * @return a JSONObject representation of the response body.
+   */
+  public static JSONObject getResponseAsJson(HttpResponse response, String 
body)
+      throws JSONException {
+    JSONObject resp = new JSONObject();
+    resp.put("rc", response.getHttpStatusCode());
+    resp.put("body", body);
+    JSONObject headers = new JSONObject();
+    addHeaders(headers, response, "set-cookie");
+    addHeaders(headers, response, "location");
+    resp.put("headers", headers);
+    // Merge in additional response data
+    for (Map.Entry<String, String> entry : response.getMetadata().entrySet()) {
+      resp.put(entry.getKey(), entry.getValue());
+    }
+    return resp;
+  }
+  
+  private static void addHeaders(JSONObject headers, HttpResponse response, 
String headerName)
+      throws JSONException {
+    List<String> values = response.getHeaders(headerName);
+    if (!values.isEmpty()) {
+      headers.put(headerName.toLowerCase(), new JSONArray(values));
+    }
+  }
+  
+  /**
    * Format a response as JSON, including additional JSON inserted by
    * chained content fetchers.
    */
   private String convertResponseToJson(SecurityToken authToken, 
HttpServletRequest request,
       HttpResponse results) throws GadgetException {
     try {
-      JSONObject resp = new JSONObject();
       String originalUrl = request.getParameter(ProxyBase.URL_PARAM);
       String body = results.getResponseAsString();
       if ("FEED".equals(request.getParameter(CONTENT_TYPE_PARAM))) {
-        resp.put("body", processFeed(originalUrl, request, body));
-      } else {
-        resp.put("body", body);
+        body = processFeed(originalUrl, request, body);
       }
-      resp.put("rc", results.getHttpStatusCode());
+      JSONObject resp = getResponseAsJson(results, body);
 
       if (authToken != null) {
         String updatedAuthToken = authToken.getUpdatedToken();
@@ -191,11 +226,6 @@
           resp.put("st", updatedAuthToken);
         }
       }
-
-      // Merge in additional response data
-      for (Map.Entry<String, String> entry : results.getMetadata().entrySet()) 
{
-        resp.put(entry.getKey(), entry.getValue());
-      }
       // Use raw param as key as URL may have to be decoded
       return new JSONObject().put(originalUrl, resp).toString();
     } catch (JSONException e) {

Modified: 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/AbstractHttpFetcherTest.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/AbstractHttpFetcherTest.java?rev=694081&r1=694080&r2=694081&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/AbstractHttpFetcherTest.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/AbstractHttpFetcherTest.java
 Wed Sep 10 17:51:46 2008
@@ -173,4 +173,32 @@
     assertEquals("POST", response.getHeader("x-method"));
     ArrayAssert.assertEquals(body, response.getResponseAsBytes());
   }
+  
+  @Test public void testFollowRedirects() throws Exception {
+    String content = "";
+    Uri uri = new UriBuilder(BASE_URL)
+        .addQueryParameter("body", content)
+        .addQueryParameter("status", "302")
+        .addQueryParameter("header", "Location=" + BASE_URL.toString() + 
"?body=redirected")
+        .toUri();
+    HttpRequest request = new HttpRequest(uri);
+    HttpResponse response = fetcher.fetch(request);
+    assertEquals(200, response.getHttpStatusCode());
+    assertEquals("redirected", response.getResponseAsString());
+  }
+  
+  @Test public void testNoFollowRedirects() throws Exception {
+    String content = "";
+    Uri uri = new UriBuilder(BASE_URL)
+        .addQueryParameter("body", content)
+        .addQueryParameter("status", "302")
+        .addQueryParameter("header", "Location=" + BASE_URL.toString() + 
"?body=redirected")
+        .toUri();
+    HttpRequest request = new HttpRequest(uri)
+        .setFollowRedirects(false);
+    HttpResponse response = fetcher.fetch(request);
+    assertEquals(302, response.getHttpStatusCode());
+    assertEquals(content, response.getResponseAsString());
+    assertEquals(BASE_URL.toString() + "?body=redirected", 
response.getHeader("Location"));
+  }
 }

Modified: 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/HttpRequestTest.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/HttpRequestTest.java?rev=694081&r1=694080&r2=694081&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/HttpRequestTest.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/HttpRequestTest.java
 Wed Sep 10 17:51:46 2008
@@ -19,6 +19,7 @@
 package org.apache.shindig.gadgets.http;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
 import org.apache.shindig.auth.AnonymousSecurityToken;
@@ -86,6 +87,12 @@
   }
 
   @Test
+  public void testDefaultIsFollowRedirects() {
+    HttpRequest request = new HttpRequest(DEFAULT_URI);
+    assertTrue(request.getFollowRedirects());
+  }
+  
+  @Test
   public void copyCtorCopiesAllFields() {
     OAuthArguments oauthArguments = new OAuthArguments();
     oauthArguments.setSignOwner(false);
@@ -100,7 +107,8 @@
         .setRewriteMimeType("text/fake")
         .setSecurityToken(new AnonymousSecurityToken())
         .setOAuthArguments(oauthArguments)
-        .setAuthType(AuthType.OAUTH);
+        .setAuthType(AuthType.OAUTH)
+        .setFollowRedirects(false);
 
     HttpRequest request2 = new 
HttpRequest(request).setUri(Uri.parse("http://example.org/foo";));
 
@@ -117,5 +125,6 @@
     assertEquals(request.getOAuthArguments().getSignViewer(),
         request2.getOAuthArguments().getSignViewer());
     assertEquals(AuthType.OAUTH, request.getAuthType());
+    assertFalse(request.getFollowRedirects());
   }
 }

Modified: 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/oauth/FakeOAuthServiceProvider.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/oauth/FakeOAuthServiceProvider.java?rev=694081&r1=694080&r2=694081&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/oauth/FakeOAuthServiceProvider.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/oauth/FakeOAuthServiceProvider.java
 Wed Sep 10 17:51:46 2008
@@ -63,7 +63,6 @@
   
   public final static String SIGNED_FETCH_CONSUMER_KEY = "signedfetch";
 
-
   private static class TokenState {
     String tokenSecret;
     OAuthConsumer consumer;
@@ -157,7 +156,7 @@
   public void setVagueErrors(boolean vagueErrors) {
     this.vagueErrors = vagueErrors;
   }
-  
+
   public void addParamLocation(OAuthParamLocation paramLocation) {
     validParamLocations.add(paramLocation);
   }
@@ -178,6 +177,9 @@
   }
 
   private HttpResponse realFetch(HttpRequest request) {
+    if (request.getFollowRedirects()) {
+      throw new RuntimeException("Not supposed to follow OAuth redirects");
+    }
     String url = request.getUri().toString();
     try {
       if (url.startsWith(REQUEST_TOKEN_URL)) {

Modified: 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/oauth/OAuthFetcherTest.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/oauth/OAuthFetcherTest.java?rev=694081&r1=694080&r2=694081&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/oauth/OAuthFetcherTest.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/oauth/OAuthFetcherTest.java
 Wed Sep 10 17:51:46 2008
@@ -736,7 +736,8 @@
     HttpResponse resp = client.sendGet(FakeOAuthServiceProvider.RESOURCE_URL);
     List<Parameter> queryParams = OAuth.decodeForm(resp.getResponseAsString());
     assertTrue(contains(queryParams, "opensocial_owner_id", "o"));
-    assertTrue(contains(queryParams, "opensocial_viewer_id", "v"));  }
+    assertTrue(contains(queryParams, "opensocial_viewer_id", "v"));
+  }
   
   @Test
   public void testGetWithQuery() throws Exception {

Modified: 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/preload/HttpPreloaderTest.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/preload/HttpPreloaderTest.java?rev=694081&r1=694080&r2=694081&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/preload/HttpPreloaderTest.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/preload/HttpPreloaderTest.java
 Wed Sep 10 17:51:46 2008
@@ -36,11 +36,17 @@
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 
+import org.easymock.IMocksControl;
+import org.easymock.classextension.EasyMock;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.junit.Before;
 import org.junit.Test;
 
 import java.net.URI;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.concurrent.Callable;
 
 /**
@@ -89,11 +95,15 @@
     assertEquals(context.getToken().getAppId(), 
request.getSecurityToken().getAppId());
   }
 
-  private static void checkResults(Map<String, String> results) {
+  private static void checkResults(JSONObject results) throws JSONException {
     assertEquals(PRELOAD_CONTENT, results.get("body"));
-    assertEquals(HttpResponse.SC_OK, Integer.parseInt(results.get("rc")));
-    assertTrue("Metadata values not copied to output.",
-        results.entrySet().containsAll(PRELOAD_METADATA.entrySet()));
+    assertEquals(HttpResponse.SC_OK, results.getInt("rc"));
+    assertEquals("yo=momma", 
results.getJSONObject("headers").getJSONArray("set-cookie").get(0));
+
+    for (Entry<String, String> entry : PRELOAD_METADATA.entrySet()) {
+      assertEquals("Metadata values not copied to output.",
+          entry.getValue(), results.get(entry.getKey()));
+    }
   }
 
   @Test
@@ -111,7 +121,7 @@
     PreloadedData data = preloaded.get(PRELOAD_HREF).call();
 
     checkRequest(plainFetcher.requests.get(0));
-    checkResults((Map<String, String>)data.toJson());
+    checkResults((JSONObject)data.toJson());
   }
 
   @Test
@@ -132,7 +142,7 @@
     checkRequest(request);
     assertTrue(request.getOAuthArguments().getSignOwner());
     assertFalse(request.getOAuthArguments().getSignViewer());
-    checkResults((Map<String, String>)data.toJson());
+    checkResults((JSONObject) data.toJson());
   }
 
   @Test
@@ -152,7 +162,7 @@
 
     HttpRequest request = oauthFetcher.requests.get(0);
     checkRequest(request);
-    checkResults((Map<String, String>)data.toJson());
+    checkResults((JSONObject) data.toJson());
   }
 
   @Test
@@ -170,11 +180,11 @@
 
     PreloadedData data = preloaded.get(PRELOAD_HREF).call();
     checkRequest(plainFetcher.requests.get(0));
-    checkResults((Map<String, String>)data.toJson());
+    checkResults((JSONObject) data.toJson());
 
     data = preloaded.get(PRELOAD_HREF2).call();
     checkRequest(plainFetcher.requests.get(1));
-    checkResults((Map<String, String>)data.toJson());
+    checkResults((JSONObject) data.toJson());
   }
 
   private static class RecordingHttpFetcher implements HttpFetcher {
@@ -185,6 +195,7 @@
       return new HttpResponseBuilder()
           .setMetadata(PRELOAD_METADATA)
           .setResponseString(PRELOAD_CONTENT)
+          .addHeader("Set-Cookie", "yo=momma")
           .create();
     }
   }

Modified: 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/MakeRequestHandlerTest.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/MakeRequestHandlerTest.java?rev=694081&r1=694080&r2=694081&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/MakeRequestHandlerTest.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/MakeRequestHandlerTest.java
 Wed Sep 10 17:51:46 2008
@@ -359,4 +359,46 @@
     assertEquals(RESPONSE_BODY, results.getString("foo"));
     assertTrue(rewriter.responseWasRewritten());
   }
+  
+  public void testSetCookiesReturned() throws Exception {
+    HttpRequest internalRequest = new HttpRequest(REQUEST_URL);
+    HttpResponse response = new HttpResponseBuilder()
+        .setResponse("foo".getBytes("UTF-8"))
+        .addHeader("Set-Cookie", "foo=bar; Secure")
+        .addHeader("Set-Cookie", "name=value")
+        .create();
+    
+    expect(fetcherFactory.fetch(internalRequest)).andReturn(response);
+    replay();
+
+    handler.fetch(request, recorder);
+    JSONObject results = extractJsonFromResponse();
+    JSONObject headers = results.getJSONObject("headers");
+    assertNotNull(headers);
+    JSONArray cookies = headers.getJSONArray("set-cookie");
+    assertNotNull(cookies);
+    assertEquals(2, cookies.length());
+    assertEquals("foo=bar; Secure", cookies.get(0));
+    assertEquals("name=value", cookies.get(1));
+  }
+  
+  public void testLocationReturned() throws Exception {
+    HttpRequest internalRequest = new HttpRequest(REQUEST_URL);
+    HttpResponse response = new HttpResponseBuilder()
+        .setResponse("foo".getBytes("UTF-8"))
+        .addHeader("Location", "somewhere else")
+        .create();
+    
+    expect(fetcherFactory.fetch(internalRequest)).andReturn(response);
+    replay();
+
+    handler.fetch(request, recorder);
+    JSONObject results = extractJsonFromResponse();
+    JSONObject headers = results.getJSONObject("headers");
+    assertNotNull(headers);
+    JSONArray locations = headers.getJSONArray("location");
+    assertNotNull(locations);
+    assertEquals(1, locations.length());
+    assertEquals("somewhere else", locations.get(0));
+  }
 }


Reply via email to