httpaccept.java

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

JAVA
273
字号
// HttpAccept.java// $Id: HttpAccept.java,v 1.9 2000/08/16 21:37:58 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.Vector;import org.w3c.www.mime.MimeType;public class HttpAccept extends BasicValue {    /**     * The list of accept parameters name.     */    protected String aparams[] = null;    /**     * The list of accept parameters value.     */    protected String avalues[] = null;    /**     * The accepted MIME type.     */    protected MimeType type = null;    /**     * The list we belong to, if any.     */    HttpAcceptList list = null;    /**     * the quality     */    protected double quality = -1;    /**     * parse.     * @exception HttpParserException if parsing failed.     */    protected void parse()	throws HttpParserException    {	ParseState ps = new ParseState(roff, rlen);	// We need to do our own MIME type parsing, to avoid ambiguities !	// Get the type:	ps.separator  = (byte) '/';	ps.spaceIsSep = false;	if ( HttpParser.nextItem(raw, ps) < 0 )	    error("Invalid Accept: has no type.");	String type = new String(raw, 0, ps.start, ps.end-ps.start);	// Get the subtype:	ps.prepare();	ps.separator = (byte) ';';	if ( HttpParser.nextItem(raw, ps) < 0 )	    error("Invalid accept: no subtype");	String subtype = new String(raw, 0, ps.start, ps.end-ps.start);	// Get the parameters:	ParseState it = new ParseState();	it.separator  = (byte) '=';	it.spaceIsSep = false;	ps.prepare();	Vector  vparams = new Vector(4);	Vector  vvalues = new Vector(4);	boolean accept  = false;	while (HttpParser.nextItem(raw, ps) >= 0) {	    it.ioff   = ps.start;	    it.bufend = ps.end;	    if ( HttpParser.nextItem(raw, it) < 0 ) 		error("Invalid parameter: no param name.");	    // The Hack !	    String param = new String(raw, 0, it.start, it.end-it.start);	    if ( param.equalsIgnoreCase("q") ) {		// Switching to accept-params		accept = true;		break ;	    }	    vparams.addElement(new String(raw, 0, it.start, it.end-it.start));	    it.prepare();	    if ( HttpParser.nextItem(raw, it) < 0 )		error("Invalid parameter: no value.");	    vvalues.addElement(new String(raw, 0, it.start, it.end-it.start));	    ps.prepare();	}	if ( vparams.size() > 0 ) {	    String pparams[] = new String[vparams.size()];	    String pvalues[] = new String[pparams.length];	    vparams.copyInto(pparams);	    vvalues.copyInto(pvalues);	    this.type = new MimeType(type, subtype, pparams, pvalues);	} else {	    this.type = new MimeType(type, subtype);	}	// Parse remaining accept parameters:	if ( accept ) {	    vparams.setSize(0);	    vvalues.setSize(0);	    // Hack to finish with the q parameter	    it.prepare();	    if ( HttpParser.nextItem(raw, it) < 0 )		error("Invalid accept parameter: no value.");	    vparams.addElement("q");	    vvalues.addElement(new String(raw, 0, it.start, it.end-it.start));	    it.prepare();	    while (HttpParser.nextItem(raw, ps) >= 0) {		it.ioff   = ps.start;		it.bufend = ps.end;		if ( HttpParser.nextItem(raw, it) < 0 )		    error("Invalid accept parameter: no name.");		vparams.addElement(new String(raw,0,it.start,it.end-it.start));		it.prepare();		if (HttpParser.nextItem(raw, it) < 0 )		    error("Invalid accept parameter: no value.");		vvalues.addElement(new String(raw,0,it.start,it.end-it.start));		ps.prepare();	    }	    this.aparams = new String[vparams.size()];	    this.avalues = new String[aparams.length];	    vparams.copyInto(aparams);	    vvalues.copyInto(avalues);	}    }    protected void updateByteValue() {	HttpBuffer buf = new HttpBuffer();	buf.append(type.toString());	if ( aparams != null ) {	    for (int i = 0 ; i < aparams.length ; i++) {		if ( i > 0 )		    buf.append(';');		buf.append(aparams[i], (byte) '=', avalues[i]);	    }	}	raw  = buf.getByteCopy();	roff = 0;	rlen = raw.length;    }    protected void invalideByteValue() {	super.invalidateByteValue();	if ( list != null )	    list.invalidateByteValue();    }    public Object getValue() {	validate();	return this;    }    /**     * Lookup for the given parameter binding.     * @return The slot number for this parameter, or <strong>-1</strong>     * if undefined.     */    protected int lookup(String name) {	if ( aparams == null )	    return -1;	for (int i = 0 ; i < aparams.length ; i++) {	    if ( name.equalsIgnoreCase(aparams[i]) )		return i;	}	return -1;    }    /**     * Get the String value for a parameter.     * @return The String value for the accept parameter, or      * <strong>null</strong> if undefined.     */    public String getAcceptParameter(String name) {	validate();	int slot = lookup(name);	return (slot == -1) ? null : avalues[slot];    }    /**     * Set the value of an accept parameter.     * @param name The name of the accept parameter to set.     * @param value The value of the accept parameter to set.     */    public void setAcceptParameter(String name, String value) {	validate();	int slot = lookup(name);	if ( slot == -1 ) {	    // Look for a free slot:	    for (int i = 0 ; i < aparams.length ; i++) {		if ( aparams[i] == null ) {		    slot = i;		    break;		}	    }	    // Do we need to resize ?	    if ( slot == -1 ) {		slot = aparams.length;		String nap[] = new String[slot<<1];		String nav[] = new String[nap.length];		System.arraycopy(aparams, 0, nap, 0, slot);		System.arraycopy(avalues, 0, nav, 0, slot);		aparams = nap;		avalues = nav;	    }	}	// Set the slot value:	invalidateByteValue();	aparams[slot] = name;	avalues[slot] = value;    }    /**     * Get this object accepted MIME type.     * @return The accepted MIME type.     */    public MimeType getMimeType() {	validate();	return type;    }    /**     * Set the accepted MIME type.     * @param type The accepted MIME type.     */    public void setMimeType(MimeType type) {	invalidateByteValue();	this.type = type;    }    /**     * Get the quality of this accept clause.     * @return A double value, encoding the quality, or <strong>1.0</strong>     * if undefined.     */    public double getQuality() {	String value = getAcceptParameter("q");	if ( value == null ) {	    if (quality != -1 ) {		return quality;	    }	    String strtype    = type.getType();	    String strsubtype = type.getSubtype();	    if (strtype.equals("*"))		return strsubtype.equals("*") ? 0.1 : 0.5 ;	    return strsubtype.equals("*") ? 0.5 : 1.0;	}	try {	    return Double.valueOf(value).doubleValue();	} catch (Exception ex) {	    String msg = "invalid quality value: "+value;	    throw new HttpInvalidValueException(msg);	}    }    HttpAccept(HttpAcceptList list, byte raw[], int roff, int rlen) {	this.list    = list;	this.raw     = raw;	this.roff    = roff;	this.rlen    = rlen;	this.isValid = false;    }    HttpAccept(boolean isValid, MimeType type, double quality) {	this.isValid = isValid;	setMimeType(type);	this.quality = quality;    }    public HttpAccept() {	this.isValid = false;    }}

⌨️ 快捷键说明

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