mirror of https://github.com/apache/jclouds.git
handled 307 redirects and added tests
git-svn-id: http://jclouds.googlecode.com/svn/trunk@1471 3d8758e0-26b5-11de-8745-db77d3ebf521
This commit is contained in:
parent
8da58cc24d
commit
07c36ec8cb
|
@ -23,6 +23,8 @@
|
||||||
*/
|
*/
|
||||||
package org.jclouds.aws.s3.filters;
|
package org.jclouds.aws.s3.filters;
|
||||||
|
|
||||||
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.TreeSet;
|
import java.util.TreeSet;
|
||||||
|
@ -37,6 +39,7 @@ import org.jclouds.http.HttpHeaders;
|
||||||
import org.jclouds.http.HttpRequest;
|
import org.jclouds.http.HttpRequest;
|
||||||
import org.jclouds.http.HttpRequestFilter;
|
import org.jclouds.http.HttpRequestFilter;
|
||||||
|
|
||||||
|
import com.google.common.annotations.VisibleForTesting;
|
||||||
import com.google.inject.Inject;
|
import com.google.inject.Inject;
|
||||||
import com.google.inject.name.Named;
|
import com.google.inject.name.Named;
|
||||||
|
|
||||||
|
@ -157,10 +160,14 @@ public class RequestAuthorizeSignature implements HttpRequestFilter {
|
||||||
toSign.append(valueOrEmpty(request.getHeaders().get(header))).append("\n");
|
toSign.append(valueOrEmpty(request.getHeaders().get(header))).append("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void appendBucketName(HttpRequest request, StringBuilder toSign) {
|
@VisibleForTesting
|
||||||
String hostHeader = request.getHeaders().get(HttpHeaders.HOST).iterator().next();
|
static void appendBucketName(HttpRequest request, StringBuilder toSign) {
|
||||||
if (hostHeader.endsWith(".s3.amazonaws.com"))
|
String hostHeader = request.getFirstHeaderOrNull(HttpHeaders.HOST);
|
||||||
toSign.append("/").append(hostHeader.substring(0, hostHeader.length() - 17));
|
if (hostHeader == null)
|
||||||
|
hostHeader = checkNotNull(request.getEndPoint().getHost(),
|
||||||
|
"request.getEndPoint().getHost()");
|
||||||
|
if (hostHeader.endsWith(".amazonaws.com") && !hostHeader.equals("s3.amazonaws.com"))
|
||||||
|
toSign.append("/").append(hostHeader.substring(0, hostHeader.lastIndexOf(".s3")));
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void appendUriPath(HttpRequest request, StringBuilder toSign) {
|
private static void appendUriPath(HttpRequest request, StringBuilder toSign) {
|
||||||
|
|
|
@ -55,7 +55,7 @@ public class AWSRedirectionRetryHandler extends RedirectionRetryHandler {
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean shouldRetryRequest(HttpFutureCommand<?> command, HttpResponse response) {
|
public boolean shouldRetryRequest(HttpFutureCommand<?> command, HttpResponse response) {
|
||||||
if (response.getStatusCode() == 301) {
|
if (response.getStatusCode() == 301 || response.getStatusCode() == 307) {
|
||||||
byte[] content = S3Utils.closeConnectionButKeepContentStream(response);
|
byte[] content = S3Utils.closeConnectionButKeepContentStream(response);
|
||||||
if (command.getRequest().getMethod() == HttpMethod.HEAD) {
|
if (command.getRequest().getMethod() == HttpMethod.HEAD) {
|
||||||
command.getRequest().setMethod(HttpMethod.GET);
|
command.getRequest().setMethod(HttpMethod.GET);
|
||||||
|
@ -67,9 +67,22 @@ public class AWSRedirectionRetryHandler extends RedirectionRetryHandler {
|
||||||
new String(content));
|
new String(content));
|
||||||
String host = error.getDetails().get(S3Constants.ENDPOINT);
|
String host = error.getDetails().get(S3Constants.ENDPOINT);
|
||||||
if (host != null) {
|
if (host != null) {
|
||||||
|
if (host.equals(command.getRequest().getEndPoint().getHost())) {
|
||||||
|
// must be an amazon error related to
|
||||||
|
// http://developer.amazonwebservices.com/connect/thread.jspa?messageID=72287𑩟
|
||||||
|
try {
|
||||||
|
command.incrementFailureCount();
|
||||||
|
Thread.sleep(100);
|
||||||
|
return true;
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
command.setException(e);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
URI endPoint = command.getRequest().getEndPoint();
|
URI endPoint = command.getRequest().getEndPoint();
|
||||||
endPoint = Utils.replaceHostInEndPoint(endPoint, host);
|
endPoint = Utils.replaceHostInEndPoint(endPoint, host);
|
||||||
command.getRequest().setEndPoint(endPoint);
|
command.getRequest().setEndPoint(endPoint);
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -23,8 +23,15 @@
|
||||||
*/
|
*/
|
||||||
package org.jclouds.aws.s3.filters;
|
package org.jclouds.aws.s3.filters;
|
||||||
|
|
||||||
|
import static org.testng.Assert.assertEquals;
|
||||||
|
|
||||||
|
import java.net.URI;
|
||||||
|
|
||||||
import org.jclouds.aws.s3.reference.S3Constants;
|
import org.jclouds.aws.s3.reference.S3Constants;
|
||||||
import org.jclouds.aws.util.DateService;
|
import org.jclouds.aws.util.DateService;
|
||||||
|
import org.jclouds.http.HttpHeaders;
|
||||||
|
import org.jclouds.http.HttpMethod;
|
||||||
|
import org.jclouds.http.HttpRequest;
|
||||||
import org.testng.annotations.Test;
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
import com.google.inject.AbstractModule;
|
import com.google.inject.AbstractModule;
|
||||||
|
@ -34,21 +41,38 @@ import com.google.inject.name.Names;
|
||||||
@Test(groups = "unit", testName = "s3.RequestAuthorizeSignatureTest")
|
@Test(groups = "unit", testName = "s3.RequestAuthorizeSignatureTest")
|
||||||
public class RequestAuthorizeSignatureTest {
|
public class RequestAuthorizeSignatureTest {
|
||||||
|
|
||||||
RequestAuthorizeSignature filter = null;
|
@Test
|
||||||
|
void testAppendBucketNameHostHeader() {
|
||||||
|
URI host = URI.create("http://s3.amazonaws.com:80");
|
||||||
|
HttpRequest request = new HttpRequest(host, HttpMethod.GET, "/");
|
||||||
|
request.getHeaders().put(HttpHeaders.HOST, "adriancole.s3int5.s3.amazonaws.com");
|
||||||
|
StringBuilder builder = new StringBuilder();
|
||||||
|
RequestAuthorizeSignature.appendBucketName(request, builder);
|
||||||
|
assertEquals(builder.toString(), "/adriancole.s3int5");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testAppendBucketNameHostHeaderService() {
|
||||||
|
URI host = URI.create("http://s3.amazonaws.com:80");
|
||||||
|
HttpRequest request = new HttpRequest(host, HttpMethod.GET, "/");
|
||||||
|
request.getHeaders().put(HttpHeaders.HOST, "s3.amazonaws.com");
|
||||||
|
StringBuilder builder = new StringBuilder();
|
||||||
|
RequestAuthorizeSignature.appendBucketName(request, builder);
|
||||||
|
assertEquals(builder.toString(), "");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testAppendBucketNameURIHost() {
|
||||||
|
URI host = URI.create("http://adriancole.s3int5.s3-external-3.amazonaws.com:80");
|
||||||
|
HttpRequest request = new HttpRequest(host, HttpMethod.GET, "/");
|
||||||
|
StringBuilder builder = new StringBuilder();
|
||||||
|
RequestAuthorizeSignature.appendBucketName(request, builder);
|
||||||
|
assertEquals(builder.toString(), "/adriancole.s3int5");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void testUpdatesOnlyOncePerSecond() throws NoSuchMethodException, InterruptedException {
|
void testUpdatesOnlyOncePerSecond() throws NoSuchMethodException, InterruptedException {
|
||||||
filter = Guice.createInjector(new AbstractModule() {
|
RequestAuthorizeSignature filter = createFilter();
|
||||||
|
|
||||||
protected void configure() {
|
|
||||||
bindConstant().annotatedWith(Names.named(S3Constants.PROPERTY_AWS_ACCESSKEYID)).to(
|
|
||||||
"foo");
|
|
||||||
bindConstant().annotatedWith(Names.named(S3Constants.PROPERTY_AWS_SECRETACCESSKEY)).to(
|
|
||||||
"bar");
|
|
||||||
bind(DateService.class);
|
|
||||||
|
|
||||||
}
|
|
||||||
}).getInstance(RequestAuthorizeSignature.class);
|
|
||||||
// filter.createNewStamp();
|
// filter.createNewStamp();
|
||||||
String timeStamp = filter.timestampAsHeaderString();
|
String timeStamp = filter.timestampAsHeaderString();
|
||||||
// replay(filter);
|
// replay(filter);
|
||||||
|
@ -60,4 +84,18 @@ public class RequestAuthorizeSignatureTest {
|
||||||
// verify(filter);
|
// verify(filter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private RequestAuthorizeSignature createFilter() {
|
||||||
|
return Guice.createInjector(new AbstractModule() {
|
||||||
|
|
||||||
|
protected void configure() {
|
||||||
|
bindConstant().annotatedWith(Names.named(S3Constants.PROPERTY_AWS_ACCESSKEYID)).to(
|
||||||
|
"foo");
|
||||||
|
bindConstant().annotatedWith(Names.named(S3Constants.PROPERTY_AWS_SECRETACCESSKEY)).to(
|
||||||
|
"bar");
|
||||||
|
bind(DateService.class);
|
||||||
|
|
||||||
|
}
|
||||||
|
}).getInstance(RequestAuthorizeSignature.class);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
Loading…
Reference in New Issue