From ebc4570941a312b5c6d514b3e9636335a9b64aab Mon Sep 17 00:00:00 2001 From: Moxie Marlinspike Date: Wed, 29 Jul 2015 12:36:03 -0700 Subject: [PATCH] Fix federated client connection leak. // FREEBIE --- .../federation/FederatedClient.java | 28 +++++++++++++------ 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/whispersystems/textsecuregcm/federation/FederatedClient.java b/src/main/java/org/whispersystems/textsecuregcm/federation/FederatedClient.java index 3960b8046..10b0584f1 100644 --- a/src/main/java/org/whispersystems/textsecuregcm/federation/FederatedClient.java +++ b/src/main/java/org/whispersystems/textsecuregcm/federation/FederatedClient.java @@ -25,6 +25,7 @@ import org.apache.http.conn.ssl.DefaultHostnameVerifier; import org.apache.http.conn.ssl.SSLConnectionSocketFactory; import org.bouncycastle.openssl.PEMReader; import org.glassfish.jersey.client.ClientProperties; +import org.glassfish.jersey.client.RequestEntityProcessing; import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -168,11 +169,14 @@ public class FederatedClient { public void sendMessages(String source, long sourceDeviceId, String destination, IncomingMessageList messages) throws IOException { + Response response = null; + try { - Response response = client.target(peer.getUrl()) - .path(String.format(RELAY_MESSAGE_PATH, source, sourceDeviceId, destination)) - .request() - .put(Entity.entity(messages, MediaType.APPLICATION_JSON_TYPE)); + response = client.target(peer.getUrl()) + .path(String.format(RELAY_MESSAGE_PATH, source, sourceDeviceId, destination)) + .request() + .property(ClientProperties.REQUEST_ENTITY_PROCESSING, RequestEntityProcessing.BUFFERED) + .put(Entity.entity(messages, MediaType.APPLICATION_JSON_TYPE)); if (response.getStatus() != 200 && response.getStatus() != 204) { throw new WebApplicationException(response); @@ -181,18 +185,22 @@ public class FederatedClient { } catch (ProcessingException e) { logger.warn("sendMessage", e); throw new IOException(e); + } finally { + if (response != null) response.close(); } } public void sendDeliveryReceipt(String source, long sourceDeviceId, String destination, long messageId) throws IOException { + Response response = null; + try { - Response response = client.target(peer.getUrl()) - .path(String.format(RECEIPT_PATH, source, sourceDeviceId, destination, messageId)) - .request() - .property(ClientProperties.SUPPRESS_HTTP_COMPLIANCE_VALIDATION, true) - .put(Entity.entity("", MediaType.APPLICATION_JSON_TYPE)); + response = client.target(peer.getUrl()) + .path(String.format(RECEIPT_PATH, source, sourceDeviceId, destination, messageId)) + .request() + .property(ClientProperties.SUPPRESS_HTTP_COMPLIANCE_VALIDATION, true) + .put(Entity.entity("", MediaType.APPLICATION_JSON_TYPE)); if (response.getStatus() != 200 && response.getStatus() != 204) { throw new WebApplicationException(response); @@ -200,6 +208,8 @@ public class FederatedClient { } catch (ProcessingException e) { logger.warn("sendMessage", e); throw new IOException(e); + } finally { + if (response != null) response.close(); } }