Fix HttpClientConnection leaking temporary buffer files

HttpClientConnection uses a TemporaryBufferEntity which uses
TemporaryBuffer.LocalFile to buffer an HttpEntity. It was leaking
temporary files if the buffered entities were larger than 1MB since it
failed to destroy the TemporaryBuffer.LocalFile.

Bug: 500079
Change-Id: Ib963e04efc252bdd0420a5c69b1a19181e9e6169
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
This commit is contained in:
Matthias Sohn 2016-08-24 14:08:00 +02:00
parent b8260b5e79
commit 20d3f83f27
2 changed files with 33 additions and 12 deletions

View File

@ -226,17 +226,25 @@ public String getResponseMessage() throws IOException {
} }
private void execute() throws IOException, ClientProtocolException { private void execute() throws IOException, ClientProtocolException {
if (resp == null) if (resp != null) {
if (entity != null) { return;
if (req instanceof HttpEntityEnclosingRequest) { }
HttpEntityEnclosingRequest eReq = (HttpEntityEnclosingRequest) req;
eReq.setEntity(entity); if (entity == null) {
} resp = getClient().execute(req);
resp = getClient().execute(req); return;
entity.getBuffer().close(); }
entity = null;
} else try {
resp = getClient().execute(req); if (req instanceof HttpEntityEnclosingRequest) {
HttpEntityEnclosingRequest eReq = (HttpEntityEnclosingRequest) req;
eReq.setEntity(entity);
}
resp = getClient().execute(req);
} finally {
entity.close();
entity = null;
}
} }
public Map<String, List<String>> getHeaderFields() { public Map<String, List<String>> getHeaderFields() {

View File

@ -55,7 +55,8 @@
* *
* @since 3.3 * @since 3.3
*/ */
public class TemporaryBufferEntity extends AbstractHttpEntity { public class TemporaryBufferEntity extends AbstractHttpEntity
implements AutoCloseable {
private TemporaryBuffer buffer; private TemporaryBuffer buffer;
private Integer contentLength; private Integer contentLength;
@ -106,4 +107,16 @@ public boolean isStreaming() {
public void setContentLength(int contentLength) { public void setContentLength(int contentLength) {
this.contentLength = new Integer(contentLength); this.contentLength = new Integer(contentLength);
} }
/**
* Close destroys the associated buffer used to buffer the entity
*
* @since 4.5
*/
@Override
public void close() {
if (buffer != null) {
buffer.destroy();
}
}
} }