mirrorframe.java

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

JAVA
216
字号
// MirrorFrame.java// $Id: MirrorFrame.java,v 1.13 2004/02/12 10:49:20 ylafon Exp $// (c) COPYRIGHT MIT and INRIA, 1998// Please first read the full copyright statement in file COPYRIGHT.htmlpackage org.w3c.jigsaw.proxy ;import java.net.URL;import java.io.IOException;import org.w3c.www.http.HTTP;import org.w3c.tools.resources.Attribute;import org.w3c.tools.resources.AttributeHolder;import org.w3c.tools.resources.AttributeRegistry;import org.w3c.tools.resources.BooleanAttribute;import org.w3c.tools.resources.LookupResult;import org.w3c.tools.resources.LookupState;import org.w3c.tools.resources.ProtocolException;import org.w3c.tools.resources.Resource;import org.w3c.tools.resources.ResourceFrame;import org.w3c.tools.resources.StringAttribute;import org.w3c.jigsaw.http.HTTPException;import org.w3c.jigsaw.http.Reply;import org.w3c.jigsaw.http.Request;import org.w3c.jigsaw.frames.HTTPFrame;public class MirrorFrame extends ForwardFrame {    /**     * Attribute index - The site we are mirroring.     */    protected static int ATTR_MIRRORS = -1;    /**     * Attribute index - Do we mirror from root or relative     */    protected static int ATTR_PARTIAL = -1;    static {	Class     c = null;	Attribute a = null;	try {	    c = Class.forName("org.w3c.jigsaw.proxy.MirrorFrame");	} catch (Exception ex) {	    ex.printStackTrace();	    System.exit(1);	}	// Register the mirrored site attribute:	a = new StringAttribute("mirrors"				, null				, Attribute.EDITABLE);	ATTR_MIRRORS = AttributeRegistry.registerAttribute(c, a);	// Do we allow sub mirroring (aka parts of the site)	// and not from root	a = new BooleanAttribute("partial"				 , Boolean.FALSE				 , Attribute.EDITABLE);	ATTR_PARTIAL = AttributeRegistry.registerAttribute(c, a);    }        protected URL mirrors = null;    public static final String MIRROR_PATH = "MIRROR_PATH";	    /**     * Get the mirrors site attribute value.     * @return The String encoded URL of the site we are mirroring here.     */    public String getMirrors() {	return getString(ATTR_MIRRORS, null);    }    /**     * Get the mirrors site attribute value.     * @return The String encoded URL of the site we are mirroring here.     */    public boolean isPartialMirroring() {	return getBoolean(ATTR_PARTIAL, false);    }   /**     * Catch assignment to the mirror attribute, to update our cached URL.     * @param idx The slot to set.     * @param value It's new value.     */    public void setValue(int idx, Object value) {	super.setValue(idx, value);	if ( idx == ATTR_MIRRORS ) {	    try {		mirrors = new URL(getMirrors());	    } catch (Exception ex) {		mirrors = null;	    }	}    }    /**     * @param request the incomming request     * @param rep the client reply     * @return A Reply instance     * @exception HTTPException if processing the request failed.     * @exception IOException if an IO error occurs.     */    protected Reply dupReply(Request request			     , org.w3c.www.protocol.http.Reply rep) 	throws HTTPException, IOException    {	Reply reply = super.dupReply(request, rep);	// Tweak redirections ! Wow this is getting real nifty :-)	switch(reply.getStatus()) {	  case HTTP.MOVED_PERMANENTLY:	  case HTTP.TEMPORARY_REDIRECT:	  case HTTP.FOUND:	  case HTTP.SEE_OTHER:	      // Have fun !	      String location = rep.getLocation();	      if ((mirrors != null) && (location != null)) {		  try {		      URL uloc = new URL(request.getURL(), location);		      URL loc  = getURL(request);		      URL fake = null;		      if (isPartialMirroring()) {			  fake = new URL(request.getURL().getProtocol()					 , loc.getHost()					 , loc.getPort()					 , getURLPath()+uloc.getFile());		      } else if (location.startsWith(mirrors.toString())) {			  fake = new URL(request.getURL().getProtocol()					 , loc.getHost()					 , loc.getPort()					 , uloc.getFile());		      } else {			  fake = uloc;		      }		      if (fake != null) {			  reply.setLocation(fake);		      }		  } catch (Exception ex) {		  }	      }	}	return reply;    }    /**     * @param request the incomming request     * @return A client Request instance.     * @exception HTTPException if processing the request failed.     * @exception IOException if an IO error occurs.     */    protected org.w3c.www.protocol.http.Request dupRequest(Request request) 	throws HTTPException, IOException    {	org.w3c.www.protocol.http.Request req = super.dupRequest(request);	// Tweak the URL :-)	if (isPartialMirroring()) {	    String requrl = request.getURL().getFile();	    String respath = getURLPath();	    if (requrl.startsWith(respath)) {		String nurl = requrl.substring(respath.length());		req.setURL(new URL(mirrors, nurl));	    } else {		req.setURL(new URL(mirrors, requrl));	    }	} else {	    req.setURL(new URL(mirrors, request.getURL().getFile()));	}	return req;    }        /**     * Lookup for a mirrored  resource.     * @param ls The current lookup state     * @param lr The result     * @return true if lookup is done.     * @exception org.w3c.tools.resources.ProtocolException If an error      * relative to the protocol occurs     */    public boolean lookupOther(LookupState ls, LookupResult lr)	throws org.w3c.tools.resources.ProtocolException     {	// Get the full URL from the request:	Request request = (Request) ls.getRequest();	URL     url     = request.getURL();	if ( ls.isInternal() )	    return super.lookupOther(ls, lr);	if ( mirrors != null ) {	    request.setProxy(true);	    lr.setTarget(this.getResource().getResourceReference());	    return true;	} 	// Emit a not found:	Reply error = request.makeReply(HTTP.NOT_FOUND);	if (request.getMethod().equals("GET"))	    error.setContent("Target resource not found.");	lr.setTarget(null);	lr.setReply(error);	return true;    }    public void initialize(Object values[]) {	super.initialize(values);	String strmirrors = getMirrors();	try {	    mirrors = new URL(strmirrors);	} catch (Exception ex) {	    mirrors = null;	}    }}

⌨️ 快捷键说明

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