I'm calling putBlob to put a blob to an S3 ninja server. The server is returning a ridiculous 500 server error response page - it contains a ton of javascript and the jclouds SAX parser is choking on the content of a <script> tag (not surprising). The parser exception is properly caught in AWSUtils.parseAWSErrorFromContent, where it logs the issue and returns null for the AWSError. Tracing it up the stack a bit, we get to BaseHttpCommandExecutorService.shouldContinue, where it properly interprets false from the retryHandler.shouldRetryRequest method as "nope" and (again properly) calls errorHandler.handleError(command, response).
However, errorHandler.handleError isn't actually doing anything visible from my perspective as the guy who calls putBlob. The return value of putBlob is supposed to be the etag for services that provide an etag in the response or null otherwise. So there's no way I can tell I got an error from looking at the return value (is there)? I would have assumed that errorHandler (which ends up being serverErrorHandler via DelegatingErrorHandler) .handleError would end up throwing an exception that I could catch in my code. FYI - here's my client code: try (InputStream is = new ByteBufferBackedInputStream(content)) { BlobStore blobStore = context.getBlobStore(); BlobBuilder.PayloadBlobBuilder blobBuilder = blobStore.blobBuilder(key).payload(is); // set content-md5 to allow the server to validate the uploaded data byte[] checksum = meta.getChecksum(); if (checksum != null) { blobBuilder.contentMD5(HashCode.fromBytes(checksum)); } // set content-length so the server knows when to stop reading long contentLength = content.remaining(); Blob blob = blobBuilder.contentLength(contentLength) .userMetadata(meta.getUserMeta()).build(); // upload it - ignore etag - we provided checksum in metadata - server will validate blobStore.putBlob(cspInfo.getContainer(), blob); return true; } catch (ContainerNotFoundException ex) { log.error("upload cloud object {} failed; container not found: ", key, ex); return false; } catch (Exception ex) { log.error("upload cloud object {} failed due to {}; retrying {} more times: {}", key, ex, retries, Throwables.getStackTraceAsString(ex)); content.reset(); } As you can see, I catch everything, and I'm not catching anything here. I'm using jclouds 2.1.0, btw. Thanks, John