From 9d45f2ca88ef1b28f249b3c5d2068dfd29820bbb Mon Sep 17 00:00:00 2001 From: Marc Savy Date: Wed, 21 Jun 2017 20:58:40 +0100 Subject: [PATCH] fix(platform-vertx): Fix NPE where HTTP reasonCode or Exception messages are not set. fix(platform-vertx): Ensure that Host header is not suppressed before the connector Resolves APIMAN-1271 --- .../engine/impl/DefaultPolicyErrorWriter.java | 4 ++-- .../vertx3/connector/HttpConnector.java | 23 ++++++++++++------- .../platforms/vertx3/http/HttpApiFactory.java | 6 ++--- 3 files changed, 20 insertions(+), 13 deletions(-) diff --git a/gateway/engine/core/src/main/java/io/apiman/gateway/engine/impl/DefaultPolicyErrorWriter.java b/gateway/engine/core/src/main/java/io/apiman/gateway/engine/impl/DefaultPolicyErrorWriter.java index 0041116c03..a1e1a70914 100644 --- a/gateway/engine/core/src/main/java/io/apiman/gateway/engine/impl/DefaultPolicyErrorWriter.java +++ b/gateway/engine/core/src/main/java/io/apiman/gateway/engine/impl/DefaultPolicyErrorWriter.java @@ -60,8 +60,8 @@ public void write(ApiRequest request, Throwable error, IApiClientResponse respon if (request != null && request.getApi() != null && "xml".equals(request.getApi().getEndpointContentType())) { isXml = true; } - - response.setHeader("X-Gateway-Error", error.getMessage()); + String message = (error.getMessage() == null) ? "" : error.getMessage(); // TODO get and/or print ultimate cause? + response.setHeader("X-Gateway-Error", message); response.setStatusCode(500); EngineErrorResponse eer = createErrorResponse(error); diff --git a/gateway/platforms/vertx3/vertx3/src/main/java/io/apiman/gateway/platforms/vertx3/connector/HttpConnector.java b/gateway/platforms/vertx3/vertx3/src/main/java/io/apiman/gateway/platforms/vertx3/connector/HttpConnector.java index f3fba53e31..f0702e6698 100644 --- a/gateway/platforms/vertx3/vertx3/src/main/java/io/apiman/gateway/platforms/vertx3/connector/HttpConnector.java +++ b/gateway/platforms/vertx3/vertx3/src/main/java/io/apiman/gateway/platforms/vertx3/connector/HttpConnector.java @@ -49,7 +49,7 @@ import java.io.UnsupportedEncodingException; import java.net.URI; import java.net.URLEncoder; -import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.Map.Entry; import java.util.Set; @@ -65,15 +65,17 @@ @SuppressWarnings("nls") class HttpConnector implements IApiConnectionResponse, IApiConnection { - private static final Set SUPPRESSED_HEADERS = new HashSet<>(); + private static final Set SUPPRESSED_REQUEST_HEADERS = new LinkedHashSet<>(); + private static final Set SUPPRESSED_RESPONSE_HEADERS = new LinkedHashSet<>(); + static { - SUPPRESSED_HEADERS.add("Transfer-Encoding"); - SUPPRESSED_HEADERS.add("X-API-Key"); - SUPPRESSED_HEADERS.add("Host"); + SUPPRESSED_REQUEST_HEADERS.add("X-API-Key"); + SUPPRESSED_REQUEST_HEADERS.add("Host"); + + SUPPRESSED_RESPONSE_HEADERS.add("Connection"); } private Logger logger = LoggerFactory.getLogger(this.getClass()); - private ApiRequest apiRequest; private ApiResponse apiResponse; @@ -171,7 +173,7 @@ private void doConnection() { // Pause until we're given permission to xfer the response. vxClientResponse.pause(); - apiResponse = HttpApiFactory.buildResponse(vxClientResponse, SUPPRESSED_HEADERS); + apiResponse = HttpApiFactory.buildResponse(vxClientResponse, SUPPRESSED_RESPONSE_HEADERS); vxClientResponse.handler((Handler) chunk -> { bodyHandler.handle(new VertxApimanBuffer(chunk)); @@ -195,7 +197,12 @@ private void doConnection() { clientRequest.setChunked(true); } - apiRequest.getHeaders().forEach(e -> clientRequest.headers().add(e.getKey(), e.getValue())); + apiRequest.getHeaders() + .forEach(e -> { + if (!SUPPRESSED_REQUEST_HEADERS.contains(e.getKey())) { + clientRequest.headers().add(e.getKey(), e.getValue()); + } + }); addMandatoryRequestHeaders(clientRequest.headers()); diff --git a/gateway/platforms/vertx3/vertx3/src/main/java/io/apiman/gateway/platforms/vertx3/http/HttpApiFactory.java b/gateway/platforms/vertx3/vertx3/src/main/java/io/apiman/gateway/platforms/vertx3/http/HttpApiFactory.java index 9120d23f0a..a47083eb6a 100644 --- a/gateway/platforms/vertx3/vertx3/src/main/java/io/apiman/gateway/platforms/vertx3/http/HttpApiFactory.java +++ b/gateway/platforms/vertx3/vertx3/src/main/java/io/apiman/gateway/platforms/vertx3/http/HttpApiFactory.java @@ -45,7 +45,7 @@ public class HttpApiFactory { private final static Set IGNORESET = new HashSet<>(); static { IGNORESET.add(ApimanPathUtils.X_API_VERSION_HEADER); - IGNORESET.add("Host"); + //IGNORESET.add("Host"); } private static IApiRequestPathParser requestPathParser; @@ -57,7 +57,7 @@ public static void init(IApiRequestPathParser requestPathParser) { public static ApiResponse buildResponse(HttpClientResponse response, Set suppressHeaders) { ApiResponse apimanResponse = new ApiResponse(); apimanResponse.setCode(response.statusCode()); - apimanResponse.setMessage(response.statusMessage()); + apimanResponse.setMessage(response.statusMessage() == null ? "" : response.statusMessage()); multimapToMap(apimanResponse.getHeaders(), response.headers(), suppressHeaders); return apimanResponse; } @@ -69,7 +69,7 @@ public static void buildResponse(HttpServerResponse httpServerResponse, ApiRespo } }); httpServerResponse.setStatusCode(amanResponse.getCode()); - httpServerResponse.setStatusMessage(amanResponse.getMessage()); + httpServerResponse.setStatusMessage(amanResponse.getMessage() == null ? "" : amanResponse.getMessage()); } public static ApiRequest buildRequest(HttpServerRequest req, boolean isTransportSecure) {