Fix connection leak for smart http connections

SmartHttpPushConnection: close InputStream and OutputStream after
processing. Wrap IOExceptions which aren't TransportExceptions already
as a TransportException.

Also-By: Matthias Sohn <matthias.sohn@sap.com>
Change-Id: I8e11d899672fc470c390a455dc86367e92ef9076
This commit is contained in:
Saša Živkov 2022-06-03 16:36:43 +02:00 committed by Matthias Sohn
parent c6b0ee04e4
commit 011c26ff36
1 changed files with 23 additions and 11 deletions

View File

@ -1294,13 +1294,18 @@ class SmartHttpFetchConnection extends BasePackFetchConnection {
} }
@Override @Override
protected void doFetch(final ProgressMonitor monitor, protected void doFetch(ProgressMonitor monitor, Collection<Ref> want,
final Collection<Ref> want, final Set<ObjectId> have, Set<ObjectId> have, OutputStream outputStream)
final OutputStream outputStream) throws TransportException { throws TransportException {
try { svc = new MultiRequestService(SVC_UPLOAD_PACK);
svc = new MultiRequestService(SVC_UPLOAD_PACK); try (InputStream svcIn = svc.getInputStream();
init(svc.getInputStream(), svc.getOutputStream()); OutputStream svcOut = svc.getOutputStream()) {
init(svcIn, svcOut);
super.doFetch(monitor, want, have, outputStream); super.doFetch(monitor, want, have, outputStream);
} catch (TransportException e) {
throw e;
} catch (IOException e) {
throw new TransportException(e.getMessage(), e);
} finally { } finally {
svc = null; svc = null;
} }
@ -1324,12 +1329,19 @@ class SmartHttpPushConnection extends BasePackPushConnection {
} }
@Override @Override
protected void doPush(final ProgressMonitor monitor, protected void doPush(ProgressMonitor monitor,
final Map<String, RemoteRefUpdate> refUpdates, Map<String, RemoteRefUpdate> refUpdates,
OutputStream outputStream) throws TransportException { OutputStream outputStream) throws TransportException {
final Service svc = new MultiRequestService(SVC_RECEIVE_PACK); Service svc = new MultiRequestService(SVC_RECEIVE_PACK);
init(svc.getInputStream(), svc.getOutputStream()); try (InputStream svcIn = svc.getInputStream();
super.doPush(monitor, refUpdates, outputStream); OutputStream svcOut = svc.getOutputStream()) {
init(svcIn, svcOut);
super.doPush(monitor, refUpdates, outputStream);
} catch (TransportException e) {
throw e;
} catch (IOException e) {
throw new TransportException(e.getMessage(), e);
}
} }
} }