httpbag.java

来自「很棒的web服务器源代码」· Java 代码 · 共 291 行

JAVA
291
字号
// HttpBag.java// $Id: HttpBag.java,v 1.11 2000/08/16 21:37:59 ylafon Exp $  // (c) COPYRIGHT MIT and INRIA, 1997.// Please first read the full copyright statement in file COPYRIGHT.htmlpackage org.w3c.www.http ;import java.util.Enumeration;import org.w3c.util.ArrayDictionary;/** * Internal representation of protocol headers conforming to the bag spec. * The <strong>bag</strong> specification is part of the Protocol Extension * Protocol defined by w3c, it can be found * <a href="http://www.w3.org/hypertext/WWW/TR/WD-http-pep.html>here</a>. */public class HttpBag extends BasicValue {    boolean         isToplevel = false;    String          name       = null ;    ArrayDictionary items      = null;    protected final void updateByteValue() {	HttpBuffer buf = new HttpBuffer();	if ( isToplevel ) {	    // Dump this bag as a list of bags:	    Enumeration e = items.elements();	    boolean     s = true;	    while ( e.hasMoreElements() ) {		HttpBag bag = (HttpBag) e.nextElement();		// Append separator if needed:		if ( s )		    s = false;		else		    buf.append((byte)',');		// Dump the bag now:		bag.appendValue(buf);	    }	} else {	    buf.append((byte) '{');	    buf.append(name);	    buf.append((byte) ' ');	    // Append all items:	    Enumeration e = items.keys();	    boolean     s = true;	    while (e.hasMoreElements()) {		// Append separator after first item only:		if ( s ) 		    s = false;		else		    buf.append((byte) ' ');		// Dump the item:		String name  = (String) e.nextElement();		Object value = items.get(name);		if ( value instanceof Boolean ) {		    buf.append(name);		} else if ( value instanceof HttpBag ) {		    ((HttpBag) value).appendValue(buf);		} else {		    String msg = "Invalid bag item value, key=\""+name+"\".";		    throw new HttpInvalidValueException(msg);		}	    }	    buf.append((byte) '}');	}	raw  = buf.getByteCopy();	roff = 0;	rlen = raw.length;    }    /**     * parse bag.     * @exception HttpParserException if parsing failed.     */    protected HttpBag parseBag(ParseState ps)	throws HttpParserException    {	StringBuffer sb = new StringBuffer();	int i  = ps.ioff;	byte b = raw[i];	// skip spaces, check for opening bracket	while ((i < ps.bufend) && ((b = raw[i]) <= 32))	    i++;	if ( i >= ps.bufend )	    return null ;	if (b != '{')	    error("Invalid Bag format (no {).") ;	// skip spaces, bag list separators, get the bag name	for (++i; (i < ps.bufend) && ((b = raw[i]) <= 32) ; i++)	    ;	if ( i >= ps.bufend )	    error("Invalid Bag format (no name).") ;	while ((i < ps.bufend) && ((b = raw[i]) > 32) && (b != '}')) {	    sb.append ((char) b);	    i++;	}	HttpBag bag = new HttpBag(true, sb.toString()) ;	// get items:	while (i < ps.bufend) {	    b = raw[i];	    if ( b <= 32 ) {		i++;		continue ;	    } else if ( b == '}' ) {		ps.ooff = i+1;		return bag ;	    } else if ( b == '{' ) {		ParseState inc = new ParseState(i, ps.bufend);		HttpBag subbag = parseBag (inc) ;		bag.items.put(subbag.name, subbag) ;		i = inc.ooff;	    } else if ( b == '\"') {		// get quoted string (FIXME, escape chars !)		sb.setLength(0);		i++;		while ((i < ps.bufend) && ((b = raw[i]) != '\"')) {		    sb.append ((char) b) ;		    i++;		}		bag.items.put(sb.toString(), Boolean.TRUE) ;		i++;	    } else {		// get token (FIXME, see token spec and tspecials)		sb.setLength(0) ;		while ((i < ps.bufend) && ((b = raw[i]) > 32) && (b != '}')) {		    sb.append ((char) b) ;		    i++;		}		bag.addItem (sb.toString()) ;	    }	}	return bag ;    }    /**     * parse.     * @exception HttpParserException if parsing failed.     */    protected final void parse()	throws HttpParserException    {	int i = roff;	// Parses a list of bags:	isToplevel  = true;	HttpBag top = this;	while ( i < rlen ) {	    switch(raw[i]) {	      case (byte) '{':		  ParseState ps  = new ParseState(i, rlen);		  HttpBag    bag = parseBag(ps);		  top.items.put(bag.name, bag);		  i = ps.ooff;		  break;	      case (byte)' ':	      case (byte)'\t':	      case (byte)',':		  i++;		  break;	      default:		  error("Unexpected separator \""+raw[i]+"\".");	    }	}    }    public Object getValue() {	return this;    }    /**     * Get this bag names     * @return The name of this bag.     */    public String getName() {	validate();	return name ;    }    /**     * Add a named bag into this bag.     * @param bag The bag to add (in case item is a bag).     */    public void addBag (HttpBag subbag) {	validate();	items.put (subbag.getName(), subbag) ;    }    /**     * Does this bag have a named sub-bag of the given name ?     * @param name The name of the sub-bag to be tested for.     * @return <strong>true</strong> if this sub-bag exists.     */    public boolean hasBag (String name) {	validate();	Object item = items.get (name) ;	if ( (item != null) && (item instanceof HttpBag) )	    return true ;	return false ;    }    /**     * Get a named sub-bag from this bag.     * @param name The name of the sub-bag to get.     * @return A bag instance, or <strong>null</strong> if none was found.     */    public HttpBag getBag (String name) {	validate();	if (hasBag (name))	    return (HttpBag) items.get (name) ;	return null ;    }    /**     * Add an item into this bag.     * @param name The new item name.     */    public void addItem (String name) {	validate();	items.put (name, Boolean.TRUE) ;    }    /**     * Add a sub-bag to this bag.     * @param subbag The sub-bag to add.     */    public void addItem(HttpBag subbag) {	validate();	items.put(subbag.getName(), subbag);    }    /**     * Does this bag contains the given item, being a bag or a simple word.     * @param name The name of the item to test.     * @return <strong>true</strong> if the bag contains the given item,      *   <strong>false</strong> otherwise.     */    public boolean hasItem (String name) {	validate();	return items.get (name) != null ;    }    /**     * Remove an item from that bag.     * @param name The name of the item to remove.     */    public void removeItem(String name) {	validate();	items.remove(name);    }    /**     * Get all named items from this bag.      * This include both named sub-bags and items by their own.     */    public Enumeration keys () {	validate();	return items.keys() ;    }    /**     * Is that a top level bag or not ?     * @return A boolean, <strong>true</strong> if the bag was a toplevel     * bag.     */    public boolean isToplevelBag() {	return isToplevel;    }    HttpBag() {	isValid    = false;	this.items = new ArrayDictionary(5, 5);    }    HttpBag(boolean isValid, String name) {	this.isValid = isValid;	this.name    = name ;	this.items   = new ArrayDictionary(5, 5);    }}

⌨️ 快捷键说明

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