--- /dev/null
+// HttpExt.java\r
+// $Id: HttpExtList.java,v 1.1 2010/06/15 12:19:46 smhuang Exp $\r
+// (c) COPYRIGHT MIT and INRIA, 1999.\r
+// Please first read the full copyright statement in file COPYRIGHT.html\r
+\r
+package org.w3c.www.http;\r
+\r
+import java.util.Vector;\r
+import java.util.Enumeration;\r
+\r
+/**\r
+ * @version $Revision: 1.1 $\r
+ * @author Benoît Mahé (bmahe@w3.org)\r
+ * Parse a comma separated list of Http extension headers.\r
+ */\r
+\r
+public class HttpExtList extends BasicValue {\r
+\r
+ //\r
+ // Is this list a Mandatory, Optionnal, hop-by-Hop Mandatory or hop-by-Hop\r
+ // Optionnal?\r
+\r
+ public static final int MAN = 0;\r
+ public static final int CMAN = 1;\r
+ public static final int OPT = 2;\r
+ public static final int COPT = 3;\r
+\r
+ \r
+ Vector httpexts = null;\r
+ int manopt = MAN;\r
+\r
+ public int getManOptFlag() {\r
+ return manopt;\r
+ }\r
+\r
+ protected void setManOptFlag(int manopt) {\r
+ this.manopt = manopt;\r
+ }\r
+\r
+ /**\r
+ * Parse this header value into its various components.\r
+ * @exception HttpParserException if unable to parse.\r
+ */\r
+ protected void parse() \r
+ throws HttpParserException\r
+ {\r
+ //extension declaration list parser\r
+ ParseState edl = new ParseState(roff, rlen);\r
+ //attr-value pair\r
+ ParseState av = new ParseState(0, 0);\r
+ //item parser\r
+ ParseState it = new ParseState(0, 0);\r
+\r
+ edl.separator = (byte) ',';\r
+ edl.spaceIsSep = false;\r
+ av.separator = (byte) ';';\r
+ av.spaceIsSep = false;\r
+ it.separator = (byte) '=';\r
+ it.spaceIsSep = false;\r
+\r
+ while ( HttpParser.nextItem(raw, edl) >= 0 ) {\r
+ av.ioff = edl.start;\r
+ av.bufend = edl.end;\r
+ HttpExt ext = new HttpExt();\r
+ \r
+ while ( HttpParser.nextItem(raw, av) >= 0 ) {\r
+ it.ioff = av.start;\r
+ it.bufend = av.end;\r
+ // attr = value or "absoluteURI" or "field-name"\r
+ boolean unquoted = HttpParser.unquote(raw, it);\r
+ if ( HttpParser.nextItem(raw, it) < 0 )\r
+ error("Invalid extension item ["+av.toString(raw)+"]");\r
+ String itemNaturalCase = it.toString(raw);\r
+ String item = it.toString(raw, true);\r
+ // if (item.charAt(0) == '"') {\r
+ if (unquoted) {\r
+ // "absoluteURI" or "field-name"\r
+ ext.setName(itemNaturalCase);\r
+ } else {\r
+ it.prepare();\r
+ HttpParser.unquote(raw, it);\r
+ if ( HttpParser.nextItem(raw, it) < 0 )\r
+ error("No value for attribute ["+item+"]");\r
+ if ( item.equals("ns") ) {\r
+ ext.setNamespace(it.toString(raw));\r
+ } else {\r
+ ext.addDeclExt(itemNaturalCase, it.toString(raw));\r
+ }\r
+ }\r
+ av.prepare();\r
+ }\r
+ edl.prepare();\r
+ httpexts.addElement(ext);\r
+ }\r
+ }\r
+\r
+ protected void updateByteValue() {\r
+ HttpBuffer buf = new HttpBuffer();\r
+ //Dump all extensions declaration\r
+ int len = httpexts.size();\r
+ for (int i=0; i < len; i++) {\r
+ HttpExt ext = (HttpExt) httpexts.elementAt(i);\r
+ if (i != 0)\r
+ buf.append(", ");\r
+ buf.appendQuoted(ext.getName());\r
+ if (ext.needsHeaders()) {\r
+ buf.append(";");\r
+ buf.append("ns",(byte)'=',ext.getNamespace());\r
+ }\r
+ Enumeration e = ext.getDeclExtNames();\r
+ while (e.hasMoreElements()) {\r
+ String name = (String) e.nextElement();\r
+ buf.append("; ");\r
+ buf.append(name, (byte)'=', ext.getDeclExt(name));\r
+ }\r
+ }\r
+ raw = buf.getByteCopy();\r
+ roff = 0;\r
+ rlen = raw.length;\r
+ }\r
+\r
+ /**\r
+ * Add an Http extension header.\r
+ * @param ext an HttpExt.\r
+ */\r
+ public void addHttpExt(HttpExt ext) {\r
+ validate();\r
+ httpexts.addElement(ext);\r
+ }\r
+\r
+ /**\r
+ * Get all Http extensions header.\r
+ * @return an HttpExt array.\r
+ */\r
+ public HttpExt[] getHttpExts() {\r
+ validate();\r
+ HttpExt exts[] = new HttpExt[httpexts.size()];\r
+ httpexts.copyInto(exts);\r
+ return exts;\r
+ }\r
+\r
+ public int getLength() {\r
+ validate();\r
+ return httpexts.size();\r
+ }\r
+\r
+ /**\r
+ * Get an Http extension header.\r
+ * @param name The extension identifier (AbsoluteURI or field name)\r
+ * @return an HttpExt or <strong>null</strong>.\r
+ */\r
+ public HttpExt getHttpExt(String name) {\r
+ validate();\r
+ for (int i=0; i < httpexts.size(); i++) {\r
+ HttpExt ext = (HttpExt) httpexts.elementAt(i);\r
+ if (ext.getName().equals(name))\r
+ return ext;\r
+ }\r
+ return null;\r
+ }\r
+\r
+ public Object getValue() {\r
+ return this;\r
+ }\r
+\r
+ /**\r
+ * for user.\r
+ * @param exts the HttpExt array.\r
+ */\r
+ public HttpExtList(HttpExt exts[]) {\r
+ this.isValid = true;\r
+ int len = exts.length;\r
+ this.httpexts = new Vector(len);\r
+ if (exts != null) {\r
+ for (int i=0; i < len; i++)\r
+ httpexts.addElement(exts[i]);\r
+ }\r
+ }\r
+\r
+ /**\r
+ * Constructor, for User\r
+ * @param old the old Http extension declaration list \r
+ * If you want to reply the same extensions, use this\r
+ * contructor.\r
+ */\r
+ public HttpExtList(HttpExtList old) {\r
+ this.isValid = true;\r
+ old.validate();\r
+ int len = old.httpexts.size();\r
+ this.httpexts = new Vector(len);\r
+ for (int i=0; i < len; i++) { \r
+ HttpExt newext = new HttpExt((HttpExt)old.httpexts.elementAt(i));\r
+ this.httpexts.addElement(newext);\r
+ }\r
+ this.manopt = old.manopt;\r
+ }\r
+\r
+ /**\r
+ * for parser only\r
+ */\r
+ protected HttpExtList() {\r
+ this.isValid = false;\r
+ this.httpexts = new Vector(2);\r
+ }\r
+\r
+}\r