httpsetcookielist.java
来自「很棒的web服务器源代码」· Java 代码 · 共 304 行
JAVA
304 行
// HttpSetCookieList.java// $Id: HttpSetCookieList.java,v 1.19 2003/01/31 13:53:28 ylafon Exp $// (c) COPYRIGHT MIT and INRIA, 1996.// Please first read the full copyright statement in file COPYRIGHT.htmlpackage org.w3c.www.http;import java.util.Date;import java.util.Vector;import java.io.IOException;import java.io.OutputStream;public class HttpSetCookieList extends BasicValue { Vector setcookies = null; Vector raws = null; Vector copycookies = null; boolean original = true; protected int length() { if (setcookies == null) return 0; return setcookies.size(); } protected int copyLength() { if (copycookies == null) return 0; return copycookies.size(); } // if the cookie is home made or copied from an upstream source protected boolean isOriginal() { return original; } protected void emitCookie(OutputStream out, int cookie) throws IOException { checkByteValues(); out.write(((HttpBuffer)raws.elementAt(cookie)).getByteCopy()); } protected void emitCopyCookie(OutputStream out, int cookie) throws IOException { out.write(((HttpBuffer)copycookies.elementAt(cookie)).getByteCopy()); } protected final void checkByteValues() { if (raws == null) { updateByteValue(); } } protected void updateByteValue() { // Dump all cookies, one after the other: int len = setcookies.size(); raws = new Vector(len); for (int i = 0 ; i < len ; i++) { HttpBuffer buf = new HttpBuffer(); HttpSetCookie sc = (HttpSetCookie) setcookies.elementAt(i); buf.append(sc.getName(), (byte) '=', sc.getValue()); String s = sc.getComment(); if (s != null ) { buf.append((byte) ';'); buf.append(" comment", (byte) '=', s); } if ((s = sc.getDomain()) != null ) { buf.append((byte) ';'); buf.append(" domain", (byte) '=', s); } int ii = sc.getMaxAge(); if ( ii >= 0 ) { // Append expires time: float exp = (float)ii * (float)1000; CookieDate expires = new CookieDate(true, (long)(System.currentTimeMillis() + exp)); buf.append((byte) ';'); buf.append(" expires="); expires.appendValue(buf); } if ((s = sc.getPath()) != null ) { buf.append((byte) ';'); buf.append(" path", (byte) '=', s); } if ( sc.getSecurity() ) { buf.append(';'); buf.append(" secure"); } raws.addElement(buf); } } /** * HeaderValue implementation - Add these bytes to the header raw value. * @param buf The byte buffer containing some part of the header value. * @param off The offset of the header value in above buffer. * @param len The length of the header value in above buffer. */ public void addBytes(byte buf[], int off, int len) { original = false; super.addBytes(buf, off, len); HttpBuffer b = new HttpBuffer(len+1); b.append(buf, off, len); if (copycookies == null) { copycookies = new Vector(2); } copycookies.addElement(b); } /** * parse set cookie header according to the specification: * http://www.netscape.com/newsref/std/cookie_spec.html * @exception HttpParserException if parsing failed. */ protected void parse() throws HttpParserException { ParseState cl = new ParseState(roff, rlen); ParseState av = new ParseState(0, 0); ParseState it = new ParseState(0, 0); ParseState val = new ParseState(0, 0); // Prepare parser states: // FIXME SPEC cl.separator = (byte) ','; cl.spaceIsSep = false; av.separator = (byte) ';'; av.spaceIsSep = false; it.separator = (byte) '='; it.spaceIsSep = false; val.separator = (byte) ';'; val.spaceIsSep = false; // Parse the cookie list with cl boolean inExpireItem = false; String expiresDay = null; HttpSetCookie sc = null; while (HttpParser.nextItem(raw, cl) >= 0) { // Each cookie is made of attr-value pairs: av.ioff = cl.start; av.bufend = cl.end; if (!inExpireItem) sc = new HttpSetCookie(); while ( HttpParser.nextItem(raw, av) >= 0 ) { if (inExpireItem) { //get the rest of the expire date try { String date = expiresDay+", "+av.toString(raw); Date maxage = new Date(date); sc.setMaxAge((int) (maxage.getTime()/1000)); } catch (Exception e) {} inExpireItem = false; } else { // Each av is made of an attr '=' value: it.ioff = av.start; it.bufend = av.end; if ( HttpParser.nextItem(raw, it) < 0 ) error("Invalid cookie item ["+av.toString(raw)+"]"); String itemNaturalCase = it.toString(raw); String item = it.toString(raw, true); it.prepare(); if ( HttpParser.nextItem(raw, it) < 0 ) { // There's no value for the item. It's either an error, // a cookie without value or the "secure" item. if ( item.equals("secure") ) { // Secure is the only item without value. sc.setSecurity(true); } else if ( item.equals("comment") || item.equals("domain") || item.equals("expires") || item.equals("max-age") || item.equals("path") || item.equals("version") ) { // All these items *must* have a value if they // are defined. So it's an error. error("No value for attribute ["+item+"]"); } else { // This is probably a cookie without value. sc.setName(itemNaturalCase); sc.setValue(""); } } else { if ( item.equals("comment") ) { sc.setComment(it.toString(raw)); } else if ( item.equals("domain") ) { sc.setDomain(it.toString(raw)); } else if ( item.equals("expires") ) { //Ugly hack because there is a ',' in date expiresDay = it.toString(raw); inExpireItem = true; } else if ( item.equals("max-age") ) { sc.setMaxAge(Integer.parseInt(it.toString(raw))); } else if ( item.equals("path") ) { sc.setPath(it.toString(raw)); } else if ( item.equals("version") ) { sc.setVersion(Integer.parseInt(it.toString(raw))); } else { // This is probably the name/value for the cookie: if ( sc.getName() != null ) error("Invalid cookie item ["+item+"]"); sc.setName(itemNaturalCase); val.ioff = it.start; val.bufend = av.end; HttpParser.nextItem(raw, val); sc.setValue(val.toString(raw)); } } } av.prepare(); } if (!inExpireItem) // Add the newly created cookie: setcookies.addElement(sc); cl.prepare(); } } public Object getValue() { return this; } /** * Add a specific cookie to the SetCookie header value. * This method creates a new, empty SetCookie holder, attaches it to the * SetCookie header, and returns it. * @param name The cookie's name. * @param value The cookie's value. */ public HttpSetCookie addSetCookie(String name, String value) { validate(); HttpSetCookie setcookie = new HttpSetCookie(true, name, value); setcookies.addElement(setcookie); return setcookie; } public void addSetCookie(HttpSetCookie setCookie) { validate(); setcookies.addElement(setCookie); } /** * Remove a predefined cookie from this SetCookie header. * @param name The name of the cookie to remove. * @return A boolean <strong>true</strong> if removed, <strong>false * </strong> otherwise. */ public boolean removeSetCookie(String name) { validate(); for (int i = 0 ; i < setcookies.size() ; i++) { HttpSetCookie setcookie = (HttpSetCookie) setcookies.elementAt(i); if ( setcookie.getName().equals(name) ) { setcookies.removeElementAt(i); return true; } } return false; } /** * Get the cookie infos associated with the given cookie name, if any. * @param name The cookie's name. * @return A HttpSetCookie instance, if found, or <strong>null</strong> * otherwise. */ public HttpSetCookie getSetCookie(String name) { validate(); for (int i = 0 ; i < setcookies.size() ; i++) { HttpSetCookie setcookie = (HttpSetCookie) setcookies.elementAt(i); if ( setcookie.getName().equals(name) ) return setcookie; } return null; } public HttpSetCookie[] getSetCookies() { validate(); HttpSetCookie cooks [] = new HttpSetCookie[setcookies.size()]; setcookies.copyInto(cooks); return cooks; } HttpSetCookieList() { this.isValid = false; this.setcookies = new Vector(2); } public HttpSetCookieList(HttpSetCookie sc[]) { this.isValid = true; this.setcookies = new Vector(2); if ( sc != null ) { // FIXME Eouf corse, it's broken for (int i = 0 ; i < sc.length ; i++) setcookies.addElement(sc[i]); } }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?