metahandlerhandler.java

来自「一款Java实现的HTTP代理服务器」· Java 代码 · 共 105 行

JAVA
105
字号
package rabbit.proxy;import java.io.IOException;import java.net.MalformedURLException;import java.net.URL;import java.util.StringTokenizer;import rabbit.http.HttpHeader;import rabbit.meta.MetaHandler;import rabbit.util.Coder;import rabbit.util.SProperties;import rabbit.util.TrafficLogger;class MetaHandlerHandler {    /** Handle a meta page.     * @param header the request being made.     */    public void handleMeta (Connection con, HttpHeader header, 			    TrafficLogger tlProxy, TrafficLogger tlClient) 	throws IOException {	con.getCounter ().inc ("Meta pages requested");	URL url = null;	try {	    url = new URL (header.getRequestURI ());	} catch (MalformedURLException e) {	    // this should not happen since HTTPBaseHandler managed to do it...	}	String file = url.getFile ().substring (1);  // remove initial '/'	if (file.length () == 0)	    file = "FileSender/";		int index = -1;	String args = "";	if ((index = file.indexOf ("?")) >= 0) {	    args = file.substring (index + 1);	    file = file.substring (0, index);	}	SProperties htab = splitArgs (args); 	if ((index = file.indexOf ("/")) >= 0) {	    String fc = file.substring (index + 1);	    file = file.substring (0, index);	    htab.put ("argstring", fc);	}	String error = null;	try {	    if (file.indexOf (".") < 0)		file = "rabbit.meta." + file;	    	    Class<? extends MetaHandler> cls = 		Class.forName (file).asSubclass (MetaHandler.class);	    MetaHandler mh = null;	    mh = cls.newInstance ();	    mh.handle (header, htab, con, tlProxy, tlClient);	    con.getCounter ().inc ("Meta pages handled");		    // Now take care of every error...	} catch (NoSuchMethodError e) {	    error = "Given metahandler doesnt have a public no-arg constructor:"		+ file + ", " + e;	} catch (ClassCastException e) {	    error = "Given metapage is not a MetaHandler:" + file + ", " + e;	} catch (ClassNotFoundException e) {	    error = "Couldnt find class:" + file + ", " + e;	} catch (InstantiationException e) {	    error = "Couldnt instantiate metahandler:" + file + ", " + e;	} catch (IllegalAccessException e) {	    error = "Que? metahandler access violation?:" + file + ", " + e;	} catch (IllegalArgumentException e) {	    error = "Strange name of metapage?:" + file + ", " + e;	} 	if (error != null) {	    con.getLogger ().logWarn (error);	    con.doError (400, error);	    return;	}    }    /** Splits the CGI-paramsstring into variables and values.     *  put these values into a hashtable for easy retrival     * @param params the CGI-querystring.     * @return a map with type->value maps for the CGI-querystring     */    public SProperties splitArgs (String params) {	SProperties htab = new SProperties ();	StringTokenizer st = new StringTokenizer (params, "=&", true);	String key = null;	while (st.hasMoreTokens ()) {	    String next = st.nextToken ();	    if (next.equals ("=")) {		// nah..	    } else if (next.equals ("&")) {		if (key != null) {		    htab.put (key, "");		    key = null;		}	    } else if (key == null) {		key = next;	    } else {		htab.put (key, Coder.URLdecode (next));		key = null;	    }	}	return htab;    }}

⌨️ 快捷键说明

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