mirror of https://github.com/apache/jclouds.git
s3: explicitly set Expect header on methods that need it
This commit is contained in:
parent
2c3c3fad52
commit
1c2090fd08
|
@ -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,
|
||||||
|
|
|
@ -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")
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue