initial implementation of 'unify request'
[mono.git] / mcs / class / System.Web / System.Web / HttpParamsCollection.cs
1 //
2 // System.Web.HttpParamsCollection
3 //
4 // Authors:
5 //   Vladimir Krasnov (vladimirk@mainsoft.com)
6 //
7 // (C) 2006 Mainsoft Co. (http://www.mainsoft.com)
8 //
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
16 // 
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
19 // 
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27 //
28
29 using System;
30 using System.Collections.Specialized;
31 using System.Runtime.Serialization;
32
33 namespace System.Web
34 {
35         internal class HttpParamsCollection : WebROCollection
36         {
37                 private NameValueCollection _queryString;
38                 private NameValueCollection _form;
39                 private NameValueCollection _serverVariables;
40                 private HttpCookieCollection _cookies;
41                 private bool _merged;
42
43                 public HttpParamsCollection (NameValueCollection queryString,
44                                                                         NameValueCollection form,
45                                                                         NameValueCollection serverVariables,
46                                                                         HttpCookieCollection cookies)
47                 {
48                         _queryString = queryString;
49                         _form = form;
50                         _serverVariables = serverVariables;
51                         _cookies = cookies;
52                         _merged = false;
53                         Protect ();
54                 }
55
56                 public override string Get (string name)
57                 {
58                         if (_merged)
59                                 return base.Get (name);
60
61                         string values = null;
62
63                         string query_value = _queryString [name];
64                         if (query_value != null)
65                                 values += query_value;
66
67                         string form_value = _form [name];
68                         if (form_value != null)
69                                 values += "," + form_value;
70
71                         string servar_value = _serverVariables [name];
72                         if (servar_value != null)
73                                 values += "," + servar_value;
74
75                         HttpCookie answer = _cookies [name];
76                         string cookie_value = ((answer == null) ? null : answer.Value);
77                         if (cookie_value != null)
78                                 values += "," + cookie_value;
79
80                         if (values == null)
81                                 return null;
82
83                         if (values.Length > 0 && values [0] == ',')
84                                 return values.Substring (1);
85
86                         return values;
87                 }
88
89                 private void MergeCollections ()
90                 {
91                         if (_merged)
92                                 return;
93
94                         Unprotect ();
95
96                         Add (_queryString);
97                         Add (_form);
98                         Add (_serverVariables);
99
100                         /* special handling for Cookies since
101                          * it isn't a NameValueCollection. */
102                         for (int i = 0; i < _cookies.Count; i++) {
103                                 HttpCookie cookie = _cookies [i];
104                                 Add (cookie.Name, cookie.Value);
105                         }
106
107                         _merged = true;
108
109                         Protect ();
110                 }
111
112                 public override string Get (int index)
113                 {
114                         MergeCollections ();
115                         return base.Get (index);
116                 }
117
118                 public override string GetKey (int index)
119                 {
120                         MergeCollections ();
121                         return base.GetKey (index);
122                 }
123
124                 public override string [] GetValues (int index)
125                 {
126                         string value = Get (index);
127                         if (value == null)
128                                 return null;
129
130                         return value.Split (',');
131                 }
132
133                 public override string [] GetValues (string name)
134                 {
135                         string value = Get (name);
136                         if (value == null)
137                                 return null;
138
139                         return value.Split (',');
140                 }
141
142                 public override void GetObjectData (SerializationInfo info, StreamingContext context)
143                 {
144                         throw new SerializationException ();
145                 }
146
147                 public override string [] AllKeys
148                 {
149                         get
150                         {
151                                 MergeCollections ();
152                                 return base.AllKeys;
153                         }
154                 }
155
156                 public override int Count
157                 {
158                         get
159                         {
160                                 MergeCollections ();
161                                 return base.Count;
162                         }
163                 }
164         }
165 }