Fix issue when string parsing in proxy

uddhika-device-mgt
Lasantha Dharmakeerthi 5 months ago
commit 9a3791bfee

@ -19,9 +19,13 @@
package io.entgra.device.mgt.core.ui.request.interceptor.util;
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
@ -62,8 +66,11 @@ import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.Reader;
import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
@ -93,10 +100,6 @@ public class HandlerUtil {
public static ProxyResponse execute(ClassicHttpRequest httpRequest) throws IOException {
try (CloseableHttpClient client = getHttpClient()) {
JsonFactory jsonFactory = new JsonFactory();
ObjectMapper objectMapper = new ObjectMapper(jsonFactory);
return client.execute(httpRequest, response -> {
final HttpEntity responseEntity = response.getEntity();
ProxyResponse handlerResponse = new ProxyResponse();
@ -109,41 +112,39 @@ public class HandlerUtil {
HandlerConstants.INTERNAL_ERROR_CODE));
return handlerResponse;
}
try (InputStream inputStream = responseEntity.getContent()) {
JsonNode responseData = objectMapper.readTree(inputStream);
if (statusCode == HttpStatus.SC_OK || statusCode == HttpStatus.SC_CREATED) {
JsonNode responseData = getResponseDataAsJsonNode(responseEntity);
if (statusCode == HttpStatus.SC_OK || statusCode == HttpStatus.SC_CREATED) {
handlerResponse.setCode(statusCode);
handlerResponse.setData(responseData);
handlerResponse.setStatus(ProxyResponse.Status.SUCCESS);
handlerResponse.setExecutorResponse("SUCCESS");
handlerResponse.setHeaders(response.getHeaders());
return handlerResponse;
} else if (statusCode == HttpStatus.SC_UNAUTHORIZED) {
if (isTokenExpired(responseData)) {
handlerResponse.setCode(statusCode);
handlerResponse.setStatus(ProxyResponse.Status.ERROR);
handlerResponse.setExecutorResponse(HandlerConstants.TOKEN_IS_EXPIRED);
} else {
log.error(
"Received " + statusCode + " response for http request : " + httpRequest.getMethod()
+ " " + httpRequest.getRequestUri() + ". Error message: " + responseData.textValue());
handlerResponse.setCode(statusCode);
handlerResponse.setData(responseData);
handlerResponse.setStatus(ProxyResponse.Status.SUCCESS);
handlerResponse.setExecutorResponse("SUCCESS");
handlerResponse.setHeaders(response.getHeaders());
return handlerResponse;
} else if (statusCode == HttpStatus.SC_UNAUTHORIZED) {
if (isTokenExpired(responseData)) {
handlerResponse.setCode(statusCode);
handlerResponse.setStatus(ProxyResponse.Status.ERROR);
handlerResponse.setExecutorResponse(HandlerConstants.TOKEN_IS_EXPIRED);
} else {
log.error(
"Received " + statusCode + " response for http request : " + httpRequest.getMethod()
+ " " + httpRequest.getRequestUri() + ". Error message: " + responseData.textValue());
handlerResponse.setCode(statusCode);
handlerResponse.setData(responseData);
handlerResponse.setStatus(ProxyResponse.Status.ERROR);
handlerResponse.setExecutorResponse(
HandlerConstants.EXECUTOR_EXCEPTION_PREFIX + getStatusKey(statusCode));
}
return handlerResponse;
handlerResponse.setStatus(ProxyResponse.Status.ERROR);
handlerResponse.setExecutorResponse(
HandlerConstants.EXECUTOR_EXCEPTION_PREFIX + getStatusKey(statusCode));
}
log.error("Received " + statusCode + " response for http request : " + httpRequest.getMethod()
+ " " + httpRequest.getRequestUri() + ". Error message: " + responseData.textValue());
handlerResponse.setCode(statusCode);
handlerResponse.setData(responseData);
handlerResponse.setStatus(ProxyResponse.Status.ERROR);
handlerResponse
.setExecutorResponse(HandlerConstants.EXECUTOR_EXCEPTION_PREFIX + getStatusKey(statusCode));
return handlerResponse;
}
log.error("Received " + statusCode + " response for http request : " + httpRequest.getMethod()
+ " " + httpRequest.getRequestUri() + ". Error message: " + responseData.textValue());
handlerResponse.setCode(statusCode);
handlerResponse.setData(responseData);
handlerResponse.setStatus(ProxyResponse.Status.ERROR);
handlerResponse
.setExecutorResponse(HandlerConstants.EXECUTOR_EXCEPTION_PREFIX + getStatusKey(statusCode));
return handlerResponse;
});
}
}
@ -748,4 +749,45 @@ public class HandlerUtil {
public static String generateStateToken() {
return new BigInteger(130, new SecureRandom()).toString(32);
}
/**
* Get response data and convert data into a json tree
* @param responseEntity Incoming {@link HttpEntity}
* @return {@link JsonNode} consists with response data content
* @throws IOException Throws when IO exception encountered
*/
public static JsonNode getResponseDataAsJsonNode(HttpEntity responseEntity) throws IOException {
JsonFactory jsonFactory = new JsonFactory();
ObjectMapper objectMapper = new ObjectMapper(jsonFactory);
JsonNode finalNode;
try (InputStream inputStream = responseEntity.getContent()) {
String content = getResponseDataAsString(inputStream);
try {
finalNode = objectMapper.readTree(content);
} catch (JsonProcessingException e) {
ObjectNode objectNode = objectMapper.createObjectNode();
objectNode.put("message", content);
finalNode = objectMapper.valueToTree(objectNode);
}
}
return finalNode;
}
/**
* Get response content as a string
* @param inputStream Incoming response content as a stream
* @return String content of the incoming response
* @throws IOException Throws when IO exception encountered
*/
public static String getResponseDataAsString(InputStream inputStream) throws IOException {
char []buffer = new char[8192];
StringBuilder stringBuilder = new StringBuilder();
try (Reader reader = new InputStreamReader(inputStream, StandardCharsets.UTF_8)) {
int charsRead;
while ((charsRead = reader.read(buffer, 0, buffer.length)) > 0) {
stringBuilder.append(buffer, 0, charsRead);
}
}
return stringBuilder.toString();
}
}

Loading…
Cancel
Save