s3: explicitly set Expect header on methods that need it

This commit is contained in:
adriancole 2013-03-03 17:24:02 -08:00
parent 2c3c3fad52
commit 1c2090fd08
6 changed files with 30 additions and 15 deletions

View File

@ -18,6 +18,7 @@
*/ */
package org.jclouds.s3; package org.jclouds.s3;
import static com.google.common.net.HttpHeaders.EXPECT;
import static org.jclouds.blobstore.attr.BlobScopes.CONTAINER; import static org.jclouds.blobstore.attr.BlobScopes.CONTAINER;
import java.util.Set; import java.util.Set;
@ -168,6 +169,7 @@ public interface S3AsyncClient {
@Named("PutObject") @Named("PutObject")
@PUT @PUT
@Path("/{key}") @Path("/{key}")
@Headers(keys = EXPECT, values = "100-continue")
@ResponseParser(ParseETagHeader.class) @ResponseParser(ParseETagHeader.class)
ListenableFuture<String> putObject( ListenableFuture<String> putObject(
@Bucket @EndpointParam(parser = AssignCorrectHostnameForBucket.class) @BinderParam(BindAsHostPrefixIfConfigured.class) @ParamValidators(BucketNameValidator.class) String bucketName, @Bucket @EndpointParam(parser = AssignCorrectHostnameForBucket.class) @BinderParam(BindAsHostPrefixIfConfigured.class) @ParamValidators(BucketNameValidator.class) String bucketName,

View File

@ -82,6 +82,7 @@ public class PathBasedS3ClientExpectTest extends BaseS3ClientExpectTest {
HttpRequest bucketFooExists = HttpRequest.builder().method("PUT") HttpRequest bucketFooExists = HttpRequest.builder().method("PUT")
.endpoint("https://s3.amazonaws.com/bucket/object") .endpoint("https://s3.amazonaws.com/bucket/object")
.addHeader("Expect", "100-continue")
.addHeader("Date", CONSTANT_DATE) .addHeader("Date", CONSTANT_DATE)
.addHeader("Authorization", "AWS identity:6gC0m7SYFDPwkUqY5EHV/6i9DfM=") .addHeader("Authorization", "AWS identity:6gC0m7SYFDPwkUqY5EHV/6i9DfM=")
.payload("hello world") .payload("hello world")

View File

@ -20,7 +20,10 @@ package org.jclouds.s3;
import static com.google.common.net.HttpHeaders.CONTENT_LENGTH; import static com.google.common.net.HttpHeaders.CONTENT_LENGTH;
import static com.google.common.net.HttpHeaders.ETAG; import static com.google.common.net.HttpHeaders.ETAG;
import static com.google.common.net.HttpHeaders.EXPECT;
import static com.google.common.util.concurrent.MoreExecutors.sameThreadExecutor; import static com.google.common.util.concurrent.MoreExecutors.sameThreadExecutor;
import static org.jclouds.Constants.PROPERTY_MAX_RETRIES;
import static org.jclouds.Constants.PROPERTY_SO_TIMEOUT;
import static org.jclouds.s3.reference.S3Constants.PROPERTY_S3_VIRTUAL_HOST_BUCKETS; import static org.jclouds.s3.reference.S3Constants.PROPERTY_S3_VIRTUAL_HOST_BUCKETS;
import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertEquals;
@ -46,7 +49,7 @@ import com.google.mockwebserver.RecordedRequest;
* *
* @author Adrian Cole * @author Adrian Cole
*/ */
@Test @Test(singleThreaded = true)
public class S3ClientMockTest { public class S3ClientMockTest {
private static final Set<Module> modules = ImmutableSet.<Module> of( private static final Set<Module> modules = ImmutableSet.<Module> of(
@ -55,7 +58,9 @@ public class S3ClientMockTest {
static RestContext<? extends S3Client,? extends S3AsyncClient> getContext(URL server) { static RestContext<? extends S3Client,? extends S3AsyncClient> getContext(URL server) {
Properties overrides = new Properties(); Properties overrides = new Properties();
overrides.setProperty(PROPERTY_S3_VIRTUAL_HOST_BUCKETS, "false"); overrides.setProperty(PROPERTY_S3_VIRTUAL_HOST_BUCKETS, "false");
// prevent expect-100 bug http://code.google.com/p/mockwebserver/issues/detail?id=6
overrides.setProperty(PROPERTY_SO_TIMEOUT, "0");
overrides.setProperty(PROPERTY_MAX_RETRIES, "1");
return ContextBuilder.newBuilder("s3") return ContextBuilder.newBuilder("s3")
.credentials("accessKey", "secretKey") .credentials("accessKey", "secretKey")
.endpoint(server.toString()) .endpoint(server.toString())
@ -79,24 +84,28 @@ public class S3ClientMockTest {
RecordedRequest request = server.takeRequest(); RecordedRequest request = server.takeRequest();
assertEquals(request.getRequestLine(), "PUT /bucket/object HTTP/1.1"); assertEquals(request.getRequestLine(), "PUT /bucket/object HTTP/1.1");
assertEquals(request.getHeaders(CONTENT_LENGTH), ImmutableList.of("0")); assertEquals(request.getHeaders(CONTENT_LENGTH), ImmutableList.of("0"));
// will fail unless -Dsun.net.http.allowRestrictedHeaders=true is set
assertEquals(request.getHeaders(EXPECT), ImmutableList.of("100-continue"));
server.shutdown(); server.shutdown();
} }
public void testDirectorySeparator() throws IOException, InterruptedException { public void testDirectorySeparator() throws IOException, InterruptedException {
MockWebServer server = new MockWebServer(); MockWebServer server = new MockWebServer();
server.enqueue(new MockResponse().setBody("").addHeader(ETAG, "ABCDEF")); server.enqueue(new MockResponse().setBody("").addHeader(ETAG, "ABCDEF"));
server.play(); server.play();
S3Client client = getContext(server.getUrl("/")).getApi(); S3Client client = getContext(server.getUrl("/")).getApi();
S3Object fileInDir = client.newS3Object(); S3Object fileInDir = client.newS3Object();
fileInDir.getMetadata().setKey("someDir/fileName"); fileInDir.getMetadata().setKey("someDir/fileName");
fileInDir.setPayload(new byte[] {}); fileInDir.setPayload(new byte[] { 1, 2, 3, 4 });
assertEquals(client.putObject("bucket", fileInDir), "ABCDEF"); assertEquals(client.putObject("bucket", fileInDir), "ABCDEF");
RecordedRequest request = server.takeRequest(); RecordedRequest request = server.takeRequest();
assertEquals(request.getRequestLine(), "PUT /bucket/someDir/fileName HTTP/1.1"); assertEquals(request.getRequestLine(), "PUT /bucket/someDir/fileName HTTP/1.1");
// will fail unless -Dsun.net.http.allowRestrictedHeaders=true is set
assertEquals(request.getHeaders(EXPECT), ImmutableList.of("100-continue"));
server.shutdown(); server.shutdown();
} }
} }

View File

@ -82,6 +82,7 @@ public class S3BlobSignerExpectTest extends BaseBlobSignerExpectTest {
protected HttpRequest putBlob() { protected HttpRequest putBlob() {
return HttpRequest.builder().method("PUT") return HttpRequest.builder().method("PUT")
.endpoint("https://container.s3.amazonaws.com/name") .endpoint("https://container.s3.amazonaws.com/name")
.addHeader("Expect", "100-continue")
.addHeader("Host", "container.s3.amazonaws.com") .addHeader("Host", "container.s3.amazonaws.com")
.addHeader("Date", "Thu, 05 Jun 2008 16:38:19 GMT") .addHeader("Date", "Thu, 05 Jun 2008 16:38:19 GMT")
.addHeader("Authorization", "AWS identity:j9Dy/lmmvlCKjA4lkqZenLxMkR4=").build(); .addHeader("Authorization", "AWS identity:j9Dy/lmmvlCKjA4lkqZenLxMkR4=").build();
@ -98,6 +99,7 @@ public class S3BlobSignerExpectTest extends BaseBlobSignerExpectTest {
protected HttpRequest putBlobWithTime() { protected HttpRequest putBlobWithTime() {
return HttpRequest.builder().method("PUT") return HttpRequest.builder().method("PUT")
.endpoint("https://container.s3.amazonaws.com/name") .endpoint("https://container.s3.amazonaws.com/name")
.addHeader("Expect", "100-continue")
.addHeader("Host", "container.s3.amazonaws.com") .addHeader("Host", "container.s3.amazonaws.com")
.addHeader("Date", "Thu, 05 Jun 2008 16:38:19 GMT") .addHeader("Date", "Thu, 05 Jun 2008 16:38:19 GMT")
.addHeader("Authorization", "AWS identity:0uvBv1wEskuhFHYJF/L6kEV9A7o=").build(); .addHeader("Authorization", "AWS identity:0uvBv1wEskuhFHYJF/L6kEV9A7o=").build();

View File

@ -105,7 +105,7 @@ public class AWSS3AsyncClientTest extends S3AsyncClientTest<AWSS3AsyncClient> {
blobToS3Object.apply(BindBlobToMultipartFormTest.TEST_BLOB))); blobToS3Object.apply(BindBlobToMultipartFormTest.TEST_BLOB)));
assertRequestLineEquals(request, "PUT https://bucket." + url + "/hello HTTP/1.1"); assertRequestLineEquals(request, "PUT https://bucket." + url + "/hello HTTP/1.1");
assertNonPayloadHeadersEqual(request, "Host: bucket." + url + "\n"); assertNonPayloadHeadersEqual(request, "Expect: 100-continue\nHost: bucket." + url + "\n");
assertPayloadEquals(request, "hello", "text/plain", false); assertPayloadEquals(request, "hello", "text/plain", false);
assertResponseParserClassEquals(method, request, ParseETagHeader.class); assertResponseParserClassEquals(method, request, ParseETagHeader.class);

View File

@ -73,6 +73,7 @@ public class AWSS3ClientExpectTest extends BaseAWSS3ClientExpectTest {
HttpRequest.builder() HttpRequest.builder()
.method("PUT") .method("PUT")
.endpoint("https://test.s3-eu-west-1.amazonaws.com/test") .endpoint("https://test.s3-eu-west-1.amazonaws.com/test")
.addHeader("Expect", "100-continue")
.addHeader("x-amz-storage-class", "REDUCED_REDUNDANCY") .addHeader("x-amz-storage-class", "REDUCED_REDUNDANCY")
.addHeader("Host", "test.s3-eu-west-1.amazonaws.com") .addHeader("Host", "test.s3-eu-west-1.amazonaws.com")
.addHeader("Date", CONSTANT_DATE) .addHeader("Date", CONSTANT_DATE)