diff --git a/org.eclipse.jgit.http.apache/src/org/eclipse/jgit/transport/http/apache/HttpClientConnection.java b/org.eclipse.jgit.http.apache/src/org/eclipse/jgit/transport/http/apache/HttpClientConnection.java index a0eeef89f..2d9d17a89 100644 --- a/org.eclipse.jgit.http.apache/src/org/eclipse/jgit/transport/http/apache/HttpClientConnection.java +++ b/org.eclipse.jgit.http.apache/src/org/eclipse/jgit/transport/http/apache/HttpClientConnection.java @@ -226,17 +226,25 @@ public String getResponseMessage() throws IOException { } private void execute() throws IOException, ClientProtocolException { - if (resp == null) - if (entity != null) { - if (req instanceof HttpEntityEnclosingRequest) { - HttpEntityEnclosingRequest eReq = (HttpEntityEnclosingRequest) req; - eReq.setEntity(entity); - } - resp = getClient().execute(req); - entity.getBuffer().close(); - entity = null; - } else - resp = getClient().execute(req); + if (resp != null) { + return; + } + + if (entity == null) { + resp = getClient().execute(req); + return; + } + + try { + if (req instanceof HttpEntityEnclosingRequest) { + HttpEntityEnclosingRequest eReq = (HttpEntityEnclosingRequest) req; + eReq.setEntity(entity); + } + resp = getClient().execute(req); + } finally { + entity.close(); + entity = null; + } } public Map> getHeaderFields() { diff --git a/org.eclipse.jgit.http.apache/src/org/eclipse/jgit/transport/http/apache/TemporaryBufferEntity.java b/org.eclipse.jgit.http.apache/src/org/eclipse/jgit/transport/http/apache/TemporaryBufferEntity.java index 1ff168e23..377e5ca57 100644 --- a/org.eclipse.jgit.http.apache/src/org/eclipse/jgit/transport/http/apache/TemporaryBufferEntity.java +++ b/org.eclipse.jgit.http.apache/src/org/eclipse/jgit/transport/http/apache/TemporaryBufferEntity.java @@ -55,7 +55,8 @@ * * @since 3.3 */ -public class TemporaryBufferEntity extends AbstractHttpEntity { +public class TemporaryBufferEntity extends AbstractHttpEntity + implements AutoCloseable { private TemporaryBuffer buffer; private Integer contentLength; @@ -106,4 +107,16 @@ public boolean isStreaming() { public void setContentLength(int 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(); + } + } }