in components/camel-platform-http-main/src/main/java/org/apache/camel/component/platform/http/main/ManagementHttpServer.java [864:1021]
protected void doSend(RoutingContext ctx) {
StopWatch watch = new StopWatch();
long timestamp = System.currentTimeMillis();
String endpoint = ctx.request().getHeader("endpoint");
String exchangePattern = ctx.request().getHeader("exchangePattern");
String resultType = ctx.request().getHeader("resultType");
String poll = ctx.request().getHeader("poll");
String pollTimeout = ctx.request().getHeader("pollTimeout");
final Map<String, Object> headers = new LinkedHashMap<>();
for (var entry : ctx.request().headers()) {
String k = entry.getKey();
boolean exclude
= "endpoint".equals(k) || "exchangePattern".equals(k) || "poll".equals(k)
|| "pollTimeout".equals(k) || "resultType".equals(k) || "Accept".equals(k)
|| filter.applyFilterToExternalHeaders(entry.getKey(), entry.getValue(), null);
if (!exclude) {
headers.put(entry.getKey(), entry.getValue());
}
}
final String body = ctx.body().asString();
Exchange out = null;
Endpoint target = null;
if (endpoint == null) {
List<org.apache.camel.Route> routes = camelContext.getRoutes();
if (!routes.isEmpty()) {
// grab endpoint from 1st route
target = routes.get(0).getEndpoint();
}
} else {
// is the endpoint a pattern or route id
boolean scheme = endpoint.contains(":");
boolean pattern = endpoint.endsWith("*");
if (!scheme || pattern) {
if (!scheme) {
endpoint = endpoint + "*";
}
String quotedEndpoint = Pattern.quote(endpoint);
for (org.apache.camel.Route route : camelContext.getRoutes()) {
Endpoint e = route.getEndpoint();
if (EndpointHelper.matchEndpoint(camelContext, e.getEndpointUri(), quotedEndpoint)) {
target = e;
break;
}
}
if (target == null) {
// okay it may refer to a route id
for (org.apache.camel.Route route : camelContext.getRoutes()) {
String id = route.getRouteId();
Endpoint e = route.getEndpoint();
if (EndpointHelper.matchEndpoint(camelContext, id, quotedEndpoint)) {
target = e;
break;
}
}
}
} else {
target = camelContext.getEndpoint(endpoint);
}
}
JsonObject jo = new JsonObject();
if (target != null) {
Class<?> clazz = null;
try {
if (resultType != null) {
clazz = camelContext.getClassResolver().resolveMandatoryClass(resultType);
// we want the result as a specific type then make sure to use InOut
if (exchangePattern == null) {
exchangePattern = "InOut";
}
}
if (exchangePattern == null) {
exchangePattern = "InOnly"; // use in-only by default
}
final ExchangePattern mep = ExchangePattern.valueOf(exchangePattern);
long timeout = pollTimeout != null ? Long.parseLong(pollTimeout) : DEFAULT_POLL_TIMEOUT;
if ("true".equals(poll)) {
exchangePattern = "InOut"; // we want to receive the data so enable out mode
out = consumer.receive(target, timeout);
} else {
out = producer.send(target, exchange -> {
exchange.setPattern(mep);
exchange.getMessage().setBody(body);
if (!headers.isEmpty()) {
exchange.getMessage().setHeaders(headers);
}
});
}
if (clazz != null && out != null) {
Object b = out.getMessage().getBody(clazz);
out.getMessage().setBody(b);
}
} catch (Exception e) {
jo.put("endpoint", target.getEndpointUri());
jo.put("exchangePattern", exchangePattern);
jo.put("timestamp", timestamp);
jo.put("elapsed", watch.taken());
jo.put("status", "failed");
jo.put("exception",
MessageHelper.dumpExceptionAsJSonObject(e).getMap("exception"));
}
if (out != null && out.getException() != null) {
jo.put("endpoint", target.getEndpointUri());
jo.put("exchangeId", out.getExchangeId());
jo.put("exchangePattern", exchangePattern);
jo.put("timestamp", timestamp);
jo.put("elapsed", watch.taken());
jo.put("status", "failed");
// avoid double wrap
jo.put("exception",
MessageHelper.dumpExceptionAsJSonObject(out.getException()).getMap("exception"));
} else if (out != null && "InOut".equals(exchangePattern)) {
jo.put("endpoint", target.getEndpointUri());
jo.put("exchangeId", out.getExchangeId());
jo.put("exchangePattern", exchangePattern);
jo.put("timestamp", timestamp);
jo.put("elapsed", watch.taken());
jo.put("status", "success");
// dump response and remove unwanted data
JsonObject msg = MessageHelper.dumpAsJSonObject(out.getMessage(), false, false, true, true, true, true,
BODY_MAX_CHARS).getMap("message");
msg.remove("exchangeId");
msg.remove("exchangePattern");
msg.remove("exchangeType");
msg.remove("messageType");
jo.put("message", msg);
} else if (out != null) {
jo.put("endpoint", target.getEndpointUri());
jo.put("exchangeId", out.getExchangeId());
jo.put("exchangePattern", exchangePattern);
jo.put("timestamp", timestamp);
jo.put("elapsed", watch.taken());
jo.put("status", "success");
} else {
// timeout as there is no data
jo.put("endpoint", target.getEndpointUri());
jo.put("timestamp", timestamp);
jo.put("elapsed", watch.taken());
jo.put("status", "timeout");
}
} else {
// there is no valid endpoint
ctx.response().setStatusCode(400);
jo.put("endpoint", endpoint);
jo.put("exchangeId", "");
jo.put("exchangePattern", exchangePattern);
jo.put("timestamp", timestamp);
jo.put("elapsed", watch.taken());
jo.put("status", "failed");
// avoid double wrap
jo.put("exception",
MessageHelper.dumpExceptionAsJSonObject(new NoSuchEndpointException(endpoint))
.getMap("exception"));
}
ctx.end(jo.toJson());
}