diff --git a/google-oauth-client/src/main/java/com/google/api/client/auth/oauth/OAuthParameters.java b/google-oauth-client/src/main/java/com/google/api/client/auth/oauth/OAuthParameters.java index 666825826..35de3fd04 100644 --- a/google-oauth-client/src/main/java/com/google/api/client/auth/oauth/OAuthParameters.java +++ b/google-oauth-client/src/main/java/com/google/api/client/auth/oauth/OAuthParameters.java @@ -14,15 +14,19 @@ package com.google.api.client.auth.oauth; +import com.google.api.client.http.HttpContent; import com.google.api.client.http.GenericUrl; import com.google.api.client.http.HttpExecuteInterceptor; import com.google.api.client.http.HttpRequest; import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.UrlEncodedContent; import com.google.api.client.util.Beta; +import com.google.api.client.util.Data; import com.google.api.client.util.escape.PercentEscaper; import com.google.common.collect.Multiset; import com.google.common.collect.SortedMultiset; import com.google.common.collect.TreeMultiset; + import java.io.IOException; import java.security.GeneralSecurityException; import java.security.SecureRandom; @@ -53,7 +57,8 @@ * @author Yaniv Inbar */ @Beta -public final class OAuthParameters implements HttpExecuteInterceptor, HttpRequestInitializer { +public final class OAuthParameters implements HttpExecuteInterceptor, HttpRequestInitializer +{ /** Secure random number generator to sign requests. */ private static final SecureRandom RANDOM = new SecureRandom(); @@ -271,7 +276,19 @@ public void intercept(HttpRequest request) throws IOException { computeNonce(); computeTimestamp(); try { - computeSignature(request.getRequestMethod(), request.getUrl()); + GenericUrl url = request.getUrl(); + HttpContent content = request.getContent(); + Map urlEncodedParams = null; + if (content instanceof UrlEncodedContent) { + urlEncodedParams = Data.mapOf(((UrlEncodedContent) content).getData()); + url.putAll(urlEncodedParams); + } + computeSignature(request.getRequestMethod(), url); + if (urlEncodedParams != null) { + for (Map.Entry entry : urlEncodedParams.entrySet()) { + url.remove(entry.getKey()); + } + } } catch (GeneralSecurityException e) { IOException io = new IOException(); io.initCause(e); diff --git a/google-oauth-client/src/test/java/com/google/api/client/auth/oauth/OAuthParametersTest.java b/google-oauth-client/src/test/java/com/google/api/client/auth/oauth/OAuthParametersTest.java index 7ec46ffc9..244689580 100644 --- a/google-oauth-client/src/test/java/com/google/api/client/auth/oauth/OAuthParametersTest.java +++ b/google-oauth-client/src/test/java/com/google/api/client/auth/oauth/OAuthParametersTest.java @@ -15,7 +15,15 @@ package com.google.api.client.auth.oauth; import com.google.api.client.http.GenericUrl; + +import java.io.IOException; import java.security.GeneralSecurityException; +import java.util.Collections; +import java.util.Map; + +import com.google.api.client.http.HttpRequest; +import com.google.api.client.http.UrlEncodedContent; +import com.google.api.client.http.javanet.NetHttpTransport; import junit.framework.TestCase; /** @@ -75,6 +83,22 @@ public void testSignature() throws GeneralSecurityException { parameters.signature); } + public void testSignatureWithUrlEncodedContent() throws IOException { + OAuthParameters parameters = new OAuthParameters(); + parameters.signer = new MockSigner(); + + GenericUrl url = new GenericUrl("https://example.local?foo=bar"); + Map contentParameters = Collections.singletonMap("this", (Object) "that"); + UrlEncodedContent content = new UrlEncodedContent(contentParameters); + + HttpRequest request = new NetHttpTransport.Builder().build() + .createRequestFactory().buildPostRequest(url, content); + parameters.intercept(request); + + assertTrue(parameters.signature.endsWith("%26this%3Dthat")); + assertEquals("https://example.local?foo=bar", url.build()); + } + public void testSignatureWithRepeatedParameter() throws GeneralSecurityException { OAuthParameters parameters = new OAuthParameters(); parameters.signer = new MockSigner();