protected void doSend()

in components/camel-platform-http-main/src/main/java/org/apache/camel/component/platform/http/main/MainHttpServer.java [1242:1399]


    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());
    }