You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@shindig.apache.org by Kevin Brown <et...@google.com> on 2008/09/11 03:01:07 UTC

Re: svn commit: r694081 - in /incubator/shindig/trunk: features/core.io/ java/gadgets/src/main/java/org/apache/shindig/gadgets/http/ java/gadgets/src/main/java/org/apache/shindig/gadgets/oauth/ java/gadgets/src/main/java/org/apache/shindig/gadgets/pr

The changes to HttpPreload / MakeRequest aren't right here. This should be
pulled into a separate utility class; making the preload package depend on
the servlet package is confusing and likely to cause problems later when
somebody changes MakeRequest.
On Wed, Sep 10, 2008 at 5:51 PM, <be...@apache.org> wrote:

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