public static void endEntityViaReflection(HttpEntity entity) { if (entity instanceof HttpEntityWrapper) { Field f = null; try { for (Field ff : HttpEntityWrapper.class.getDeclaredFields()) { if (ff.getName().equals("wrappedEntity")) { f = ff; break; } } if (f != null) { f.setAccessible(true); HttpEntity wrapped = (HttpEntity) f.get(entity); if (wrapped != null) { wrapped.consumeContent(); } } } catch (Throwable t) { Log.e(LOG_TAG, "wrappedEntity consume", t); } } }
/** * This horrible hack is required on Android, due to implementation of BasicManagedEntity, which * doesn't chain call consumeContent on underlying wrapped HttpEntity * * @param entity HttpEntity, may be null */ public static void endEntityViaReflection(HttpEntity entity) { if (entity instanceof HttpEntityWrapper) { try { Field f = null; Field[] fields = HttpEntityWrapper.class.getDeclaredFields(); for (Field ff : fields) { if (ff.getName().equals("wrappedEntity")) { f = ff; break; } } if (f != null) { f.setAccessible(true); HttpEntity wrapped = (HttpEntity) f.get(entity); if (wrapped != null) { wrapped.consumeContent(); } } } catch (Throwable t) { Log.e(LOG_TAG, "wrappedEntity consume", t); } } }
/** * This horrible hack is required on Android, due to implementation of * BasicManagedEntity, which doesn't chain call consumeContent on underlying * wrapped HttpEntity * * @param entity HttpEntity, may be null */ public static void endEntityViaReflection(HttpEntity entity) { if (entity instanceof HttpEntityWrapper) { try { Field f = null; Field[] fields = HttpEntityWrapper.class.getDeclaredFields(); for (Field ff : fields) { if (ff.getName().equals("wrappedEntity")) { f = ff; break; } } if (f != null) { f.setAccessible(true); HttpEntity wrapped = (HttpEntity) f.get(entity); if (wrapped != null) { wrapped.consumeContent(); } } } catch (Throwable t) { t.printStackTrace(); } } }
/** * This horrible hack is required on Android, due to implementation of BasicManagedEntity, which * doesn't chain call consumeContent on underlying wrapped HttpEntity * * @param httpEntity HttpEntity, may be null */ public static void endEntityViaReflection(HttpEntity httpEntity) { if (httpEntity instanceof HttpEntityWrapper) { try { Field f = null; Field[] fields = HttpEntityWrapper.class.getDeclaredFields(); for (Field ff : fields) { if (ff.getName().equals("wrappedEntity")) { f = ff; break; } } if (f != null) { f.setAccessible(true); HttpEntity wrapped = (HttpEntity) f.get(httpEntity); if (wrapped != null) { wrapped.consumeContent(); } } } catch (Throwable t) { Log.e(LOG_TAG, "wrappedEntity consume", t); } } }
/** * This horrible hack is required on Android, due to implementation of BasicManagedEntity, which * doesn't chain call consumeContent on underlying wrapped HttpEntity * * @param entity HttpEntity, may be null */ public void consumeEntityContent(HttpEntity entity) { try { // Close the InputStream and release the resources by "consuming the content". if (entity instanceof HttpEntityWrapper) { Field f = null; Field[] fields = HttpEntityWrapper.class.getDeclaredFields(); for (Field ff : fields) { if (ff.getName().equals("wrappedEntity")) { f = ff; break; } } if (f != null) { f.setAccessible(true); HttpEntity wrapped = (HttpEntity) f.get(entity); if (wrapped != null) { wrapped.consumeContent(); if (HttpLog.isPrint) { HttpLog.d(TAG, "HttpEntity wrappedEntity reflection consumeContent"); } } } } else { entity.consumeContent(); } } catch (Throwable t) { HttpLog.e(TAG, "wrappedEntity consume error. ", t); } }
private void overrideContentEncoding(HttpResponse response) { HttpEntity wrapped = new HttpEntityWrapper(response.getEntity()) { @Override public Header getContentEncoding() { return null; } }; response.setEntity(wrapped); }
@Override public void process(HttpResponse response, final HttpContext context) throws HttpException, IOException { final HttpEntity entity = response.getEntity(); // Only Json protocol has this header, we only wrap CRC32ChecksumCalculatingInputStream in json protocol clients. Header[] headers = response.getHeaders("x-amz-crc32"); if (entity == null || headers == null || headers.length == 0) { return; } HttpEntity crc32ResponseEntity = new HttpEntityWrapper(entity) { private final InputStream content = new CRC32ChecksumCalculatingInputStream( wrappedEntity.getContent()); @Override public InputStream getContent() throws IOException { return content; } /** * It's important to override writeTo. Some versions of Apache HTTP * client use writeTo for {@link org.apache.http.entity.BufferedHttpEntity} * and the default implementation just delegates to the wrapped entity * which completely bypasses our CRC32 calculating input stream. The * {@link org.apache.http.entity.BufferedHttpEntity} is used for the * request timeout and client execution timeout features. * * @see <a href="https://github.com/aws/aws-sdk-java/issues/526">Issue #526</a> * * @param outstream OutputStream to write contents to */ @Override public void writeTo(OutputStream outstream) throws IOException { try { IOUtils.copy(this.getContent(), outstream); } finally { this.getContent().close(); } } }; response.setEntity(crc32ResponseEntity); context.setAttribute(CRC32ChecksumCalculatingInputStream.class.getName(), crc32ResponseEntity.getContent()); }