notmodifiedhandler.java

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

JAVA
146
字号
package rabbit.proxy;import java.util.Date;import java.util.List;import rabbit.cache.CacheEntry;import rabbit.http.HttpDateParser;import rabbit.http.HttpHeader;import rabbit.util.Logger;class NotModifiedHandler {    /** Check if the request allows us to use a "304 Not modified" response.     * @param in the request being made.     * @param rh the RequestHandler for this request     */    public HttpHeader is304 (HttpHeader in, Connection con, 			     Connection.RequestHandler rh) {	CacheEntry entry = rh.entry;	if (entry == null)	    return null;	HttpHeader oldresp = rh.dataHook;	/* if we should have gotten anything but a 2xx or a 304, 	 * we should act like IMS and INM was not there.	 */	/* This should not be needed, it is checked before we enter this method.	HttpHeader expfail = checkExpectations (in, oldresp);	if (expfail != null)	    return expfail;	*/	String ifRange = in.getHeader ("If-Range");	if (ifRange != null)	    return null;		String sims = in.getHeader ("If-Modified-Since");	String sums = in.getHeader ("If-Unmodified-Since");	List<String> vinm = in.getHeaders ("If-None-Match");	String et = oldresp.getHeader ("Etag");	String range = in.getHeader ("Range");	boolean mustUseStrong = range != null;	boolean etagMatch = false;	Date ims = null;	Date ums = null;	Date dm = null;	if (sims != null) 	    ims = HttpDateParser.getDate (sims);	if (sums != null)	    ums = HttpDateParser.getDate (sums);	if (ims != null || ums != null) {	    String lm = oldresp.getHeader ("Last-Modified");	    if (lm == null)		return ematch (con, etagMatch, oldresp);	    dm = HttpDateParser.getDate (lm);	}		long diff;	if (ums != null && (diff = dm.getTime () - ums.getTime ()) >= 0) {	    if (mustUseStrong && diff > 60000)		return con.getHttpGenerator ().get412 ();	    else 		return con.getHttpGenerator ().get412 ();	}	/* Check if we have a match of etags (Weak comparison). */	if (et != null) {	    for (String sinm : vinm) {		if (sinm != null 		    && (sinm.equals ("*") 			|| ((mustUseStrong 			     && con.checkStrongEtag (et, sinm)) 			    || (!mustUseStrong 				&& con.checkWeakEtag (et, sinm)))))		    etagMatch = true;	    }	} 	if (sims == null) {	    /* No IMS, act upon INM only. */	    return ematch (con, etagMatch, oldresp);	} else {	    /* Here we may or may not have a etagMatch.	     * Etagmatch and bad(nonexistant/unparsable..) IMS => act on etag	     */	    if (ims == null) {		con.getLogger ().logInfo ("unparseable date: " + sims + 					  " for URL: " + in.getRequestURI ());		return ematch (con, etagMatch, oldresp);	    }	    	    if (dm == null)		return ematch (con, etagMatch, oldresp);	    	    if (dm.after (ims)) 		return null;	    if (vinm.size () < 1) {		if (mustUseStrong) {		    if (dm.getTime () - ims.getTime () < 60000) 			return null;		}		return con.getHttpGenerator ().get304 (oldresp);	    }	    return ematch (con, etagMatch, oldresp);	}    }        private HttpHeader ematch (Connection con, 			       boolean etagMatch, HttpHeader oldresp) {	if (etagMatch)	    return con.getHttpGenerator ().get304 (oldresp);	else 	    return null;    }    private void updateHeader (Connection.RequestHandler rh, 			       HttpHeader cachedHeader, String header) {	String h = rh.webHeader.getHeader (header);	if (h != null)	    cachedHeader.setHeader (header, h);    }        void updateHeader (Connection.RequestHandler rh, Logger logger) {	if (rh.entry == null)	    return;	HttpHeader cachedHeader = rh.dataHook;	updateHeader (rh, cachedHeader, "Date");	updateHeader (rh, cachedHeader, "Expires");	updateHeader (rh, cachedHeader, "Content-Location");	List<String> ccs = rh.webHeader.getHeaders ("Cache-Control");	if (ccs.size () > 0) {	    cachedHeader.removeHeader ("Cache-Control");	    for (String cc : ccs)		cachedHeader.addHeader ("Cache-Control", cc);	}	List<String> varys = rh.webHeader.getHeaders ("Vary");	if (varys.size () > 0) {	    cachedHeader.removeHeader ("Vary");	    for (String v : varys) 		cachedHeader.addHeader ("Vary", v);	}		WarningsHandler wh = new WarningsHandler ();	wh.removeWarnings (logger, cachedHeader, true); 	wh.updateWarnings (cachedHeader, rh.webHeader);	    }   }

⌨️ 快捷键说明

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