From c770f442c0f20a2d5791304c7071b5e78e7201da Mon Sep 17 00:00:00 2001 From: Martin Ndegwa Date: Thu, 22 Aug 2024 21:20:05 +0300 Subject: [PATCH] Fix character encoding issue when parsing custom HTTP responses --- .../plugins/endpoint/BaseEndpoint.java | 19 +++++++++++++++++++ .../endpoint/LocationHierarchyEndpoint.java | 7 ++++--- .../endpoint/PractitionerDetailEndpoint.java | 7 ++++--- 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/plugins/src/main/java/org/smartregister/fhir/gateway/plugins/endpoint/BaseEndpoint.java b/plugins/src/main/java/org/smartregister/fhir/gateway/plugins/endpoint/BaseEndpoint.java index ff3c97c..80c0114 100644 --- a/plugins/src/main/java/org/smartregister/fhir/gateway/plugins/endpoint/BaseEndpoint.java +++ b/plugins/src/main/java/org/smartregister/fhir/gateway/plugins/endpoint/BaseEndpoint.java @@ -1,11 +1,17 @@ package org.smartregister.fhir.gateway.plugins.endpoint; import java.io.IOException; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.nio.charset.StandardCharsets; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.smartregister.fhir.gateway.plugins.RestUtils; import com.google.fhir.gateway.TokenVerifier; @@ -14,6 +20,8 @@ import ca.uhn.fhir.parser.IParser; public abstract class BaseEndpoint extends HttpServlet { + private static final Logger logger = LoggerFactory.getLogger(BaseEndpoint.class); + protected final TokenVerifier tokenVerifier = TokenVerifier.createFromEnvVars(); protected final FhirContext fhirR4Context = FhirContext.forR4(); protected final IParser fhirR4JsonParser = fhirR4Context.newJsonParser().setPrettyPrint(true); @@ -24,4 +32,15 @@ protected void doOptions(HttpServletRequest request, HttpServletResponse respons } protected BaseEndpoint() throws IOException {} + + protected void writeUTF8StringToStream(OutputStream fileOutputStream, String content) { + try (OutputStreamWriter outputStreamWriter = + new OutputStreamWriter(fileOutputStream, StandardCharsets.UTF_8); + PrintWriter printWriter = new PrintWriter(outputStreamWriter)) { + printWriter.println(content); + printWriter.flush(); + } catch (IOException e) { + logger.error(e.getMessage()); + } + } } diff --git a/plugins/src/main/java/org/smartregister/fhir/gateway/plugins/endpoint/LocationHierarchyEndpoint.java b/plugins/src/main/java/org/smartregister/fhir/gateway/plugins/endpoint/LocationHierarchyEndpoint.java index 216004a..b0c79f9 100644 --- a/plugins/src/main/java/org/smartregister/fhir/gateway/plugins/endpoint/LocationHierarchyEndpoint.java +++ b/plugins/src/main/java/org/smartregister/fhir/gateway/plugins/endpoint/LocationHierarchyEndpoint.java @@ -57,15 +57,16 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response) resultContent = fhirR4JsonParser.encodeResourceToString(resultBundle); } response.setContentType("application/json"); - response.getOutputStream().print(resultContent); + writeUTF8StringToStream(response.getOutputStream(), resultContent); response.setStatus(HttpStatus.SC_OK); } catch (AuthenticationException authenticationException) { response.setContentType("application/json"); - response.getOutputStream().print(authenticationException.getMessage()); + writeUTF8StringToStream( + response.getOutputStream(), authenticationException.getMessage()); response.setStatus(authenticationException.getStatusCode()); } catch (Exception exception) { response.setContentType("application/json"); - response.getOutputStream().print(exception.getMessage()); + writeUTF8StringToStream(response.getOutputStream(), exception.getMessage()); response.setStatus(HttpStatus.SC_INTERNAL_SERVER_ERROR); } } diff --git a/plugins/src/main/java/org/smartregister/fhir/gateway/plugins/endpoint/PractitionerDetailEndpoint.java b/plugins/src/main/java/org/smartregister/fhir/gateway/plugins/endpoint/PractitionerDetailEndpoint.java index a9f1040..3f17417 100755 --- a/plugins/src/main/java/org/smartregister/fhir/gateway/plugins/endpoint/PractitionerDetailEndpoint.java +++ b/plugins/src/main/java/org/smartregister/fhir/gateway/plugins/endpoint/PractitionerDetailEndpoint.java @@ -53,15 +53,16 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response) } response.setContentType("application/json"); - response.getOutputStream().print(resultContent); + writeUTF8StringToStream(response.getOutputStream(), resultContent); response.setStatus(HttpStatus.SC_OK); } catch (AuthenticationException authenticationException) { response.setContentType("application/json"); - response.getOutputStream().print(authenticationException.getMessage()); + writeUTF8StringToStream( + response.getOutputStream(), authenticationException.getMessage()); response.setStatus(authenticationException.getStatusCode()); } catch (Exception exception) { response.setContentType("application/json"); - response.getOutputStream().print(exception.getMessage()); + writeUTF8StringToStream(response.getOutputStream(), exception.getMessage()); response.setStatus(HttpStatus.SC_INTERNAL_SERVER_ERROR); } }