From bcf0f506ffd1f9a2b2eec96bbb9f8f56ace0904b Mon Sep 17 00:00:00 2001 From: Ryan Amari Date: Mon, 27 Jan 2025 17:57:34 -0500 Subject: [PATCH] Fix character encoding for binary files --- .../AggregateDataSharingResourceRS.java | 3 ++- .../passthru/PassThroughResourceRS.java | 18 +++++++++--------- .../passthru/PassThroughResourceRSTest.java | 2 +- .../avillach/service/ResourceWebClient.java | 12 ++++++------ .../dbmi/avillach/util/HttpClientUtil.java | 6 +++--- 5 files changed, 21 insertions(+), 20 deletions(-) diff --git a/pic-sure-resources/pic-sure-aggregate-data-sharing-resource/src/main/java/edu/harvard/hms/dbmi/avillach/AggregateDataSharingResourceRS.java b/pic-sure-resources/pic-sure-aggregate-data-sharing-resource/src/main/java/edu/harvard/hms/dbmi/avillach/AggregateDataSharingResourceRS.java index e3e7d7ad..c280cfce 100644 --- a/pic-sure-resources/pic-sure-aggregate-data-sharing-resource/src/main/java/edu/harvard/hms/dbmi/avillach/AggregateDataSharingResourceRS.java +++ b/pic-sure-resources/pic-sure-aggregate-data-sharing-resource/src/main/java/edu/harvard/hms/dbmi/avillach/AggregateDataSharingResourceRS.java @@ -30,6 +30,7 @@ import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.Response; import java.io.IOException; +import java.nio.charset.StandardCharsets; import java.util.*; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -207,7 +208,7 @@ public Response queryResult(@PathParam("resourceQueryId") UUID queryId, QueryReq checkQuery(resultRequest); HttpResponse response = postRequest(resultRequest, "/query/" + queryId + "/result"); try { - String responseBody = httpClientUtil.readObjectFromResponse(response); + String responseBody = httpClientUtil.readObjectFromResponse(response, StandardCharsets.UTF_8); return Response.ok(responseBody).build(); } finally { HttpClientUtil.closeHttpResponse(response); diff --git a/pic-sure-resources/pic-sure-passthrough-resource/src/main/java/edu/harvard/hms/dbmi/avillach/resource/passthru/PassThroughResourceRS.java b/pic-sure-resources/pic-sure-passthrough-resource/src/main/java/edu/harvard/hms/dbmi/avillach/resource/passthru/PassThroughResourceRS.java index ecf06b61..7de6cdc3 100644 --- a/pic-sure-resources/pic-sure-passthrough-resource/src/main/java/edu/harvard/hms/dbmi/avillach/resource/passthru/PassThroughResourceRS.java +++ b/pic-sure-resources/pic-sure-passthrough-resource/src/main/java/edu/harvard/hms/dbmi/avillach/resource/passthru/PassThroughResourceRS.java @@ -1,6 +1,7 @@ package edu.harvard.hms.dbmi.avillach.resource.passthru; import java.io.IOException; +import java.nio.charset.StandardCharsets; import java.util.UUID; import javax.inject.Inject; @@ -13,7 +14,6 @@ import org.apache.http.HttpResponse; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; import org.apache.http.message.BasicHeader; -import org.apache.http.util.EntityUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -69,7 +69,7 @@ public PassThroughResourceRS(ApplicationProperties properties, HttpClientUtil ht public ResourceInfo info(QueryRequest infoRequest) { String pathName = "/info"; - HttpResponse response = null; + HttpResponse response = null; try { QueryRequest chainRequest = new GeneralQueryRequest(); if (infoRequest != null) { @@ -101,8 +101,8 @@ public ResourceInfo info(QueryRequest infoRequest) { logger.error(e.getMessage()); throw new ProtocolException(ProtocolException.INCORRECTLY_FORMATTED_REQUEST); } finally { - closeHttpResponse(response); - } + closeHttpResponse(response); + } } @POST @@ -154,7 +154,7 @@ public Response queryResult(@PathParam("resourceQueryId") String queryId, QueryR String pathName = "/query/" + queryId + "/result"; - HttpResponse response = null; + HttpResponse response = null; try { QueryRequest chainRequest = new GeneralQueryRequest(); chainRequest.setQuery(resultRequest.getQuery()); @@ -164,8 +164,8 @@ public Response queryResult(@PathParam("resourceQueryId") String queryId, QueryR String payload = objectMapper.writeValueAsString(chainRequest); response = httpClient .retrievePostResponse(httpClient.composeURL(properties.getTargetPicsureUrl(), pathName), createAuthHeader(), payload); - String content = httpClient.readObjectFromResponse(response); - if (response.getStatusLine().getStatusCode() != 200) { + String content = httpClient.readObjectFromResponse(response, StandardCharsets.UTF_8); + if (response.getStatusLine().getStatusCode() != 200) { logger.error( "{}{} calling resource with id {} did not return a 200: {} {} ", properties.getTargetPicsureUrl(), pathName, chainRequest.getResourceUUID(), response.getStatusLine().getStatusCode(), response.getStatusLine().getReasonPhrase() @@ -180,8 +180,8 @@ public Response queryResult(@PathParam("resourceQueryId") String queryId, QueryR logger.error(e.getMessage()); throw new ProtocolException(ProtocolException.INCORRECTLY_FORMATTED_REQUEST); } finally { - closeHttpResponse(response); - } + closeHttpResponse(response); + } } @POST diff --git a/pic-sure-resources/pic-sure-passthrough-resource/src/test/java/edu/harvard/hms/dbmi/avillach/resource/passthru/PassThroughResourceRSTest.java b/pic-sure-resources/pic-sure-passthrough-resource/src/test/java/edu/harvard/hms/dbmi/avillach/resource/passthru/PassThroughResourceRSTest.java index 1c8daf44..014f9be6 100644 --- a/pic-sure-resources/pic-sure-passthrough-resource/src/test/java/edu/harvard/hms/dbmi/avillach/resource/passthru/PassThroughResourceRSTest.java +++ b/pic-sure-resources/pic-sure-passthrough-resource/src/test/java/edu/harvard/hms/dbmi/avillach/resource/passthru/PassThroughResourceRSTest.java @@ -139,7 +139,7 @@ void testQueryResult() throws Exception { when(httpResponse.getStatusLine()).thenReturn(statusLine); when(httpResponse.getEntity()).thenReturn(httpResponseEntity); when(httpClient.retrievePostResponse(anyString(), any(Header[].class), anyString())).thenReturn(httpResponse); - when(httpClient.readObjectFromResponse(any(HttpResponse.class))).thenReturn("4"); + when(httpClient.readObjectFromResponse(any(HttpResponse.class), StandardCharsets.UTF_8)).thenReturn("4"); assertThrows(ProtocolException.class, () -> { resource.queryResult("", null); diff --git a/pic-sure-resources/pic-sure-resource-api/src/main/java/edu/harvard/dbmi/avillach/service/ResourceWebClient.java b/pic-sure-resources/pic-sure-resource-api/src/main/java/edu/harvard/dbmi/avillach/service/ResourceWebClient.java index 0ac54062..ca335ad6 100644 --- a/pic-sure-resources/pic-sure-resource-api/src/main/java/edu/harvard/dbmi/avillach/service/ResourceWebClient.java +++ b/pic-sure-resources/pic-sure-resource-api/src/main/java/edu/harvard/dbmi/avillach/service/ResourceWebClient.java @@ -14,7 +14,6 @@ import org.apache.http.client.utils.URIBuilder; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; import org.apache.http.message.BasicHeader; -import org.apache.http.util.EntityUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -23,6 +22,7 @@ import javax.ws.rs.core.Response; import java.io.IOException; import java.net.URISyntaxException; +import java.nio.charset.StandardCharsets; import java.util.Map; import static edu.harvard.dbmi.avillach.util.HttpClientUtil.closeHttpResponse; @@ -240,7 +240,7 @@ public Response queryResult(String rsURL, String queryId, QueryRequest queryRequ HttpClientUtil.composeURL(rsURL, pathName), createHeaders(queryRequest.getResourceCredentials()), body ); - String content = httpClientUtil.readObjectFromResponse(resourcesResponse); + String content = httpClientUtil.readObjectFromResponse(resourcesResponse, StandardCharsets.ISO_8859_1); if (resourcesResponse.getStatusLine().getStatusCode() != 200) { logger.error("ResourceRS did not return a 200"); HttpClientUtil.throwResponseError(resourcesResponse, rsURL); @@ -281,7 +281,7 @@ public Response queryResultSignedUrl(String rsURL, String queryId, QueryRequest httpClientUtil.throwResponseError(resourcesResponse, rsURL); } - String content = httpClientUtil.readObjectFromResponse(resourcesResponse); + String content = httpClientUtil.readObjectFromResponse(resourcesResponse, StandardCharsets.UTF_8); return Response.ok(content).build(); } catch (JsonProcessingException e) { logger.error("Unable to encode resource credentials"); @@ -311,7 +311,7 @@ public Response queryFormat(String rsURL, QueryRequest queryRequest) { httpClientUtil.composeURL(rsURL, pathName), createHeaders(queryRequest.getResourceCredentials()), body ); - String content = httpClientUtil.readObjectFromResponse(resourcesResponse); + String content = httpClientUtil.readObjectFromResponse(resourcesResponse, StandardCharsets.UTF_8); int status = resourcesResponse.getStatusLine().getStatusCode(); if (status != 200) { logger.error("Query format request did not return a 200: {}", resourcesResponse.getStatusLine().getStatusCode()); @@ -360,7 +360,7 @@ public Response querySync(String rsURL, QueryRequest queryRequest, String reques throwError(resourcesResponse, rsURL); } - String content = httpClientUtil.readObjectFromResponse(resourcesResponse); + String content = httpClientUtil.readObjectFromResponse(resourcesResponse, StandardCharsets.UTF_8); if (resourcesResponse.containsHeader(QUERY_METADATA_FIELD)) { Header metadataHeader = ((Header[]) resourcesResponse.getHeaders(QUERY_METADATA_FIELD))[0]; return Response.ok(content).header(QUERY_METADATA_FIELD, metadataHeader.getValue()).build(); @@ -417,7 +417,7 @@ public Response queryContinuous(String rsURL, QueryRequest queryRequest, String throwError(resourcesResponse, rsURL); } - String content = httpClientUtil.readObjectFromResponse(resourcesResponse); + String content = httpClientUtil.readObjectFromResponse(resourcesResponse, StandardCharsets.UTF_8); return Response.ok(content).build(); } catch (JsonProcessingException e) { throw new RuntimeException(e); diff --git a/pic-sure-util/src/main/java/edu/harvard/dbmi/avillach/util/HttpClientUtil.java b/pic-sure-util/src/main/java/edu/harvard/dbmi/avillach/util/HttpClientUtil.java index 215d0530..5419c646 100644 --- a/pic-sure-util/src/main/java/edu/harvard/dbmi/avillach/util/HttpClientUtil.java +++ b/pic-sure-util/src/main/java/edu/harvard/dbmi/avillach/util/HttpClientUtil.java @@ -7,6 +7,7 @@ import java.io.UnsupportedEncodingException; import java.net.URI; import java.net.URISyntaxException; +import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; @@ -19,7 +20,6 @@ import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; -import org.apache.commons.io.IOUtils; import org.apache.http.Header; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; @@ -139,10 +139,10 @@ public List readListFromResponse(HttpResponse response, Class expected } } - public String readObjectFromResponse(HttpResponse response) { + public String readObjectFromResponse(HttpResponse response, Charset charset) { logger.debug("HttpClientUtil readObjectFromResponse(HttpResponse response)"); try { - String responseBody = EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8); + String responseBody = EntityUtils.toString(response.getEntity(), charset); logger.debug("readObjectFromResponse() responseBody {}", responseBody); return responseBody; } catch (IOException e) {