@Override public ReadResponse readBlock(ReadRequest request) { ReadResponse ret = new ReadResponse(); if (remoteClient == null) { throw new IllegalStateException( String.format( "%s missing %s", getClass().getSimpleName(), RemoteClient.class.getSimpleName())); } ret.setRequest(request); String uri = remoteClient.getURI(String.format("%s/%s", Constants.FILE_PATH, request.getFileName())); WebResource webResource = remoteClient .getClient() .resource(uri) .queryParam(Constants.OFFSET_PARAM, String.valueOf(request.getOffset())) .queryParam(Constants.BLOCK_SIZE_PARAM, String.valueOf(request.getBlockSize())); logger.debug(webResource.toString()); Builder builder = webResource.accept(MediaType.APPLICATION_OCTET_STREAM); if (FileUtils.isCompress()) { builder = builder.header(Constants.CONTENT_ENCODED_HEADER, Constants.DEFLATE); } ClientResponse clientResponse = builder.get(ClientResponse.class); try { remoteClient.checkForException(clientResponse); if (clientResponse.getStatus() != HttpStatus.OK_200) { throw new ErrorReadingBlockException( String.format( "Failed GET %s: HttpStatus: %d/%s", uri, clientResponse.getStatus(), clientResponse.getStatusInfo())); } logger.debug(clientResponse.getHeaders().toString()); ret.setLength( Integer.parseInt(clientResponse.getHeaders().getFirst(Constants.LENGTH_HEADER))); int contentLength = Integer.parseInt(clientResponse.getHeaders().getFirst("Content-Length")); byte[] block = null; int compressed = -1; if (clientResponse.getHeaders().containsKey(Constants.COMPRESSED_HEADER)) { compressed = Integer.parseInt(clientResponse.getHeaders().getFirst(Constants.COMPRESSED_HEADER)); if (contentLength != compressed) { throw new ErrorReadingBlockException( String.format( "Failed GET %s: Compressed Content-Length: %d/%s", uri, contentLength, compressed)); } Inflated inflated = CompressionUtils.inflate(getDataByEntity(clientResponse, compressed), ret.getLength()); if (inflated == null || inflated.getLength() != ret.getLength()) { throw new ErrorInflatingBlockException("Error inflating compressed read response"); } block = inflated.getData(); } else { if (contentLength != ret.getLength()) { throw new ErrorReadingBlockException( String.format( "Failed GET %s: Content-Length: %d/%s", uri, contentLength, ret.getLength())); } block = getDataByEntity(clientResponse, ret.getLength()); } ret.setCrc32(Long.parseLong(clientResponse.getHeaders().getFirst(Constants.CRC_HEADER))); ret.setEof(Boolean.parseBoolean(clientResponse.getHeaders().getFirst(Constants.EOF_HEADER))); ret.setSuccess( Boolean.parseBoolean(clientResponse.getHeaders().getFirst(Constants.SUCCESS_HEADER))); ret.setData(block); } finally { clientResponse.close(); } return ret; }