FileDocCategorySizeDatePackage
ServerCookie.javaAPI DocGlassfish v2 API13456Fri May 04 22:33:14 BST 2007org.apache.tomcat.util.http

ServerCookie

public class ServerCookie extends Object implements Serializable
Server-side cookie representation. Allows recycling and uses MessageBytes as low-level representation ( and thus the byte-> char conversion can be delayed until we know the charset ). Tomcat.core uses this recyclable object to represent cookies, and the facade will convert it to the external representation.

Fields Summary
private static com.sun.org.apache.commons.logging.Log
log
private static final String
NULL_VALUE
The string sent as the value of the cookie in the Set-Cookie header for a Cookie whose value is null.
private static final String
ANCIENT_DATE
private org.apache.tomcat.util.buf.MessageBytes
name
private org.apache.tomcat.util.buf.MessageBytes
value
private org.apache.tomcat.util.buf.MessageBytes
comment
private org.apache.tomcat.util.buf.MessageBytes
domain
private int
maxAge
private org.apache.tomcat.util.buf.MessageBytes
path
private boolean
secure
private int
version
private static final String
tspecials
static final int
dbg
Constructors Summary
public ServerCookie()

	// ;Version=1

    //XXX CommentURL, Port -> use notes ?
    
      

    
Methods Summary
public static voidappendCookieValue(java.lang.StringBuffer buf, int version, java.lang.String name, java.lang.String value, java.lang.String path, java.lang.String domain, java.lang.String comment, int maxAge, boolean isSecure)

        appendCookieValue(buf, version, name, value, path, domain, comment,
                          maxAge, isSecure, false);
    
public static voidappendCookieValue(java.lang.StringBuffer buf, int version, java.lang.String name, java.lang.String value, java.lang.String path, java.lang.String domain, java.lang.String comment, int maxAge, boolean isSecure, boolean encode)


        // this part is the same for all cookies
        if (encode) {
            try {
                buf.append(URLEncoder.encode(name, "UTF-8"));
                buf.append("=");
                /* PWC 6392327
                maybeQuote(version, buf, URLEncoder.encode(value, "UTF-8"));
                */
                // START PWC 6392327
                if (value != null) {
                    maybeQuote(version, buf,
                               URLEncoder.encode(value, "UTF-8"));
                } else {
                    maybeQuote(version, buf,
                               URLEncoder.encode(ServerCookie.NULL_VALUE,
                                                 "UTF-8"));
                }
                // END PWC 6392327
            } catch (UnsupportedEncodingException e) {
                buf.append(URLEncoder.encode(name));
                buf.append("=");
                /* PWC 6392327
                maybeQuote(version, buf, URLEncoder.encode(value));
                */
                // START PWC 6392327
                if (value != null) {
                    maybeQuote(version, buf,
                               URLEncoder.encode(value));
                } else {
                    maybeQuote(version, buf,
                               URLEncoder.encode(ServerCookie.NULL_VALUE));
                }
                // END PWC 6392327
            }
        } else {
            buf.append( name );
            buf.append("=");
            /* PWC 6392327
            maybeQuote(version, buf, value);
            */
            // START PWC 6392327
            if (value != null) {
                maybeQuote(version, buf, value);
            } else {
                maybeQuote(version, buf, ServerCookie.NULL_VALUE);
            }
            // END PWC 6392327
        }

	// XXX Netscape cookie: "; "
 	// add version 1 specific information
	if (version == 1) {
	    // Version=1 ... required
	    buf.append ("; Version=1");

	    // Comment=comment
	    if (comment!=null) {
                buf.append ("; Comment=");
                if (encode) {
                    try {
                        maybeQuote(version, buf,
                                   URLEncoder.encode(comment, "UTF-8"));
                    } catch(UnsupportedEncodingException e) {
                        maybeQuote(version, buf,
                                   URLEncoder.encode(comment));
                    }
	        } else {
                    maybeQuote (version, buf, comment);
                }
            }
        }
	
	// add domain information, if present

	if (domain!=null) {
	    buf.append("; Domain=");
	    maybeQuote (version, buf, domain);
	}

	// Max-Age=secs/Discard ... or use old "Expires" format
	if (maxAge >= 0) {
	    if (version == 0) {
		// XXX XXX XXX We need to send both, for
		// interoperatibility (long word )
		buf.append ("; Expires=");
		// Wdy, DD-Mon-YY HH:MM:SS GMT ( Expires netscape format )
		// To expire we need to set the time back in future
		// ( pfrieden@dChain.com )
                if (maxAge == 0)
		    buf.append( ANCIENT_DATE );
		else
                    DateTool.formatOldCookie
                        (new Date( System.currentTimeMillis() +
                                   maxAge *1000L), buf,
                         new FieldPosition(0));

	    } else {
		buf.append ("; Max-Age=");
		buf.append (maxAge);
	    }
	}

	// Path=path
	if (path!=null) {
	    buf.append ("; Path=");
	    maybeQuote (version, buf, path);
	}

	// Secure
	if (isSecure) {
	  buf.append ("; Secure");
	}
	
	
    
public static voidappendEncodedCookieValue(java.lang.StringBuffer buf, int version, java.lang.String name, java.lang.String value, java.lang.String path, java.lang.String domain, java.lang.String comment, int maxAge, boolean isSecure)

        appendCookieValue(buf, version, name, value, path, domain, comment,
                          maxAge, isSecure, true);
    
public static booleancheckName(java.lang.String name)

	if (!isToken(name)
		|| name.equalsIgnoreCase("Comment")	// rfc2019
		|| name.equalsIgnoreCase("Discard")	// 2019++
		|| name.equalsIgnoreCase("Domain")
		|| name.equalsIgnoreCase("Expires")	// (old cookies)
		|| name.equalsIgnoreCase("Max-Age")	// rfc2019
		|| name.equalsIgnoreCase("Path")
		|| name.equalsIgnoreCase("Secure")
		|| name.equalsIgnoreCase("Version")
	    ) {
	    return false;
	}
	return true;
    
private static java.lang.StringescapeDoubleQuotes(java.lang.String s)
Escapes any double quotes in the given string.

param
s the input string
return
The (possibly) escaped string


        if (s == null || s.length() == 0 || s.indexOf('"") == -1) {
            return s;
        }

        StringBuffer b = new StringBuffer();
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (c == '"")
                b.append('\\").append('"");
            else
                b.append(c);
        }

        return b.toString();
    
public org.apache.tomcat.util.buf.MessageBytesgetComment()

	return comment;
    
public java.lang.StringgetCookieHeaderName()
Return the header name to set the cookie, based on cookie version

	return getCookieHeaderName(version);
    
public static java.lang.StringgetCookieHeaderName(int version)
Return the header name to set the cookie, based on cookie version

	if( dbg>0 ) log( (version==1) ? "Set-Cookie2" : "Set-Cookie");
        if (version == 1) {
	    // RFC2109
	    return "Set-Cookie";
	    // XXX RFC2965 is not standard yet, and Set-Cookie2
	    // is not supported by Netscape 4, 6, IE 3, 5 .
	    // It is supported by Lynx, and there is hope 
	    //	    return "Set-Cookie2";
        } else {
	    // Old Netscape
	    return "Set-Cookie";
        }
    
public org.apache.tomcat.util.buf.MessageBytesgetDomain()

	return domain;
    
public intgetMaxAge()

	return maxAge;
    
public org.apache.tomcat.util.buf.MessageBytesgetName()

	return name;
    
public org.apache.tomcat.util.buf.MessageBytesgetPath()

	return path;
    
public booleangetSecure()

	return secure;
    
public org.apache.tomcat.util.buf.MessageBytesgetValue()

	return value;
    
public intgetVersion()

	return version;
    
public static booleanisToken(java.lang.String value)


    /*
     * Tests a string and returns true if the string counts as a
     * reserved token in the Java language.
     *
     * @param value		the <code>String</code> to be tested
     *
     * @return			<code>true</code> if the <code>String</code> is
     *				a reserved token; <code>false</code>
     *				if it is not
     */
         
	if( value==null) return true;
	int len = value.length();

	for (int i = 0; i < len; i++) {
	    char c = value.charAt(i);

	    if (c < 0x20 || c >= 0x7f || tspecials.indexOf(c) != -1)
		return false;
	}
	return true;
    
public static voidlog(java.lang.String s)

          
        if (log.isDebugEnabled())
	    log.debug("ServerCookie: " + s);
    
public static voidmaybeQuote(int version, java.lang.StringBuffer buf, java.lang.String value)

        // special case - a \n or \r  shouldn't happen in any case
        if (isToken(value)) {
            buf.append(value);
        } else {
            buf.append('"");
            buf.append(escapeDoubleQuotes(value));
            buf.append('"");
        }
    
public voidrecycle()

        path.recycle();
    	name.recycle();
    	value.recycle();
    	comment.recycle();
    	maxAge=-1;
    	path.recycle();
        domain.recycle();
    	version=0;
    	secure=false;
    
public voidsetMaxAge(int expiry)

	maxAge = expiry;
    
public voidsetSecure(boolean flag)

	secure = flag;
    
public voidsetVersion(int v)

	version = v;
    
public java.lang.StringtoString()

	return "Cookie " + getName() + "=" + getValue() + " ; "
	    + getVersion() + " " + getPath() + " " + getDomain();