fix bugs found by pvdyck blind usage of content on HEAD requests and throwing away data on generation of uri

git-svn-id: http://jclouds.googlecode.com/svn/trunk@2738 3d8758e0-26b5-11de-8745-db77d3ebf521
This commit is contained in:
adrian.f.cole 2010-01-29 23:39:47 +00:00
parent 01ad08dfc2
commit 2b3d2b0c48
6 changed files with 53 additions and 42 deletions

View File

@ -64,16 +64,21 @@ public class AtmosStorageClientErrorRetryHandler implements HttpRetryHandler {
return true;
} else if (response.getStatusCode() == 409 || response.getStatusCode() == 400) {
byte[] content = HttpUtils.closeClientButKeepContentStream(response);
try {
AtmosStorageError error = utils.parseAtmosStorageErrorFromContent(command, response,
new String(content));
if (error.getCode() == 1016) {
return backoffHandler.shouldRetryRequest(command, response);
// Content can be null in the case of HEAD requests
if (content != null) {
try {
AtmosStorageError error = utils.parseAtmosStorageErrorFromContent(command, response,
new String(content));
if (error.getCode() == 1016) {
return backoffHandler.shouldRetryRequest(command, response);
}
// don't increment count before here, since backoff handler does already
command.incrementFailureCount();
} catch (HttpException e) {
logger.warn(e, "error parsing response: %s", new String(content));
}
// don't increment count before here, since backoff handler does already
} else {
command.incrementFailureCount();
} catch (HttpException e) {
logger.warn(e, "error parsing response: %s", new String(content));
}
return true;
}

View File

@ -61,15 +61,19 @@ public class AWSClientErrorRetryHandler implements HttpRetryHandler {
|| response.getStatusCode() == 409) {
byte[] content = HttpUtils.closeClientButKeepContentStream(response);
command.incrementFailureCount();
try {
AWSError error = utils.parseAWSErrorFromContent(command, response, new String(content));
if ("RequestTimeout".equals(error.getCode())
|| "OperationAborted".equals(error.getCode())
|| "SignatureDoesNotMatch".equals(error.getCode())) {
return true;
// Content can be null in the case of HEAD requests
if (content != null) {
try {
AWSError error = utils.parseAWSErrorFromContent(command, response, new String(
content));
if ("RequestTimeout".equals(error.getCode())
|| "OperationAborted".equals(error.getCode())
|| "SignatureDoesNotMatch".equals(error.getCode())) {
return true;
}
} catch (HttpException e) {
logger.warn(e, "error parsing response: %s", new String(content));
}
} catch (HttpException e) {
logger.warn(e, "error parsing response: %s", new String(content));
}
}
return false;

View File

@ -72,16 +72,19 @@ public class AzureBlobClientErrorRetryHandler implements HttpRetryHandler {
retryCountLimit, command);
return false;
} else if (response.getStatusCode() == 409) {
try {
AzureStorageError error = utils.parseAzureStorageErrorFromContent(command, response,
new ByteArrayInputStream(content));
if ("ContainerBeingDeleted".equals(error.getCode())) {
backoffHandler.imposeBackoffExponentialDelay(100L, 3, command.getFailureCount(),
command.toString());
return true;
// Content can be null in the case of HEAD requests
if (content != null) {
try {
AzureStorageError error = utils.parseAzureStorageErrorFromContent(command, response,
new ByteArrayInputStream(content));
if ("ContainerBeingDeleted".equals(error.getCode())) {
backoffHandler.imposeBackoffExponentialDelay(100L, 3, command.getFailureCount(),
command.toString());
return true;
}
} catch (HttpException e) {
logger.warn(e, "error parsing response: %s", new String(content));
}
} catch (HttpException e) {
logger.warn(e, "error parsing response: %s", new String(content));
}
}
return false;

View File

@ -46,40 +46,40 @@ public class HttpRequest extends HttpMessage {
/**
*
* @param endPoint
* @param endpoint
* This may change over the life of the request due to redirects.
* @param method
* If the request is HEAD, this may change to GET due to redirects
*/
public HttpRequest(String method, URI endPoint) {
public HttpRequest(String method, URI endpoint) {
this.setMethod(checkNotNull(method, "method"));
this.setEndpoint(checkNotNull(endPoint, "endPoint"));
checkArgument(endPoint.getHost() != null, String.format("endPoint.getHost() is null for %s",
endPoint));
this.setEndpoint(checkNotNull(endpoint, "endpoint"));
checkArgument(endpoint.getHost() != null, String.format("endpoint.getHost() is null for %s",
endpoint));
}
/**
*
* @param endPoint
* @param endpoint
* This may change over the life of the request due to redirects.
* @param method
* If the request is HEAD, this may change to GET due to redirects
*/
public HttpRequest(String method, URI endPoint, Multimap<String, String> headers) {
this(method, endPoint);
public HttpRequest(String method, URI endpoint, Multimap<String, String> headers) {
this(method, endpoint);
getHeaders().putAll(checkNotNull(headers, "headers"));
}
/**
*
* @param endPoint
* @param endpoint
* This may change over the life of the request due to redirects.
* @param method
* If the request is HEAD, this may change to GET due to redirects
*/
protected HttpRequest(String method, URI endPoint, Multimap<String, String> headers,
protected HttpRequest(String method, URI endpoint, Multimap<String, String> headers,
@Nullable Payload payload) {
this(method, endPoint);
this(method, endpoint);
getHeaders().putAll(checkNotNull(headers, "headers"));
setPayload(payload);
}

View File

@ -40,9 +40,9 @@ public class GeneratedHttpRequest<T> extends HttpRequest {
private final Object[] args;
private final RestAnnotationProcessor<T> processor;
GeneratedHttpRequest(String method, URI endPoint, RestAnnotationProcessor<T> processor,
GeneratedHttpRequest(String method, URI endpoint, RestAnnotationProcessor<T> processor,
Class<T> declaring, Method javaMethod, Object... args) {
super(method, endPoint);
super(method, endpoint);
this.processor = processor;
this.declaring = declaring;
this.javaMethod = javaMethod;

View File

@ -61,12 +61,12 @@ import org.jclouds.http.HttpRequest;
import org.jclouds.http.HttpRequestFilter;
import org.jclouds.http.HttpResponse;
import org.jclouds.http.HttpUtils;
import org.jclouds.http.functions.CloseContentAndReturn;
import org.jclouds.http.functions.ParseSax;
import org.jclouds.http.functions.ParseURIFromListOrLocationHeaderIf20x;
import org.jclouds.http.functions.ReturnInputStream;
import org.jclouds.http.functions.ReturnStringIf200;
import org.jclouds.http.functions.ReturnTrueIf2xx;
import org.jclouds.http.functions.CloseContentAndReturn;
import org.jclouds.http.functions.ParseSax.HandlerWithResult;
import org.jclouds.http.options.HttpRequestOptions;
import org.jclouds.logging.Logger;
@ -360,16 +360,15 @@ public class RestAnnotationProcessor<T> {
builder.replaceQuery(makeQueryLine(queryParams, null, skips));
}
URI endPoint;
try {
endPoint = builder.buildFromEncodedMap(convertUnsafe(tokenValues));
endpoint = builder.buildFromEncodedMap(convertUnsafe(tokenValues));
} catch (IllegalArgumentException e) {
throw new IllegalStateException(e);
} catch (UriBuilderException e) {
throw new IllegalStateException(e);
}
GeneratedHttpRequest<T> request = new GeneratedHttpRequest<T>(httpMethod, endPoint, this,
GeneratedHttpRequest<T> request = new GeneratedHttpRequest<T>(httpMethod, endpoint, this,
declaring, method, args);
addHostHeaderIfAnnotatedWithVirtualHost(headers, request.getEndpoint().getHost(), method);
addFiltersIfAnnotated(method, request);