servletwrapperframe.java

来自「很棒的web服务器源代码」· Java 代码 · 共 248 行

JAVA
248
字号
// ServletWrapperFrame.java// $Id: ServletWrapperFrame.java,v 1.23 2003/02/25 17:50:43 ylafon Exp $// (c) COPYRIGHT MIT and INRIA, 1996.// Please first read the full copyright statement in file COPYRIGHT.htmlpackage org.w3c.jigsaw.servlet;import javax.servlet.ServletException;import javax.servlet.UnavailableException;import java.io.IOException;import java.io.PipedInputStream;import java.io.PipedOutputStream;import org.w3c.www.mime.MimeType;import org.w3c.www.http.HTTP;import org.w3c.www.http.HttpEntityMessage;import org.w3c.www.http.HttpMessage;import org.w3c.www.http.HttpReplyMessage;import org.w3c.jigsaw.http.httpd;import org.w3c.jigsaw.http.HTTPException;import org.w3c.jigsaw.http.Reply;import org.w3c.jigsaw.http.Request;import org.w3c.jigsaw.frames.HTTPFrame;import org.w3c.tools.resources.FramedResource;import org.w3c.tools.resources.LookupResult;import org.w3c.tools.resources.LookupState;import org.w3c.tools.resources.ProtocolException;import org.w3c.tools.resources.ReplyInterface;import org.w3c.tools.resources.RequestInterface;import org.w3c.tools.resources.Resource;import org.w3c.tools.resources.ResourceException;import org.w3c.tools.resources.ResourceFrame;import org.w3c.tools.resources.ServerInterface;import org.w3c.tools.resources.ProtocolException;import org.w3c.tools.resources.ResourceException;/** * @author Alexandre Rafalovitch <alex@access.com.au> * @author Anselm Baird-Smith <abaird@w3.org> * @author Benoit Mahe <bmahe@w3.org> */public class ServletWrapperFrame extends HTTPFrame {    protected ServletWrapper wrapper = null;    /**     * Register our resource. Must be an instance of ServletWrapper.     */    public void registerResource(FramedResource resource) {	super.registerOtherResource(resource);	if (resource instanceof ServletWrapper)	    wrapper = (ServletWrapper) resource;    }    /**     * Create a reply to answer to request on this file.     * This method will create a suitable reply (matching the given request)     * and will set all its default header values to the appropriate      * values. The reply will not have LastModified field setted.     * @param request The request to make a reply for.     * @return An instance of Reply, suited to answer this request.     */    public Reply createDefaultReply(Request request, int status) {	Reply reply = super.createDefaultReply(request, status);	reply.setLastModified( -1 );	return reply;    }    /**     * Dispatch the give request to our servlet.     * <p>If the servlet cannot be inititalized, we just throw an error message     * otherwise, we just delegate that request processing to the underlying      * servlet instance.     * @param request The request to be processed.     * @exception ProtocolException If the wrapped servlet is not initialized.     * @exception ResourceException If the resource got a fatal error.     */    public ReplyInterface perform(RequestInterface req)	throws ProtocolException, ResourceException    {	ReplyInterface repi = performFrames(req);	if (repi != null)	    return repi;	if (! checkRequest(req))	    return null;	Request request = (Request) req;	PipedInputStream pis = null;	if (wrapper == null) {	    Reply reply = request.makeReply(HTTP.INTERNAL_SERVER_ERROR);	    reply.setContent("Servlet Wrapper Frame not configured properly: "+			     "must be attached to a ServletWrapper.");	    throw new HTTPException(reply);	}	try {	    wrapper.checkServlet();	} catch (ClassNotFoundException ex) {	    Reply reply = request.makeReply(HTTP.INTERNAL_SERVER_ERROR);	    reply.setContent("The server was unable to find the "+			     "servlet class : "+ex.getMessage());	    if ( wrapper.debug )		ex.printStackTrace();	    throw new HTTPException(reply);	} catch (ServletException ex) {	    Reply reply = request.makeReply(HTTP.INTERNAL_SERVER_ERROR);	    reply.setContent("The server was unable to initialize the "+			     "servlet : "+ex.getMessage());	    if ( wrapper.debug )		ex.printStackTrace();	    throw new HTTPException(reply);	}	// Check that the servlet has been initialized properly:	if ( ! wrapper.isInited() ) {	    Reply reply = request.makeReply(HTTP.INTERNAL_SERVER_ERROR);	    reply.setContent("Servlet not configured properly");	    throw new HTTPException(reply);	} 	// Dispatch the request:	Reply reply = createDefaultReply(request, HTTP.OK);	reply.setContentType(MimeType.TEXT_HTML);	try {	    if (request.hasState(JigsawHttpServletResponse.INCLUDED)) {		wrapper.service(request, reply);	    } else {		pis = new PipedInputStream();		request.setState(JigsawHttpServletResponse.STREAM, pis);		PipedOutputStream pos = new PipedOutputStream(pis);		reply.setState(JigsawHttpServletResponse.STREAM, pos);		reply.setStream(pis);		Object o = new Object();		reply.setState(JigsawHttpServletResponse.MONITOR, o);		// wait until the reply is constructed by the processing thread		ServerInterface server = getServer();		if (server instanceof httpd) {		    synchronized (o) {			wrapper.service(request, reply);			o.wait((long)((httpd)server).getRequestTimeOut());		    }		    Object strm;		    strm = reply.getState(JigsawHttpServletResponse.STREAM);		    if (strm != null) {			// it is a timeout			try {			    pis.close();			    pos.close();			} catch (IOException ex) {};			if (strm instanceof PipedOutputStream) {			    Thread r;			    r = (Thread) reply.getState(ServletWrapper.RUNNER);			    if (r != null) {				r.interrupt();			    }			    throw new ServletException("Timed out");			}		    }		} else {		    synchronized (o) {			wrapper.service(request, reply);			o.wait();		    }		}	    }	} catch (UnavailableException uex) {	     reply = request.makeReply(HTTP.SERVICE_UNAVAILABLE);	     if (uex.isPermanent()) {		 reply.setContent("<h2>The servlet is permanently "+				  "unavailable :</h2>"+				  "Details: <b>"+uex.getMessage()+"</b>");	     } else {		 int delay = uex.getUnavailableSeconds();		 if (delay > 0) {		     reply.setRetryAfter(delay);		     reply.setContent("<h2>The servlet is temporarily "+				      "unavailable :</h2>"+				      "Delay : "+delay+				      " seconds<br><br>Details: <b>"+				      uex.getMessage()+"</b>");		 } else {		     reply.setContent("<h2>The servlet is temporarily "+				      "unavailable :</h2>"+				      "Details: <b>"+uex.getMessage()+"</b>");		 }	     }	     if (pis != null) {		 try {		     pis.close();		 } catch (IOException ioex) {}	     }	} catch (Exception ex) {	    if ( wrapper.debug )		ex.printStackTrace();	    reply = request.makeReply(HTTP.INTERNAL_SERVER_ERROR);	    reply.setContent("Servlet has thrown exception:" + ex.toString());	    if (pis != null) {		try {		    pis.close();		} catch (IOException ioex) {}	    }	}	if (reply != null) {	    reply.setDynamic(true);	}	return reply;    }    /**     * Jigsaw's lookup on servlets.     * Once here, we have reached a leaf servlet (or at least the remaining     * lookup is to be done at the servlet itself). We keep track of the     * <em>path info</em> and mark that servlet as the target of request.     * @param ls The lookup state.     * @param lr The lookup result.     * @exception ProtocolException If some error occurs.     */    protected boolean lookupOther(LookupState ls, LookupResult lr)	throws ProtocolException    {	// Get the extra path information:	String extraPath = ls.getRemainingPath(true);	if ((extraPath == null) || extraPath.equals(""))	    extraPath = "/";	// Keep this path info into the request, if possible:	Request request = (Request) ls.getRequest();	if ( request != null ) {	    if (request.getState(JigsawRequestDispatcher.PATH_INFO_P) == null)		request.setState(JigsawRequestDispatcher.PATH_INFO_P, 				 extraPath);	}	lr.setTarget(resource.getResourceReference());	return super.lookupOther(ls, lr);    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?