mirror of https://github.com/apache/jclouds.git
HttpResponse now requires the corresponding request's URL in its constructor, so the response's S3Object key name can be reconstituted. A better approach may be to associate the entire HttpRequest object with the related HttpResponse?
git-svn-id: http://jclouds.googlecode.com/svn/trunk@1620 3d8758e0-26b5-11de-8745-db77d3ebf521
This commit is contained in:
parent
d8557f6d89
commit
f9cd7e19d9
|
@ -57,8 +57,12 @@ public class ParseMetadataFromHeaders implements Function<HttpResponse, S3Object
|
||||||
* {@link org.jclouds.aws.s3.domain.S3Object.Metadata} object.
|
* {@link org.jclouds.aws.s3.domain.S3Object.Metadata} object.
|
||||||
*/
|
*/
|
||||||
public Metadata apply(HttpResponse from) {
|
public Metadata apply(HttpResponse from) {
|
||||||
|
String objectKey = from.getRequestURL().getPath();
|
||||||
S3Object.Metadata to = new S3Object.Metadata("TODO");
|
if (objectKey.startsWith("/")) {
|
||||||
|
// Trim initial slash from object key name.
|
||||||
|
objectKey = objectKey.substring(1);
|
||||||
|
}
|
||||||
|
S3Object.Metadata to = new S3Object.Metadata(objectKey);
|
||||||
addAllHeadersTo(from, to);
|
addAllHeadersTo(from, to);
|
||||||
|
|
||||||
addUserMetadataTo(from, to);
|
addUserMetadataTo(from, to);
|
||||||
|
|
|
@ -31,6 +31,9 @@ import java.io.File;
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
import java.net.MalformedURLException;
|
||||||
|
import java.net.URI;
|
||||||
|
import java.net.URL;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -411,7 +414,14 @@ public class StubS3Connection implements S3Connection {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void throwResponseException(int code) throws ExecutionException {
|
private void throwResponseException(int code) throws ExecutionException {
|
||||||
HttpResponse response = new HttpResponse();
|
HttpResponse response = null;
|
||||||
|
try {
|
||||||
|
response = new HttpResponse(new URL("file:///unused")); // TODO: Get real object URL?
|
||||||
|
} catch (MalformedURLException e) {
|
||||||
|
// This shouldn't ever happen.
|
||||||
|
e.printStackTrace();
|
||||||
|
assert false;
|
||||||
|
}
|
||||||
response.setStatusCode(code);
|
response.setStatusCode(code);
|
||||||
throw new ExecutionException(new HttpResponseException(createNiceMock(HttpCommand.class),
|
throw new ExecutionException(new HttpResponseException(createNiceMock(HttpCommand.class),
|
||||||
response));
|
response));
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
package org.jclouds.http;
|
package org.jclouds.http;
|
||||||
|
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
import java.net.URL;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -32,10 +33,15 @@ import java.io.InputStream;
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
*/
|
*/
|
||||||
public class HttpResponse extends HttpMessage {
|
public class HttpResponse extends HttpMessage {
|
||||||
|
private URL requestURL;
|
||||||
private int statusCode;
|
private int statusCode;
|
||||||
private String message;
|
private String message;
|
||||||
private InputStream content;
|
private InputStream content;
|
||||||
|
|
||||||
|
public HttpResponse(URL requestURL) {
|
||||||
|
this.requestURL = requestURL;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
final StringBuilder sb = new StringBuilder();
|
final StringBuilder sb = new StringBuilder();
|
||||||
|
@ -71,4 +77,9 @@ public class HttpResponse extends HttpMessage {
|
||||||
public void setContent(InputStream content) {
|
public void setContent(InputStream content) {
|
||||||
this.content = content;
|
this.content = content;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public URL getRequestURL() {
|
||||||
|
return this.requestURL;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -90,7 +90,7 @@ public class JavaUrlHttpCommandExecutorService extends
|
||||||
protected HttpResponse invoke(HttpURLConnection connection) throws IOException {
|
protected HttpResponse invoke(HttpURLConnection connection) throws IOException {
|
||||||
logger.trace("%s - submitting request %s; %s", connection.getURL().getHost(), connection
|
logger.trace("%s - submitting request %s; %s", connection.getURL().getHost(), connection
|
||||||
.getURL(), connection.getHeaderFields().toString());
|
.getURL(), connection.getHeaderFields().toString());
|
||||||
HttpResponse response = new HttpResponse();
|
HttpResponse response = new HttpResponse(connection.getURL());
|
||||||
InputStream in;
|
InputStream in;
|
||||||
try {
|
try {
|
||||||
in = connection.getInputStream();
|
in = connection.getInputStream();
|
||||||
|
|
|
@ -29,6 +29,7 @@ import static org.testng.Assert.assertTrue;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
|
import java.net.URL;
|
||||||
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.ExecutorService;
|
||||||
import java.util.concurrent.Executors;
|
import java.util.concurrent.Executors;
|
||||||
|
|
||||||
|
@ -100,7 +101,7 @@ public class BackoffLimitedRetryHandlerTest {
|
||||||
void testClosesInputStream() throws InterruptedException, IOException {
|
void testClosesInputStream() throws InterruptedException, IOException {
|
||||||
HttpCommand command = createCommand();
|
HttpCommand command = createCommand();
|
||||||
|
|
||||||
HttpResponse response = new HttpResponse();
|
HttpResponse response = new HttpResponse(new URL("file:///unused"));
|
||||||
InputStream inputStream = new InputStream() {
|
InputStream inputStream = new InputStream() {
|
||||||
boolean isOpen = true;
|
boolean isOpen = true;
|
||||||
|
|
||||||
|
@ -149,9 +150,9 @@ public class BackoffLimitedRetryHandlerTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void testIncrementsFailureCount() throws InterruptedException {
|
void testIncrementsFailureCount() throws InterruptedException, IOException {
|
||||||
HttpCommand command = createCommand();
|
HttpCommand command = createCommand();
|
||||||
HttpResponse response = new HttpResponse();
|
HttpResponse response = new HttpResponse(new URL("file:///unused"));
|
||||||
|
|
||||||
handler.shouldRetryRequest(command, response);
|
handler.shouldRetryRequest(command, response);
|
||||||
assertEquals(command.getFailureCount(), 1);
|
assertEquals(command.getFailureCount(), 1);
|
||||||
|
@ -164,9 +165,9 @@ public class BackoffLimitedRetryHandlerTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void testDisallowsExcessiveRetries() throws InterruptedException {
|
void testDisallowsExcessiveRetries() throws InterruptedException, IOException {
|
||||||
HttpCommand command = createCommand();
|
HttpCommand command = createCommand();
|
||||||
HttpResponse response = new HttpResponse();
|
HttpResponse response = new HttpResponse(new URL("file:///unused"));
|
||||||
|
|
||||||
assertEquals(handler.shouldRetryRequest(command, response), true); // Failure 1
|
assertEquals(handler.shouldRetryRequest(command, response), true); // Failure 1
|
||||||
|
|
||||||
|
|
|
@ -106,8 +106,8 @@ public class GaeHttpCommandExecutorService extends BaseHttpCommandExecutorServic
|
||||||
}
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
protected HttpResponse convert(HTTPResponse gaeResponse) {
|
protected HttpResponse convert(URL requestURL, HTTPResponse gaeResponse) {
|
||||||
HttpResponse response = new HttpResponse();
|
HttpResponse response = new HttpResponse(requestURL);
|
||||||
response.setStatusCode(gaeResponse.getResponseCode());
|
response.setStatusCode(gaeResponse.getResponseCode());
|
||||||
for (HTTPHeader header : gaeResponse.getHeaders()) {
|
for (HTTPHeader header : gaeResponse.getHeaders()) {
|
||||||
response.getHeaders().put(header.getName(), header.getValue());
|
response.getHeaders().put(header.getName(), header.getValue());
|
||||||
|
@ -174,7 +174,7 @@ public class GaeHttpCommandExecutorService extends BaseHttpCommandExecutorServic
|
||||||
HTTPResponse response = urlFetchService.fetch(request);
|
HTTPResponse response = urlFetchService.fetch(request);
|
||||||
logger.info("%1$s - received response code %2$s, headers: %3$s", request.getURL().getHost(),
|
logger.info("%1$s - received response code %2$s, headers: %3$s", request.getURL().getHost(),
|
||||||
response.getResponseCode(), headersAsString(response.getHeaders()));
|
response.getResponseCode(), headersAsString(response.getHeaders()));
|
||||||
return convert(response);
|
return convert(request.getURL(), response);
|
||||||
}
|
}
|
||||||
|
|
||||||
String headersAsString(List<HTTPHeader> headers) {
|
String headersAsString(List<HTTPHeader> headers) {
|
||||||
|
|
|
@ -34,6 +34,7 @@ import java.io.FileOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.MalformedURLException;
|
import java.net.MalformedURLException;
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
|
import java.net.URL;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -79,7 +80,7 @@ public class GaeHttpCommandExecutorServiceTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void testConvertWithHeaders() {
|
void testConvertWithHeaders() throws IOException {
|
||||||
HTTPResponse gaeResponse = createMock(HTTPResponse.class);
|
HTTPResponse gaeResponse = createMock(HTTPResponse.class);
|
||||||
expect(gaeResponse.getResponseCode()).andReturn(200);
|
expect(gaeResponse.getResponseCode()).andReturn(200);
|
||||||
List<HTTPHeader> headers = new ArrayList<HTTPHeader>();
|
List<HTTPHeader> headers = new ArrayList<HTTPHeader>();
|
||||||
|
@ -87,7 +88,7 @@ public class GaeHttpCommandExecutorServiceTest {
|
||||||
expect(gaeResponse.getHeaders()).andReturn(headers);
|
expect(gaeResponse.getHeaders()).andReturn(headers);
|
||||||
expect(gaeResponse.getContent()).andReturn(null).atLeastOnce();
|
expect(gaeResponse.getContent()).andReturn(null).atLeastOnce();
|
||||||
replay(gaeResponse);
|
replay(gaeResponse);
|
||||||
HttpResponse response = client.convert(gaeResponse);
|
HttpResponse response = client.convert(new URL("file:///unused"), gaeResponse);
|
||||||
assertEquals(response.getStatusCode(), 200);
|
assertEquals(response.getStatusCode(), 200);
|
||||||
assertEquals(response.getContent(), null);
|
assertEquals(response.getContent(), null);
|
||||||
assertEquals(response.getHeaders().size(), 1);
|
assertEquals(response.getHeaders().size(), 1);
|
||||||
|
@ -103,7 +104,7 @@ public class GaeHttpCommandExecutorServiceTest {
|
||||||
expect(gaeResponse.getHeaders()).andReturn(headers);
|
expect(gaeResponse.getHeaders()).andReturn(headers);
|
||||||
expect(gaeResponse.getContent()).andReturn("hello".getBytes()).atLeastOnce();
|
expect(gaeResponse.getContent()).andReturn("hello".getBytes()).atLeastOnce();
|
||||||
replay(gaeResponse);
|
replay(gaeResponse);
|
||||||
HttpResponse response = client.convert(gaeResponse);
|
HttpResponse response = client.convert(new URL("file:///unused"), gaeResponse);
|
||||||
assertEquals(response.getStatusCode(), 200);
|
assertEquals(response.getStatusCode(), 200);
|
||||||
assertEquals(IOUtils.toString(response.getContent()), "hello");
|
assertEquals(IOUtils.toString(response.getContent()), "hello");
|
||||||
assertEquals(response.getHeaders().size(), 1);
|
assertEquals(response.getHeaders().size(), 1);
|
||||||
|
|
|
@ -118,8 +118,8 @@ public class NioHttpCommandExecutionHandler implements NHttpRequestExecutionHand
|
||||||
try {
|
try {
|
||||||
HttpCommandRendezvous<?> rendezvous = handle.getCommandRendezvous();
|
HttpCommandRendezvous<?> rendezvous = handle.getCommandRendezvous();
|
||||||
HttpCommand command = rendezvous.getCommand();
|
HttpCommand command = rendezvous.getCommand();
|
||||||
org.jclouds.http.HttpResponse response = NioHttpUtils
|
org.jclouds.http.HttpResponse response = NioHttpUtils.convertToJavaCloudsResponse(
|
||||||
.convertToJavaCloudsResponse(apacheResponse);
|
command.getRequest().getEndpoint().toURL(), apacheResponse);
|
||||||
int statusCode = response.getStatusCode();
|
int statusCode = response.getStatusCode();
|
||||||
// TODO determine how to get the original request here so we don't need to build each
|
// TODO determine how to get the original request here so we don't need to build each
|
||||||
// time
|
// time
|
||||||
|
|
|
@ -27,6 +27,7 @@ import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.UnsupportedEncodingException;
|
import java.io.UnsupportedEncodingException;
|
||||||
|
import java.net.URL;
|
||||||
|
|
||||||
import javax.ws.rs.core.HttpHeaders;
|
import javax.ws.rs.core.HttpHeaders;
|
||||||
|
|
||||||
|
@ -102,9 +103,9 @@ public class NioHttpUtils {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static HttpResponse convertToJavaCloudsResponse(
|
public static HttpResponse convertToJavaCloudsResponse(URL requestURL,
|
||||||
org.apache.http.HttpResponse apacheResponse) throws IOException {
|
org.apache.http.HttpResponse apacheResponse) throws IOException {
|
||||||
HttpResponse response = new HttpResponse();
|
HttpResponse response = new HttpResponse(requestURL);
|
||||||
if (apacheResponse.getEntity() != null) {
|
if (apacheResponse.getEntity() != null) {
|
||||||
response.setContent(apacheResponse.getEntity().getContent());
|
response.setContent(apacheResponse.getEntity().getContent());
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue