1
18
19 package io.undertow.servlet.handlers;
20
21 import java.io.IOException;
22
23 import javax.servlet.Servlet;
24 import javax.servlet.ServletException;
25 import javax.servlet.ServletRequest;
26 import javax.servlet.ServletResponse;
27 import javax.servlet.UnavailableException;
28
29 import io.undertow.server.HttpServerExchange;
30 import io.undertow.server.HttpHandler;
31 import io.undertow.servlet.UndertowServletLogger;
32 import io.undertow.servlet.api.InstanceHandle;
33 import io.undertow.servlet.core.ManagedServlet;
34 import io.undertow.util.StatusCodes;
35
36
43 public class ServletHandler implements HttpHandler {
44
45 private final ManagedServlet managedServlet;
46
47
48 public ServletHandler(final ManagedServlet managedServlet) {
49 this.managedServlet = managedServlet;
50 }
51
52 @Override
53 public void handleRequest(final HttpServerExchange exchange) throws IOException, ServletException {
54 if (managedServlet.isPermanentlyUnavailable()) {
55 UndertowServletLogger.REQUEST_LOGGER.debugf("Returning 404 for servlet %s due to permanent unavailability", managedServlet.getServletInfo().getName());
56 exchange.setStatusCode(StatusCodes.NOT_FOUND);
57 return;
58 }
59
60 if (managedServlet.isTemporarilyUnavailable()) {
61 UndertowServletLogger.REQUEST_LOGGER.debugf("Returning 503 for servlet %s due to temporary unavailability", managedServlet.getServletInfo().getName());
62 exchange.setStatusCode(StatusCodes.SERVICE_UNAVAILABLE);
63 return;
64 }
65 final ServletRequestContext servletRequestContext = exchange.getAttachment(ServletRequestContext.ATTACHMENT_KEY);
66 if(!managedServlet.getServletInfo().isAsyncSupported()) {
67 servletRequestContext.setAsyncSupported(false);
68 }
69 ServletRequest request = servletRequestContext.getServletRequest();
70 ServletResponse response = servletRequestContext.getServletResponse();
71 InstanceHandle<? extends Servlet> servlet = null;
72 try {
73 servlet = managedServlet.getServlet();
74 servlet.getInstance().service(request, response);
75
76
77
78
79
80
81
82
83
84
85
86 } catch (UnavailableException e) {
87 managedServlet.handleUnavailableException(e);
88 if (e.isPermanent()) {
89 exchange.setStatusCode(StatusCodes.NOT_FOUND);
90 } else {
91 exchange.setStatusCode(StatusCodes.SERVICE_UNAVAILABLE);
92 }
93 } finally {
94 if(servlet != null) {
95 servlet.release();
96 }
97 }
98 }
99
100 public ManagedServlet getManagedServlet() {
101 return managedServlet;
102 }
103 }
104