Skip to content

Commit

Permalink
Replace ErrorUtil with ProblemDetails #634 (#649)
Browse files Browse the repository at this point in the history
  • Loading branch information
predic8 authored Jul 11, 2023
1 parent ba4c121 commit 28ecad6
Show file tree
Hide file tree
Showing 5 changed files with 37 additions and 110 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,10 @@ public static Response createProblemDetails(int statusCode, String type, String
return createMessage(statusCode, type, title, details, root);
}

public static Response createProblemDetailsForProduction(int statusCode, String type, String logKey) {
return createProblemDetails(statusCode, type,"An error has happened. For security reasons no details are exposed to the client. Details can be found in the log using the log key: " + logKey, null);
}

private static Response createMessage(int statusCode, String type, String title, Map<String, Object> details, Map<String, Object> root) {
Response.ResponseBuilder builder = Response.statusCode(statusCode);
try {
Expand All @@ -55,4 +59,7 @@ private static Response createMessage(int statusCode, String type, String title,
}
return builder.build();
}



}
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,9 @@
import java.net.*;
import java.util.*;

import static com.predic8.membrane.core.exceptions.ProblemDetails.*;
import static com.predic8.membrane.core.interceptor.Interceptor.Flow.Set.*;
import static com.predic8.membrane.core.interceptor.Outcome.*;
import static com.predic8.membrane.core.util.ErrorUtil.*;
import static java.lang.String.*;

/**
* @description The <i>httpClient</i> sends the request of an exchange to a Web
Expand All @@ -42,6 +41,8 @@ public class HTTPClientInterceptor extends AbstractInterceptor {

private static final Logger log = LoggerFactory.getLogger(HTTPClientInterceptor.class.getName());

private static final String PROXIES_HINT = " String Maybe the target is only reachable over an HTTP proxy server. Please check proxy settings in conf/proxies.xml.";

private boolean failOverOn5XX;
private boolean adjustHostHeader = true;
private HttpClientConfiguration httpClientConfig;
Expand All @@ -61,24 +62,25 @@ public Outcome handleRequest(Exchange exc) throws Exception {
hc.call(exc, adjustHostHeader, failOverOn5XX);
return RETURN;
} catch (ConnectException e) {
String msg = format("Target %s is not reachable.", getDestination(exc));
log.warn(msg + "\nMaybe the target is only reachable over an HTTP proxy server. Please check proxy settings in conf/proxies.xml.");
createAndSetErrorResponse(exc,502,msg);
setErrorResponse(exc, "Target %s is not reachable.".formatted(getDestination(exc)) + PROXIES_HINT);
return ABORT;
} catch (UnknownHostException e) {
String msg = "Target host %s of API %s is unknown. DNS was unable to resolve host name.".formatted(URLUtil.getHost(getDestination(exc)), exc.getRule().getName());
if (router.isProduction()) {
String logKey = UUID.randomUUID().toString();
log.error("logKey=%s\n%s\nMaybe the target is only reachable over an HTTP proxy server. Please check proxy settings in conf/proxies.xml.", logKey, msg);
createAndSetProductionErrorResponse(exc,500, logKey);
} else {
log.error(msg + "\nMaybe the target is only reachable over an HTTP proxy server. Please check proxy settings in conf/proxies.xml.");
createAndSetErrorResponse(exc,502, msg);
}
setErrorResponse(exc, "Target host %s of API %s is unknown. DNS was unable to resolve host name.".formatted(URLUtil.getHost(getDestination(exc)), exc.getRule().getName()) + PROXIES_HINT);
return ABORT;
}
}

private void setErrorResponse(Exchange exc, String msg) {
if (router.isProduction()) {
String logKey = UUID.randomUUID().toString();
log.error("logKey={}\n{}\n.", logKey, msg);
exc.setResponse(createProblemDetailsForProduction(500,"/gateway",logKey));
} else {
log.error(msg);
exc.setResponse(createProblemDetails(502,"/gateway", msg));
}
}

private String getDestination(Exchange exc) {
return exc.getDestinations().get(0);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,34 +14,20 @@

package com.predic8.membrane.core.interceptor;

import java.io.IOException;

import com.predic8.membrane.core.util.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.predic8.membrane.annot.MCAttribute;
import com.predic8.membrane.annot.MCElement;
import com.predic8.membrane.core.Constants;
import com.predic8.membrane.core.exchange.AbstractExchange;
import com.predic8.membrane.core.exchange.Exchange;
import com.predic8.membrane.core.http.Header;
import com.predic8.membrane.core.http.Request;
import com.predic8.membrane.core.http.Response;
import com.predic8.membrane.core.rules.AbstractServiceProxy;
import com.predic8.membrane.core.rules.NullRule;
import com.predic8.membrane.core.rules.ProxyRule;
import com.predic8.membrane.core.rules.Rule;
import com.predic8.membrane.core.transport.http.AbstractHttpHandler;

import static com.predic8.membrane.core.interceptor.Outcome.ABORT;
import static com.predic8.membrane.core.interceptor.Outcome.CONTINUE;
import static com.predic8.membrane.core.util.ErrorUtil.createAndSetErrorResponse;
import com.predic8.membrane.annot.*;
import com.predic8.membrane.core.exchange.*;
import com.predic8.membrane.core.http.*;
import com.predic8.membrane.core.rules.*;
import com.predic8.membrane.core.transport.http.*;
import org.slf4j.*;

import static com.predic8.membrane.core.exceptions.ProblemDetails.*;
import static com.predic8.membrane.core.interceptor.Outcome.*;

@MCElement(name="ruleMatching")
public class RuleMatchingInterceptor extends AbstractInterceptor {

private static Logger log = LoggerFactory.getLogger(RuleMatchingInterceptor.class.getName());
private static final Logger log = LoggerFactory.getLogger(RuleMatchingInterceptor.class.getName());

private boolean xForwardedForEnabled = true;
private int maxXForwardedForHeaders = 20;
Expand All @@ -59,7 +45,7 @@ public Outcome handleRequest(Exchange exc) throws Exception {
assignRule(exc, rule);

if (rule instanceof NullRule) {
createAndSetErrorResponse(exc,400,"This request was not accepted by Membrane. Please check HTTP method and path.");
exc.setResponse(createProblemDetails(400,"/gateway", "This request was not accepted by Membrane. Please check HTTP method and path."));
return ABORT;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,10 @@
import java.io.*;
import java.util.*;

import static com.predic8.membrane.core.exceptions.ProblemDetails.createProblemDetails;
import static com.predic8.membrane.core.http.MimeType.*;
import static com.predic8.membrane.core.interceptor.Interceptor.Flow.*;
import static com.predic8.membrane.core.interceptor.Outcome.*;
import static com.predic8.membrane.core.util.ErrorUtil.*;
import static java.nio.charset.StandardCharsets.*;
import static org.apache.commons.text.StringEscapeUtils.*;

Expand Down Expand Up @@ -90,11 +90,10 @@ private Outcome handleInternal(Message msg, Exchange exc, Flow flow) {
catch (TemplateExecutionException e) {
log.warn("Template Exception" + e);
log.warn("Cause: " + e.getCause());
createAndSetErrorResponse(exc,500,e.getMessage());
exc.setResponse(createProblemDetails(500,"/gateway", e.getMessage()));
}
catch (Exception e) {
System.out.println(e.getClass());
createAndSetErrorResponse(exc,500,e.getMessage());
exc.setResponse(createProblemDetails(500,"/gateway", e.getMessage()));
}

// Setting Content-Type must come at the end, cause before we want to know what the original type was.
Expand Down
67 changes: 0 additions & 67 deletions core/src/main/java/com/predic8/membrane/core/util/ErrorUtil.java

This file was deleted.

0 comments on commit 28ecad6

Please sign in to comment.