use of org.apache.camel.Route in project ddf by codice.
the class HttpProxyCamelHttpTransportServlet method doService.
@Override
protected void doService(HttpServletRequest oldRequest, HttpServletResponse response) throws ServletException, IOException {
// Wrap request and clean the query String
HttpProxyWrappedCleanRequest request = new HttpProxyWrappedCleanRequest(oldRequest);
log.trace("Service: {}", LogSanitizer.sanitize(request));
// Is there a consumer registered for the request.
HttpConsumer consumer = resolve(request);
if (consumer == null) {
String path = request.getPathInfo();
log.trace("Service Request Path = {}", LogSanitizer.sanitize(path));
String endpointName = getEndpointNameFromPath(path);
log.trace("Endpoint Name = {}", LogSanitizer.sanitize(endpointName));
Route route = camelContext.getRoute(endpointName);
try {
if (route != null) {
connect((HttpConsumer) route.getConsumer());
}
} catch (Exception e) {
log.debug("Exception while creating consumer", e);
}
consumer = resolve(request);
}
try {
if (consumer == null) {
log.debug("No consumer to service request {}", LogSanitizer.sanitize(request));
response.sendError(HttpServletResponse.SC_NOT_FOUND);
return;
}
// are we suspended?
if (consumer.getEndpoint().isSuspended()) {
log.debug("Consumer suspended, cannot service request {}", LogSanitizer.sanitize(request));
response.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
return;
}
if (consumer.getEndpoint().getHttpMethodRestrict() != null && !consumer.getEndpoint().getHttpMethodRestrict().equals(request.getMethod())) {
response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
return;
}
if ("TRACE".equals(request.getMethod()) && !consumer.getEndpoint().isTraceEnabled()) {
response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
return;
}
} catch (IOException e) {
LOGGER.warn("Could not send error due to: {}", e.getMessage());
LOGGER.debug("Could not send error due to: ", e);
}
if (consumer == null) {
return;
}
// create exchange and set data on it
Exchange exchange = new DefaultExchange(consumer.getEndpoint(), ExchangePattern.InOut);
if (consumer.getEndpoint().isBridgeEndpoint()) {
exchange.setProperty(Exchange.SKIP_GZIP_ENCODING, Boolean.TRUE);
}
if (consumer.getEndpoint().isDisableStreamCache()) {
exchange.setProperty(Exchange.DISABLE_HTTP_STREAM_CACHE, Boolean.TRUE);
}
// we override the classloader before building the HttpMessage just in case the binding
// does some class resolution
ClassLoader oldTccl = overrideTccl(exchange);
HttpHelper.setCharsetFromContentType(request.getContentType(), exchange);
exchange.setIn(new HttpMessage(exchange, consumer.getEndpoint(), request, response));
// set context path as header
String contextPath = consumer.getEndpoint().getPath();
exchange.getIn().setHeader("CamelServletContextPath", contextPath);
String httpPath = (String) exchange.getIn().getHeader(Exchange.HTTP_PATH);
// here we just remove the CamelServletContextPath part from the HTTP_PATH
if (contextPath != null && httpPath.startsWith(contextPath)) {
exchange.getIn().setHeader(Exchange.HTTP_PATH, httpPath.substring(contextPath.length()));
}
// we want to handle the UoW
try {
consumer.createUoW(exchange);
} catch (Exception e) {
log.debug(PROCESSING_ERROR_MSG, e);
throw new ServletException(e);
}
try {
if (log.isTraceEnabled()) {
log.trace("Processing request for exchangeId: {}", exchange.getExchangeId());
}
// process the exchange
consumer.getProcessor().process(exchange);
} catch (Exception e) {
exchange.setException(e);
}
try {
// now lets output to the response
if (log.isTraceEnabled()) {
log.trace("Writing response for exchangeId: {}", exchange.getExchangeId());
}
Integer bs = consumer.getEndpoint().getResponseBufferSize();
if (bs != null) {
log.trace("Using response buffer size: {}", bs);
response.setBufferSize(bs);
}
consumer.getBinding().writeResponse(exchange, response);
} catch (IOException e) {
log.debug(PROCESSING_ERROR_MSG, e);
throw e;
} catch (Exception e) {
log.debug(PROCESSING_ERROR_MSG, e);
throw new ServletException(e);
} finally {
consumer.doneUoW(exchange);
restoreTccl(exchange, oldTccl);
}
}
Aggregations