standardresponseheaders.java

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

JAVA
358
字号
package rabbit.proxy;import java.io.PrintWriter;import java.io.StringWriter;import java.net.MalformedURLException;import java.net.URL;import java.util.Date;import java.util.HashSet;import java.util.List;import java.util.Properties;import java.util.Set;import rabbit.http.HttpDateParser;import rabbit.http.HttpHeader;import rabbit.util.Config;/** A class that can create standard response headers.  * * @author <a href="mailto:robo@khelekore.org">Robert Olofsson</a> */class StandardResponseHeaders implements HttpGenerator {    /** The connection handling the response. */    private Connection con;    public StandardResponseHeaders (Connection con) {	this.con = con;    }    /** Get a new HttpHeader. This is the same as      * getHeader ("HTTP/1.0 200 OK");     * @return a new HttpHeader.     */    public HttpHeader getHeader () {	return getHeader ("HTTP/1.1 200 OK");    }        /** Get a new HttpHeader initialized with some data.     * @param statusLine the statusline of the response.     * @return a new HttpHeader.     */    public HttpHeader getHeader (String statusLine) {	HttpHeader ret = new HttpHeader ();	ret.setStatusLine (statusLine);	ret.setHeader ("Server", con.getProxy ().getServerIdentity ());	ret.setHeader ("Content-type", "text/html");	ret.setHeader ("Pragma", "no-cache");	ret.setHeader ("Date", HttpDateParser.getDateString (new Date ()));	return ret;        }    /** Get a 200 Ok header     * @return a 200 HttpHeader .     */    public HttpHeader get200 () {	HttpHeader header = getHeader ("HTTP/1.1 200 Ok");  	return header;    }    private void copyHeaderIfExists (String type, 				     HttpHeader from, HttpHeader to) {	String d = from.getHeader (type);	if (d != null)	    to.setHeader (type, d);	    }    public HttpHeader get206 (String ifRange, HttpHeader header) {	HttpHeader ret = new HttpHeader ();	ret.setStatusLine ("HTTP/1.1 206 Partial Content");	boolean tiny = ifRange != null;	if (tiny) {	    String etag = header.getHeader ("ETag");	    if (etag != null && con.checkStrongEtag (ifRange, etag))		tiny = false;	}	if (tiny) {	    copyHeaderIfExists ("Date", header, ret);	    copyHeaderIfExists ("ETag", header, ret);	    copyHeaderIfExists ("Content-Location", header, ret);	    	    //copyHeaderIfExists ("Expires", header, ret);	    /* should do this also in certain conditions...	       copyHeadersIfExists ("Cache-Control", header, ret);	       copyHeadersIfExists ("Vary", header, ret);	    */	} else {	    header.copyHeader (ret);	}	return ret;    }        /** Get a 304 Not Modified header for the given old header     * @param oldresp the cached header.     * @return a 304 HttpHeader .     */    public HttpHeader get304 (HttpHeader oldresp) {	HttpHeader header = getHeader ("HTTP/1.1 304 Not Modified");  	copyHeaderIfExists ("Date", oldresp, header);	copyHeaderIfExists ("Content-Location", oldresp, header);	copyHeaderIfExists ("ETag", oldresp, header);	String etag = header.getHeader ("Etag");	if (etag != null && !con.isWeak (etag))	    copyHeaderIfExists ("Expires", oldresp, header);	List<String> ccs = oldresp.getHeaders ("Cache-Control");	for (int i = 0, s = ccs.size (); i < s; i++) 	    header.addHeader ("Cache-Control", ccs.get (i));	ccs = oldresp.getHeaders ("Vary");	for (int i = 0, s = ccs.size (); i < s; i++) 	    header.addHeader ("Vary", (String)ccs.get (i));		return header;    }    /** Get a 400 Bad Request header for the given exception.     * @param exception the Exception handled.     * @return a HttpHeader for the exception.     */    public HttpHeader get400 (Exception exception) {	// in most cases we should have a header out already, but to be sure...	HttpHeader header = getHeader ("HTTP/1.1 400 Bad Request ");  	StringBuilder accreq = 	    new StringBuilder (HtmlPage.getPageHeader (con, "400 Bad Request") +			       "Unable to handle request:<br><b><XMP>\n" + 			       exception +			       "</XMP></b></body></html>\n");	header.setContent (accreq.toString ());	return header;    }    /** Get a 403 Forbidden header.     * @return a HttpHeader.     */    public HttpHeader get403 () {	// in most cases we should have a header out already, but to be sure...	HttpHeader header = getHeader ("HTTP/1.1 403 Forbidden");  	StringBuilder accreq = 	    new StringBuilder (HtmlPage.getPageHeader (con, "403 Forbidden") +			       "That is forbidden</body></html>");	header.setContent (accreq.toString ());	return header;    }    /** Get a 404 File not found.     * @return a HttpHeader.     */    public HttpHeader get404 (String file) {	// in most cases we should have a header out already, but to be sure...	HttpHeader header = getHeader ("HTTP/1.1 404 File not found");  	StringBuilder accreq = 	    new StringBuilder (HtmlPage.getPageHeader (con, "404 File not found") +			       "File '" + file + "' not found.</body></html>");	header.setContent (accreq.toString ());	return header;    }    /** Get a 407 Proxy Authentication Required for the given realm and url.     * @param realm the realm that requires auth.     * @param url the URL of the request made.     * @return a suitable HttpHeader.     */    public HttpHeader get407 (String realm, URL url) {	HttpHeader header = 	    getHeader ("HTTP/1.1 407 Proxy Authentication Required");	header.setHeader ("Proxy-Authenticate", 			  "Basic realm=\"" + realm + "\"");	String h407 = "407 Proxy Authentication Required";	StringBuilder accreq = 	    new StringBuilder (HtmlPage.getPageHeader (con, h407) +			       "access to: <b>" + url + 			       " </b><br>requires some authentication\n" +			       "</body></html>\n");	header.setContent (accreq.toString ());	return header;    }    /** Get a 412 Precondition Failed header.     * @return a suitable HttpHeader.     */    public HttpHeader get412 () {	HttpHeader header = getHeader ("HTTP/1.1 412 Precondition Failed");	String sh = "412 Precondition Failed";	StringBuilder accreq = 	    new StringBuilder (HtmlPage.getPageHeader (con, sh) + 			       "</body></html>\n");	header.setContent (accreq.toString ());	return header;    }    /** Get a 414 Request-URI Too Long     * @return a suitable HttpHeader.     */    public HttpHeader get414 () {	HttpHeader header = getHeader ("HTTP/1.1 414 Request-URI Too Long");	String sh = "414 Request-URI Too Long";	StringBuilder accreq = 	    new StringBuilder (HtmlPage.getPageHeader (con, sh) + 			       "</body></html>\n");	header.setContent (accreq.toString ());	return header;    }    /** Get a Requested Range Not Satisfiable for the given exception.     * @param exception the Exception made.     * @return a suitable HttpHeader.     */    public HttpHeader get416 (Throwable exception) {	String sh = "HTTP/1.1 416 Requested Range Not Satisfiable ";	HttpHeader header = getHeader (sh);	String shh = "416 Requested Range Not Satisfiable";	StringBuilder accreq = 	    new StringBuilder (HtmlPage.getPageHeader (con, shh) +			       "Request out of range: " + exception + 			       ".</b>\n</body></html>\n");	header.setContent (accreq.toString ());	return header;    }        /** Get a 417 Expectation Failed header.     * @param expectation the expectation that failed.     * @return a suitable HttpHeader.     */    public HttpHeader get417 (String expectation) {	HttpHeader header = getHeader ("HTTP/1.1 417 Expectation failed");	String sh = "417 Expectation failed";	StringBuilder accreq = 	    new StringBuilder (HtmlPage.getPageHeader (con, sh) +			       "RabbIT does not handle the '" + expectation + 			       "' kind of expectations yet.</b>\n" +			       "</body></html>\n");	header.setContent (accreq.toString ());	return header;    }    /** Get a 500 Internal Server Error header for the given exception.     * @param exception the Exception made.     * @return a suitable HttpHeader.     */    public HttpHeader get500 (Throwable exception) {	// in most cases we should have a header out already, but to be sure...	// normally this only thrashes the page... Too bad.	HttpHeader header = getHeader ("HTTP/1.1 500 Internal Server Error ");  	StringWriter sw = new StringWriter ();	PrintWriter sos = new PrintWriter (sw);	exception.printStackTrace (sos);		Properties sysprop = System.getProperties ();		HttpProxy proxy = con.getProxy ();	Config config = proxy.getConfig ();	String sh = "500 Internal Server Error";	StringBuilder sb = 	    new StringBuilder (HtmlPage.getPageHeader (con, sh));	sb.append ("You have found a bug in RabbIT please report this" + 		   "(together with the URL you tried to visit) to the " +		   "<a href=\"http://www.khelekore.org/rabbit/\" target =" + 		   "\"_top\">RabbIT</a> crew.<br><br>\n" +		   "<font size = 4>Connection status</font><br><hr noshade>\n" +		   "status: " + con.getStatus ()  + "<br>\n" + 		   "started: " + new Date (con.getStarted ()) + "<br>\n" +		   "keepalive: " + con.getKeepalive () + "<br>\n" + 		   "meta: " + con.getMeta () + "<br>\n" +		   "mayusecache: " + con.getMayUseCache () + "<br>\n" + 		   "maycache: " + con.getMayCache () + "<br>\n" + 		   "mayfilter: " + con.getMayFilter () + "<br>\n"+ 		   "requestline: " + con.getRequestLine () + "<br>\n" + 		   "statuscode: " + con.getStatusCode () + "<br>\n" + 		   "extrainfo: " + con.getExtraInfo () + "<br>\n" +								   "contentlength: " + con.getContentLength () + "<br>\n" + 		   "<br>\n" +		   "<font size = 4>Proxy status</font><br>\n<hr noshade>\n" +		   "proxy version: " + proxy.VERSION + "<br>\n" + 		   "proxy identity: " + proxy.getServerIdentity () + "<br>\n" +		   "server host: " + proxy.getHost () + "<br>\n" +		   "server port: " + proxy.getPort () + "<br>\n" +		   "accessfilters: " + 		   config.getProperty ("Filters", "accessfilters") + 		   "<br>\n" + 		   "httpinfilters: " + 		   config.getProperty ("Filters", "httpinfilters") + 		   "<br>\n" + 		   "httpoutfilters:" + 		   config.getProperty ("Filters", "httpoutfilters") +		   "<br>\n<br>\n" + 					       		   "<font size = 4>System properties</font><br>\n" + 		   "<hr noshade>\n" + 		   "java.version: " + 		   sysprop.getProperty ("java.version") + "<br>\n" +		   "java.vendor: " + 		   sysprop.getProperty ("java.vendor") + "<br>\n" +		   "os.name: " + 		   sysprop.getProperty ("os.name") + "<br>\n" +		   "os.version: " + 		   sysprop.getProperty ("os.version") + "<br>\n" +		   "os.arch: " + 		   sysprop.getProperty ("os.arch") + "<br>\n" +		   "error is:<BR><XMP>\n" + sw + 		   "</XMP><br>" + 		   "<hr noshade>\n" +		   "</body></html>\n");	header.setContent (sb.toString ());	return header;    }    String[][] placeTransformers = {	{"www.", ".com"}, 	{"", ".com"}, 	{"www.", ".org"}, 	{"", ".org"}, 	{"www.", ".net"}, 	{"", ".net"}    };    /** Get a 504 Gateway Timeout for the given exception.     * @param exception the Exception made.     * @return a suitable HttpHeader.     */    public HttpHeader get504 (Throwable exception, String requestLine) {	HttpHeader header = getHeader ("HTTP/1.1 504 Gateway Time-out ");		HttpHeader hh = new HttpHeader ();	hh.setRequestLine (requestLine);	String uri = hh.getRequestURI ();	try {	    URL u = new URL (uri);	    StringBuilder content = 		new StringBuilder ("\n\n<br>Did you mean to go to: <ul>");	    Set<String> places = new HashSet<String> ();	    for (int i = 0; i < placeTransformers.length; i++) {		String pre = placeTransformers[i][0];		String suf = placeTransformers[i][1];		String place = getPlace (u, pre, suf); 		if (place != null && !places.contains (place)) {		    content.append ("<li><a href=\"" + place + "\">" + 				    place + "</a></li>\n");		    places.add (place);		}	    }	    content.append ("</ul>");	    header.setContent (content.toString ());	} catch (MalformedURLException e) {	    // ignore.	}		return header;    }    private String getPlace (URL u, String hostPrefix, String hostSuffix) {	String host = u.getHost ();	if (host.startsWith (hostPrefix))	    hostPrefix = "";	if (host.endsWith (hostSuffix))	    hostSuffix = "";	if (hostPrefix.equals ("") && hostSuffix.equals (""))	    return null;	return u.getProtocol () + "://" + hostPrefix + u.getHost () + 	    hostSuffix + 	    (u.getPort () == -1 ? "" : ":" + u.getPort ()) + 	    u.getFile ();		    }}

⌨️ 快捷键说明

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