Search in sources :

Example 1 with HttpCommonEndpoint

use of org.apache.camel.http.common.HttpCommonEndpoint in project camel by apache.

the class CamelContinuationServlet method doService.

@Override
protected void doService(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException {
    log.trace("Service: {}", request);
    // is there a consumer registered for the request.
    HttpConsumer consumer = getServletResolveConsumerStrategy().resolve(request, getConsumers());
    if (consumer == null) {
        response.sendError(HttpServletResponse.SC_NOT_FOUND);
        return;
    }
    // figure out if continuation is enabled and what timeout to use
    boolean useContinuation = false;
    Long continuationTimeout = null;
    HttpCommonEndpoint endpoint = consumer.getEndpoint();
    if (endpoint instanceof JettyHttpEndpoint) {
        JettyHttpEndpoint jettyEndpoint = (JettyHttpEndpoint) endpoint;
        Boolean epUseContinuation = jettyEndpoint.getUseContinuation();
        Long epContinuationTimeout = jettyEndpoint.getContinuationTimeout();
        if (epUseContinuation != null) {
            useContinuation = epUseContinuation;
        } else {
            useContinuation = jettyEndpoint.getComponent().isUseContinuation();
        }
        if (epContinuationTimeout != null) {
            continuationTimeout = epContinuationTimeout;
        } else {
            continuationTimeout = jettyEndpoint.getComponent().getContinuationTimeout();
        }
    }
    if (useContinuation) {
        log.trace("Start request with continuation timeout of {}", continuationTimeout != null ? continuationTimeout : "jetty default");
    } else {
        log.trace("Usage of continuation is disabled, either by component or endpoint configuration, fallback to normal servlet processing instead");
        super.doService(request, response);
        return;
    }
    if (consumer.getEndpoint().getHttpMethodRestrict() != null) {
        Iterator<?> it = ObjectHelper.createIterable(consumer.getEndpoint().getHttpMethodRestrict()).iterator();
        boolean match = false;
        while (it.hasNext()) {
            String method = it.next().toString();
            if (method.equalsIgnoreCase(request.getMethod())) {
                match = true;
                break;
            }
        }
        if (!match) {
            response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
            return;
        }
    }
    if ("TRACE".equals(request.getMethod()) && !consumer.isTraceEnabled()) {
        response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
        return;
    }
    // we do not support java serialized objects unless explicit enabled
    String contentType = request.getContentType();
    if (HttpConstants.CONTENT_TYPE_JAVA_SERIALIZED_OBJECT.equals(contentType) && !consumer.getEndpoint().getComponent().isAllowJavaSerializedObject()) {
        response.sendError(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE);
        return;
    }
    final Exchange result = (Exchange) request.getAttribute(EXCHANGE_ATTRIBUTE_NAME);
    if (result == null) {
        // no asynchronous result so leverage continuation
        final Continuation continuation = ContinuationSupport.getContinuation(request);
        if (continuation.isInitial() && continuationTimeout != null) {
            // set timeout on initial
            continuation.setTimeout(continuationTimeout);
        }
        // are we suspended and a request is dispatched initially?
        if (consumer.isSuspended() && continuation.isInitial()) {
            response.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
            return;
        }
        if (continuation.isExpired()) {
            String id = (String) continuation.getAttribute(EXCHANGE_ATTRIBUTE_ID);
            // remember this id as expired
            expiredExchanges.put(id, id);
            log.warn("Continuation expired of exchangeId: {}", id);
            consumer.getBinding().doWriteExceptionResponse(new TimeoutException(), response);
            return;
        }
        // a new request so create an exchange
        final Exchange exchange = new DefaultExchange(consumer.getEndpoint(), ExchangePattern.InOut);
        if (consumer.getEndpoint().isBridgeEndpoint()) {
            exchange.setProperty(Exchange.SKIP_GZIP_ENCODING, Boolean.TRUE);
            exchange.setProperty(Exchange.SKIP_WWW_FORM_URLENCODED, Boolean.TRUE);
        }
        if (consumer.getEndpoint().isDisableStreamCache()) {
            exchange.setProperty(Exchange.DISABLE_HTTP_STREAM_CACHE, Boolean.TRUE);
        }
        HttpHelper.setCharsetFromContentType(request.getContentType(), exchange);
        exchange.setIn(new HttpMessage(exchange, request, response));
        // set context path as header
        String contextPath = consumer.getEndpoint().getPath();
        exchange.getIn().setHeader("CamelServletContextPath", contextPath);
        updateHttpPath(exchange, contextPath);
        if (log.isTraceEnabled()) {
            log.trace("Suspending continuation of exchangeId: {}", exchange.getExchangeId());
        }
        continuation.setAttribute(EXCHANGE_ATTRIBUTE_ID, exchange.getExchangeId());
        // we want to handle the UoW
        try {
            consumer.createUoW(exchange);
        } catch (Exception e) {
            log.error("Error processing request", e);
            throw new ServletException(e);
        }
        // must suspend before we process the exchange
        continuation.suspend();
        ClassLoader oldTccl = overrideTccl(exchange);
        if (log.isTraceEnabled()) {
            log.trace("Processing request for exchangeId: {}", exchange.getExchangeId());
        }
        // use the asynchronous API to process the exchange
        consumer.getAsyncProcessor().process(exchange, new AsyncCallback() {

            public void done(boolean doneSync) {
                // check if the exchange id is already expired
                boolean expired = expiredExchanges.remove(exchange.getExchangeId()) != null;
                if (!expired) {
                    if (log.isTraceEnabled()) {
                        log.trace("Resuming continuation of exchangeId: {}", exchange.getExchangeId());
                    }
                    // resume processing after both, sync and async callbacks
                    continuation.setAttribute(EXCHANGE_ATTRIBUTE_NAME, exchange);
                    continuation.resume();
                } else {
                    log.warn("Cannot resume expired continuation of exchangeId: {}", exchange.getExchangeId());
                }
            }
        });
        if (oldTccl != null) {
            restoreTccl(exchange, oldTccl);
        }
        // method again when its resumed
        return;
    }
    try {
        // now lets output to the response
        if (log.isTraceEnabled()) {
            log.trace("Resumed continuation and writing response for exchangeId: {}", result.getExchangeId());
        }
        Integer bs = consumer.getEndpoint().getResponseBufferSize();
        if (bs != null) {
            log.trace("Using response buffer size: {}", bs);
            response.setBufferSize(bs);
        }
        consumer.getBinding().writeResponse(result, response);
    } catch (IOException e) {
        log.error("Error processing request", e);
        throw e;
    } catch (Exception e) {
        log.error("Error processing request", e);
        throw new ServletException(e);
    } finally {
        consumer.doneUoW(result);
    }
}
Also used : DefaultExchange(org.apache.camel.impl.DefaultExchange) Continuation(org.eclipse.jetty.continuation.Continuation) AsyncCallback(org.apache.camel.AsyncCallback) IOException(java.io.IOException) HttpConsumer(org.apache.camel.http.common.HttpConsumer) ServletException(javax.servlet.ServletException) TimeoutException(java.util.concurrent.TimeoutException) IOException(java.io.IOException) DefaultExchange(org.apache.camel.impl.DefaultExchange) Exchange(org.apache.camel.Exchange) ServletException(javax.servlet.ServletException) HttpMessage(org.apache.camel.http.common.HttpMessage) HttpCommonEndpoint(org.apache.camel.http.common.HttpCommonEndpoint) TimeoutException(java.util.concurrent.TimeoutException)

Example 2 with HttpCommonEndpoint

use of org.apache.camel.http.common.HttpCommonEndpoint in project camel by apache.

the class JettyHttpClientOptionsTest method testCustomHttpBinding.

@Test
public void testCustomHttpBinding() throws Exception {
    // assert jetty was configured with our timeout
    HttpCommonEndpoint jettyEndpoint = context.getEndpoint("http://localhost:{{port}}/myapp/myservice?httpClient.soTimeout=5555", HttpCommonEndpoint.class);
    assertNotNull("Jetty endpoint should not be null ", jettyEndpoint);
    HttpProducer producer = (HttpProducer) jettyEndpoint.createProducer();
    assertEquals("Get the wrong http client parameter", 5555, producer.getHttpClient().getParams().getSoTimeout());
    // send and receive
    Object out = template.requestBody("http://localhost:{{port}}/myapp/myservice", "Hello World");
    assertEquals("Bye World", context.getTypeConverter().convertTo(String.class, out));
}
Also used : HttpCommonEndpoint(org.apache.camel.http.common.HttpCommonEndpoint) HttpProducer(org.apache.camel.component.http.HttpProducer) Test(org.junit.Test)

Example 3 with HttpCommonEndpoint

use of org.apache.camel.http.common.HttpCommonEndpoint in project camel by apache.

the class JettyHttpClientOptionsTest method testProxySettingOfJettyHttpClient.

@Test
public void testProxySettingOfJettyHttpClient() throws Exception {
    // setup the Proxy setting through the URI
    HttpCommonEndpoint jettyEndpoint = context.getEndpoint("jetty://http://localhost:{{port}}/proxy/setting?proxyHost=192.168.0.1&proxyPort=9090", HttpCommonEndpoint.class);
    assertNotNull("Jetty endpoint should not be null ", jettyEndpoint);
    JettyHttpProducer producer = (JettyHttpProducer) jettyEndpoint.createProducer();
    assertProxyAddress(producer.getClient(), "192.168.0.1", 9090);
    // setup the context properties
    context.getProperties().put("http.proxyHost", "192.168.0.2");
    context.getProperties().put("http.proxyPort", "8080");
    jettyEndpoint = context.getEndpoint("jetty://http://localhost:{{port}}/proxy2/setting", HttpCommonEndpoint.class);
    producer = (JettyHttpProducer) jettyEndpoint.createProducer();
    assertProxyAddress(producer.getClient(), "192.168.0.2", 8080);
    context.getProperties().clear();
}
Also used : HttpCommonEndpoint(org.apache.camel.http.common.HttpCommonEndpoint) Test(org.junit.Test)

Example 4 with HttpCommonEndpoint

use of org.apache.camel.http.common.HttpCommonEndpoint in project camel by apache.

the class JettyHttpComponent method disconnect.

/**
     * Disconnects the URL specified on the endpoint from the specified processor.
     */
@Override
public void disconnect(HttpConsumer consumer) throws Exception {
    // If the connector is not needed anymore then stop it
    HttpCommonEndpoint endpoint = consumer.getEndpoint();
    String connectorKey = getConnectorKey(endpoint);
    synchronized (CONNECTORS) {
        ConnectorRef connectorRef = CONNECTORS.get(connectorKey);
        if (connectorRef != null) {
            connectorRef.servlet.disconnect(consumer);
            if (connectorRef.decrement() == 0) {
                connectorRef.server.removeConnector(connectorRef.connector);
                connectorRef.connector.stop();
                connectorRef.server.stop();
                CONNECTORS.remove(connectorKey);
                // registered MBeans when Camel is done with the managed objects.
                if (mbContainer != null) {
                    this.removeServerMBean(connectorRef.server);
                //mbContainer.removeBean(connectorRef.connector);
                }
            }
        }
    }
}
Also used : HttpCommonEndpoint(org.apache.camel.http.common.HttpCommonEndpoint)

Aggregations

HttpCommonEndpoint (org.apache.camel.http.common.HttpCommonEndpoint)4 Test (org.junit.Test)2 IOException (java.io.IOException)1 TimeoutException (java.util.concurrent.TimeoutException)1 ServletException (javax.servlet.ServletException)1 AsyncCallback (org.apache.camel.AsyncCallback)1 Exchange (org.apache.camel.Exchange)1 HttpProducer (org.apache.camel.component.http.HttpProducer)1 HttpConsumer (org.apache.camel.http.common.HttpConsumer)1 HttpMessage (org.apache.camel.http.common.HttpMessage)1 DefaultExchange (org.apache.camel.impl.DefaultExchange)1 Continuation (org.eclipse.jetty.continuation.Continuation)1