Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * JBoss, Home of Professional Open Source.
   * Copyright 2012 Red Hat, Inc., and individual contributors
   * as indicated by the @author tags.
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
  *     http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
 
 package io.undertow.servlet.handlers;
 
 import java.util.Date;
 
 
The handler that is responsible for invoking the servlet

TODO: do we want to move lifecycle considerations out of this handler?

Author(s):
Stuart Douglas
 
 public class ServletHandler implements HttpHandler {
 
     private final ManagedServlet managedServlet;
 
     private static final AtomicLongFieldUpdater<ServletHandlerunavailableUntilUpdater = AtomicLongFieldUpdater.newUpdater(ServletHandler.class"unavailableUntil");
 
     @SuppressWarnings("unused")
     private volatile long unavailableUntil = 0;
 
     public ServletHandler(final ManagedServlet managedServlet) {
         this. = managedServlet;
     }
 
     @Override
     public void handleRequest(final HttpServerExchange exchangethrows IOExceptionServletException {
         if (.isPermanentlyUnavailable()) {
             ..debugf("Returning 404 for servlet %s due to permanent unavailability".getServletInfo().getName());
             exchange.setResponseCode(404);
             return;
         }
 
         long until = ;
         if (until != 0) {
             ..debugf("Returning 503 for servlet %s due to temporary unavailability".getServletInfo().getName());
             if (System.currentTimeMillis() < until) {
                 exchange.setResponseCode(503);
                 return;
             } else {
                 .compareAndSet(thisuntil, 0);
             }
         }
         if(!.getServletInfo().isAsyncSupported()) {
             exchange.putAttachment(.false);
         }
         final ServletRequestContext servletRequestContext = exchange.getAttachment(.);
         ServletRequest request = servletRequestContext.getServletRequest();
         ServletResponse response = servletRequestContext.getServletResponse();
         InstanceHandle<? extends Servletservlet = null;
         try {
             servlet = .getServlet();
             servlet.getInstance().service(requestresponse);
 
             //according to the spec we have to call AsyncContext.complete() at this point
             //straight after the service method
             //not super sure about this, surely it would make more sense to do this when the request has returned to the container, however the spec is quite clear wording wise
             //todo: should we actually enable this? Apparently other containers do not do it
             //if(!request.isAsyncStarted()) {
             //    AsyncContextImpl existingAsyncContext = servletRequestContext.getOriginalRequest().getAsyncContextInternal();
             //    if (existingAsyncContext != null) {
             //        existingAsyncContext.complete();
             //    }
             //}
         } catch (UnavailableException e) {
             if (e.isPermanent()) {
                .stop();
                .setPermanentlyUnavailable(true);
                exchange.setResponseCode(404);
            } else {
                .set(this, System.currentTimeMillis() + e.getUnavailableSeconds() * 1000);
                exchange.setResponseCode(503);
            }
        } finally {
            if(servlet != null) {
                servlet.release();
            }
        }
    }
    public ManagedServlet getManagedServlet() {
        return ;
    }
New to GrepCode? Check out our FAQ X