From e74f05d287362bf24b471e54e4141dca10e804d2 Mon Sep 17 00:00:00 2001 From: ayuxsh009 <1raj.aayush@gmail.com> Date: Thu, 14 May 2026 23:02:16 +0530 Subject: [PATCH] fix http client leak in getHttpClientResponse Signed-off-by: ayuxsh009 <1raj.aayush@gmail.com> --- .../impl/MosipDeviceSpecificationHelper.java | 41 +++++++++++++++---- ...pDeviceSpecification_095_ProviderImpl.java | 8 +--- .../bio/service/test/BioServiceTest.java | 22 ++++++++++ 3 files changed, 56 insertions(+), 15 deletions(-) diff --git a/registration/registration-services/src/main/java/io/mosip/registration/mdm/service/impl/MosipDeviceSpecificationHelper.java b/registration/registration-services/src/main/java/io/mosip/registration/mdm/service/impl/MosipDeviceSpecificationHelper.java index 1be26c90153..16b12ac034b 100644 --- a/registration/registration-services/src/main/java/io/mosip/registration/mdm/service/impl/MosipDeviceSpecificationHelper.java +++ b/registration/registration-services/src/main/java/io/mosip/registration/mdm/service/impl/MosipDeviceSpecificationHelper.java @@ -34,6 +34,7 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; +import java.io.FilterInputStream; import java.io.IOException; import java.io.InputStream; import java.io.StringWriter; @@ -275,7 +276,7 @@ public String getHttpClientResponseEntity(String url, String method, String body } } - public CloseableHttpResponse getHttpClientResponse(String url, String method, String body) throws IOException { + public InputStream getHttpClientResponse(String url, String method, String body) throws IOException { int timeout = getMDMConnectionTimeout(method); LOGGER.debug("MDM HTTP CALL method : {} with timeout {}", method, timeout); RequestConfig requestConfig = RequestConfig.custom() @@ -284,12 +285,36 @@ public CloseableHttpResponse getHttpClientResponse(String url, String method, St .setConnectionRequestTimeout(timeout) .build(); CloseableHttpClient client = HttpClients.createDefault(); - StringEntity requestEntity = new StringEntity(body, ContentType.create("Content-Type", Consts.UTF_8)); - HttpUriRequest httpUriRequest = RequestBuilder.create(method) - .setConfig(requestConfig) - .setUri(url) - .setEntity(requestEntity) - .build(); - return client.execute(httpUriRequest); + try { + StringEntity requestEntity = new StringEntity(body, ContentType.create("Content-Type", Consts.UTF_8)); + HttpUriRequest httpUriRequest = RequestBuilder.create(method) + .setConfig(requestConfig) + .setUri(url) + .setEntity(requestEntity) + .build(); + CloseableHttpResponse response = client.execute(httpUriRequest); + if (response == null || response.getEntity() == null) { + response.close(); + client.close(); + return null; + } + return new FilterInputStream(response.getEntity().getContent()) { + @Override + public void close() throws IOException { + try { + super.close(); + } finally { + try { + response.close(); + } finally { + client.close(); + } + } + } + }; + } catch (IOException e) { + client.close(); + throw e; + } } } diff --git a/registration/registration-services/src/main/java/io/mosip/registration/mdm/spec_0_9_5/service/impl/MosipDeviceSpecification_095_ProviderImpl.java b/registration/registration-services/src/main/java/io/mosip/registration/mdm/spec_0_9_5/service/impl/MosipDeviceSpecification_095_ProviderImpl.java index 8a56cd71bca..bfc85127d98 100644 --- a/registration/registration-services/src/main/java/io/mosip/registration/mdm/spec_0_9_5/service/impl/MosipDeviceSpecification_095_ProviderImpl.java +++ b/registration/registration-services/src/main/java/io/mosip/registration/mdm/spec_0_9_5/service/impl/MosipDeviceSpecification_095_ProviderImpl.java @@ -14,7 +14,6 @@ import java.util.LinkedList; import java.util.List; -import org.apache.http.client.methods.CloseableHttpResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @@ -138,14 +137,9 @@ public InputStream stream(MdmBioDevice bioDevice, String modality) throws RegBas timeout); String request = objectMapper.writeValueAsString(streamRequestDTO); - CloseableHttpResponse response = mosipDeviceSpecificationHelper.getHttpClientResponse( + InputStream urlStream = mosipDeviceSpecificationHelper.getHttpClientResponse( bioDevice.getCallbackId() + MosipBioDeviceConstants.STREAM_ENDPOINT, "STREAM", request); - InputStream urlStream = null; - if (response != null && response.getEntity() != null) { - urlStream = response.getEntity().getContent(); - } - try { byte[] byteArray = mosipDeviceSpecificationHelper.getJPEGByteArray(urlStream, System.currentTimeMillis() + Long.parseLong(timeout)); diff --git a/registration/registration-services/src/test/java/io/mosip/registration/bio/service/test/BioServiceTest.java b/registration/registration-services/src/test/java/io/mosip/registration/bio/service/test/BioServiceTest.java index 88f7c1673ec..4edb369126f 100644 --- a/registration/registration-services/src/test/java/io/mosip/registration/bio/service/test/BioServiceTest.java +++ b/registration/registration-services/src/test/java/io/mosip/registration/bio/service/test/BioServiceTest.java @@ -132,6 +132,28 @@ public void buildUrlTest() { Assert.assertEquals("http://127.0.0.1:4501/info", url); } + @Test + public void getHttpClientResponseReturnsStreamAndClosesTest() throws IOException { + MockResponse mockResponse = new MockResponse().setBody("stream-data"); + mockWebServer.enqueue(mockResponse); + + String url = mosipDeviceSpecificationHelper.buildUrl(4501, "stream"); + InputStream stream = mosipDeviceSpecificationHelper.getHttpClientResponse(url, "GET", ""); + Assert.assertNotNull(stream); + stream.close(); // must not throw; closes response and client + } + + @Test + public void getHttpClientResponseNullOnNoEntityTest() throws IOException { + // Server returns 204 No Content — entity will be null + MockResponse mockResponse = new MockResponse().setResponseCode(204); + mockWebServer.enqueue(mockResponse); + + String url = mosipDeviceSpecificationHelper.buildUrl(4501, "stream"); + InputStream stream = mosipDeviceSpecificationHelper.getHttpClientResponse(url, "GET", ""); + Assert.assertNull(stream); + } + @Test public void checkServiceAvailabilityTest() throws IOException { mockWebServer.enqueue(new MockResponse());