2 // System.Web.HttpValueCollection
5 // Patrik Torstensson (Patrik.Torstensson@labs2.com)
6 // Gonzalo Paniagua (gonzalo@ximian.com)
9 using System.Collections.Specialized;
10 using System.Runtime.Serialization;
12 using System.Web.Util;
17 class HttpValueCollection : NameValueCollection
21 internal HttpValueCollection ()
26 internal HttpValueCollection (string sData)
28 FillFromQueryString (sData, Encoding.UTF8);
32 internal HttpValueCollection(string sData, bool ReadOnly, Encoding encoding)
34 FillFromQueryString (sData, encoding);
35 IsReadOnly = ReadOnly;
38 protected HttpValueCollection (SerializationInfo info, StreamingContext context)
39 : base (info, context)
43 // string = header1: value1\r\nheader2: value2
44 internal void FillFromHeaders (string sHeaders, Encoding encoding)
47 char [] arrSplitValue = new char [] {':'};
53 string [] arrValues = sHeaders.Split (new char [] {'\r', '\n'});
54 foreach (string sLine in arrValues) {
55 string [] arrKeyValue = sLine.Split (arrSplitValue);
56 if (arrKeyValue.Length == 1 && arrKeyValue [0].Length == 0) {
57 // Empty \r or \n is ignored
61 if (arrKeyValue[0] != sKey && sKey.Length > 0) {
62 Add (HttpUtility.UrlDecode (sKey, encoding),
63 HttpUtility.UrlDecode (sValue, encoding));
66 if (arrKeyValue.Length == 1) {
67 sValue += "\r\n" + arrKeyValue [0].Trim();
69 } else if (arrKeyValue.Length == 2) {
70 if (arrKeyValue[0].Length == 0) {
71 sValue += arrKeyValue [1].Trim();
75 sKey = arrKeyValue [0].Trim();
76 sValue = arrKeyValue [1].Trim();
80 if (sKey.Length > 0) {
81 Add (HttpUtility.UrlDecode (sKey, encoding),
82 HttpUtility.UrlDecode (sValue, encoding));
86 internal void FillFromHeaders (string sData)
88 FillFromHeaders (sData, Encoding.UTF8);
91 // String = test=aaa&kalle=nisse
92 internal void FillFromQueryString (string sData, Encoding encoding)
95 if (sData == null || sData == "")
100 string [] arrValues = sData.Split (new char [] {'&'});
101 foreach (string sValue in arrValues) {
102 eq = sValue.IndexOf ('=');
105 k = HttpUtility.UrlDecode (sValue.Trim (), encoding);
106 Add (k, String.Empty);
110 k = sValue.Substring (0, eq).Trim ();
112 if (eq + 1 < sValue.Length) {
113 v = sValue.Substring (eq + 1).Trim ();
118 k = HttpUtility.UrlDecode (k, encoding);
120 v = HttpUtility.UrlDecode (v, encoding);
126 internal void FillFromQueryString (string sData)
128 FillFromQueryString (sData, Encoding.UTF8);
131 internal void FillFromCookieString (string sData)
133 FillFromQueryString (sData, Encoding.UTF8);
136 internal void MakeReadOnly ()
141 internal void MakeReadWrite ()
146 internal void Merge (NameValueCollection oData)
148 foreach (string sKey in oData)
149 Add (sKey, oData [sKey]);
152 internal void Reset ()
157 internal string ToString (bool UrlEncode)
159 StringBuilder result = new StringBuilder ();
160 string eq = (_bHeaders ? ":" : "=");
161 string separator = (_bHeaders ? "\r\n" : "&");
163 foreach (string strKey in AllKeys) {
165 if (result.Length > 0)
166 result.Append (separator);
170 result.Append (HttpUtility.UrlEncode (strKey, Encoding.UTF8));
172 result.Append (HttpUtility.UrlEncode (Get (strKey), Encoding.UTF8));
174 result.Append (strKey);
176 result.Append (Get (strKey));
180 return result.ToString ();
183 virtual new public string ToString ()
185 return ToString (false);