2 // System.Web.HttpValueCollection
5 // Patrik Torstensson (Patrik.Torstensson@labs2.com)
8 using System.Collections.Specialized;
9 using System.Runtime.Serialization;
11 using System.Web.Util;
16 class HttpValueCollection : NameValueCollection
20 internal HttpValueCollection ()
25 internal HttpValueCollection (string sData)
27 FillFromQueryString (sData, WebEncoding.Encoding);
31 internal HttpValueCollection(string sData, bool ReadOnly, Encoding encoding)
33 FillFromQueryString (sData, encoding);
34 IsReadOnly = ReadOnly;
37 protected HttpValueCollection (SerializationInfo info, StreamingContext context)
38 : base (info, context)
42 // string = header1: value1\r\nheader2: value2
43 internal void FillFromHeaders (string sHeaders, Encoding encoding)
46 char [] arrSplitValue = new char [] {':'};
52 string [] arrValues = sHeaders.Split(new char [] {'\r', '\n'});
53 foreach (string sLine in arrValues) {
54 string [] arrKeyValue = sLine.Split (arrSplitValue);
55 if (arrKeyValue.Length == 1 && arrKeyValue [0].Length == 0) {
56 // Empty \r or \n is ignored
60 if (arrKeyValue[0] != sKey && sKey.Length > 0) {
61 Add (HttpUtility.UrlDecode (sKey, encoding),
62 HttpUtility.UrlDecode (sValue, encoding));
65 if (arrKeyValue.Length == 1) {
66 sValue += "\r\n" + arrKeyValue [0].Trim();
68 } else if (arrKeyValue.Length == 2) {
69 if (arrKeyValue[0].Length == 0) {
70 sValue += arrKeyValue [1].Trim();
74 sKey = arrKeyValue [0].Trim();
75 sValue = arrKeyValue [1].Trim();
79 if (sKey.Length > 0) {
80 Add (HttpUtility.UrlDecode (sKey, encoding),
81 HttpUtility.UrlDecode (sValue, encoding));
85 internal void FillFromHeaders (string sData)
87 FillFromHeaders (sData, WebEncoding.Encoding);
90 // String = test=aaa&kalle=nisse
91 internal void FillFromQueryString(string sData, Encoding encoding)
95 char [] arrSplitValue = new char [] {'='};
97 string [] arrValues = sData.Split (new char [] {'&'});
98 foreach (string sValue in arrValues) {
99 string [] arrKeyValue = sValue.Split (arrSplitValue);
100 switch (arrKeyValue.Length) {
101 case 1: // Add key only
102 Add (HttpUtility.UrlDecode(arrKeyValue[0].Trim(), encoding), string.Empty);
105 Add(HttpUtility.UrlDecode (arrKeyValue [0].Trim(), encoding),
106 HttpUtility.UrlDecode (arrKeyValue [1].Trim(), encoding));
109 throw new InvalidOperationException ("Data is malformed");
114 internal void FillFromQueryString (string sData)
116 FillFromQueryString (sData, WebEncoding.Encoding);
119 internal void FillFromCookieString (string sData)
121 FillFromQueryString (sData, WebEncoding.Encoding);
124 internal void MakeReadOnly ()
129 internal void MakeReadWrite ()
134 internal void Merge (NameValueCollection oData)
136 foreach (string sKey in oData)
137 Add (sKey, oData [sKey]);
140 internal void Reset ()
145 [MonoTODO("string ToString(bool UrlEncode)")]
146 internal string ToString (bool UrlEncode)
151 // TODO: Should return a correctly formated string (different depending on header flag)
152 throw new NotImplementedException ();
155 virtual new public string ToString ()
157 return ToString (false);