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;
import static com.google.common.net.HttpHeaders.EXPECT;
import static org.jclouds.blobstore.attr.BlobScopes.CONTAINER;
import java.util.Set;
@ -168,6 +169,7 @@ public interface S3AsyncClient {
@Named("PutObject")
@PUT
@Path("/{key}")
@Headers(keys = EXPECT, values = "100-continue")
@ResponseParser(ParseETagHeader.class)
ListenableFuture<String> putObject(
@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")
.endpoint("https://s3.amazonaws.com/bucket/object")
.addHeader("Expect", "100-continue")
.addHeader("Date", CONSTANT_DATE)
.addHeader("Authorization", "AWS identity:6gC0m7SYFDPwkUqY5EHV/6i9DfM=")
.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.ETAG;
import static com.google.common.net.HttpHeaders.EXPECT;
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.testng.Assert.assertEquals;
@ -46,7 +49,7 @@ import com.google.mockwebserver.RecordedRequest;
*
* @author Adrian Cole
*/
@Test
@Test(singleThreaded = true)
public class S3ClientMockTest {
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) {
Properties overrides = new Properties();
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")
.credentials("accessKey", "secretKey")
.endpoint(server.toString())
@ -79,6 +84,8 @@ public class S3ClientMockTest {
RecordedRequest request = server.takeRequest();
assertEquals(request.getRequestLine(), "PUT /bucket/object HTTP/1.1");
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();
}
@ -90,12 +97,14 @@ public class S3ClientMockTest {
S3Client client = getContext(server.getUrl("/")).getApi();
S3Object fileInDir = client.newS3Object();
fileInDir.getMetadata().setKey("someDir/fileName");
fileInDir.setPayload(new byte[] {});
fileInDir.setPayload(new byte[] { 1, 2, 3, 4 });
assertEquals(client.putObject("bucket", fileInDir), "ABCDEF");
RecordedRequest request = server.takeRequest();
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();
}

View File

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

View File

@ -105,7 +105,7 @@ public class AWSS3AsyncClientTest extends S3AsyncClientTest<AWSS3AsyncClient> {
blobToS3Object.apply(BindBlobToMultipartFormTest.TEST_BLOB)));
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);
assertResponseParserClassEquals(method, request, ParseETagHeader.class);

View File

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