New test.
[mono.git] / mcs / class / System.Web / System.Web / ServerVariablesCollection.cs
1 //
2 // System.Web.ServerVariablesCollection
3 //
4 // Authors:
5 //      Alon Gazit (along@mainsoft.com)
6 //      Miguel de Icaza (miguel@novell.com)
7 //      Gonzalo Paniagua Javier (gonzalo@novell.com)
8 //
9 // (c) 2004 Mainsoft, Inc. (http://www.mainsoft.com)
10 // Copyright (C) 2005 Novell, Inc (http://www.novell.com)
11 //
12 // Permission is hereby granted, free of charge, to any person obtaining
13 // a copy of this software and associated documentation files (the
14 // "Software"), to deal in the Software without restriction, including
15 // without limitation the rights to use, copy, modify, merge, publish,
16 // distribute, sublicense, and/or sell copies of the Software, and to
17 // permit persons to whom the Software is furnished to do so, subject to
18 // the following conditions:
19 // 
20 // The above copyright notice and this permission notice shall be
21 // included in all copies or substantial portions of the Software.
22 // 
23 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
27 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
28 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
29 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30 //
31
32 using System.Text;
33 using System.Collections;
34 using System.Collections.Specialized;
35 using System.Runtime.Serialization;
36 using System.Globalization;
37 using System.Security.Permissions;
38
39 namespace System.Web
40 {
41         class ServerVariablesCollection : NameValueCollection
42         {
43                 HttpRequest request;
44                 bool loaded;
45
46                 public ServerVariablesCollection(HttpRequest request)
47                 {
48                         IsReadOnly = true;
49                         this.request = request;
50                 }
51
52                 void AppendKeyValue (StringBuilder sb, string key, string value, bool standard)
53                 {
54                         //
55                         // Standard has HTTP_ prefix, everything is uppercase, has no space
56                         // after colon, - is changed to _
57                         //
58                         // Raw is header, colon, space, values, raw.
59                         //
60                         if (standard){
61                                 sb.Append ("HTTP_");
62                                 sb.Append (key.ToUpper ().Replace ("-", "_"));
63                                 sb.Append (":");
64                         } else {
65                                 sb.Append (key);
66                                 sb.Append (": ");
67                         }
68                         sb.Append (value);
69                         sb.Append ("\r\n");
70                 }
71                                      
72                 string Fill (HttpWorkerRequest wr, bool standard)
73                 {
74                         StringBuilder sb = new StringBuilder ();
75                         
76                         for (int i = 0; i < HttpWorkerRequest.RequestHeaderMaximum; i++){
77                                 string val = wr.GetKnownRequestHeader (i);
78                                 if (val == null || val == "")
79                                         continue;
80                                 string key = HttpWorkerRequest.GetKnownRequestHeaderName (i);
81                                 AppendKeyValue (sb, key, val, standard);
82                         }
83                         string [][] other = wr.GetUnknownRequestHeaders ();
84                         if (other == null)
85                                 return sb.ToString ();
86
87                         for (int i = other.Length; i > 0; ){
88                                 i--;
89                                 AppendKeyValue (sb, other [i][0], other [i][1], standard);
90                         }
91
92                         return sb.ToString ();
93                 }
94
95                 void AddHeaderVariables (HttpWorkerRequest wr)
96                 {
97                         string hname;
98                         string hvalue;
99
100                         // Add all known headers
101                         for (int i = 0; i < HttpWorkerRequest.RequestHeaderMaximum; i++) {
102                                 hvalue = wr.GetKnownRequestHeader (i);
103                                 if (null != hvalue && hvalue.Length > 0) {
104                                         hname = HttpWorkerRequest.GetKnownRequestHeaderName (i);
105                                         if (null != hname && hname.Length > 0)
106                                                 Add ("HTTP_" + hname.ToUpper ().Replace ('-', '_'), hvalue);
107                                 }
108                         }
109
110                         // Get all other headers
111                         string [][] unknown = wr.GetUnknownRequestHeaders ();
112                         if (null != unknown) {
113                                 for (int i = 0; i < unknown.Length; i++) {
114                                         hname = unknown [i][0];
115                                         if (hname == null)
116                                                 continue;
117                                         hvalue = unknown [i][1];
118                                         Add ("HTTP_" + hname.ToUpper ().Replace ('-', '_'), hvalue);
119                                 }
120                         }
121                 }
122
123                 private void loadServerVariablesCollection()
124                 {
125                         HttpWorkerRequest wr = request.WorkerRequest;
126                         if (loaded || (wr == null))
127                                 return;
128
129                         IsReadOnly = false;
130                 
131                         Add("ALL_HTTP", Fill (wr, true));
132                         Add("ALL_RAW",  Fill (wr, false));
133                             
134                         Add("APPL_MD_PATH", wr.GetServerVariable("APPL_MD_PATH"));
135                         Add("APPL_PHYSICAL_PATH", wr.GetServerVariable("APPL_PHYSICAL_PATH"));
136
137                         if (null != request.Context.User && request.Context.User.Identity.IsAuthenticated) {
138                                 Add ("AUTH_TYPE", request.Context.User.Identity.AuthenticationType);
139                                 Add ("AUTH_USER", request.Context.User.Identity.Name);
140                         } else {
141                                 Add ("AUTH_TYPE", "");
142                                 Add ("AUTH_USER", "");
143                         }
144
145                         Add("AUTH_PASSWORD", wr.GetServerVariable("AUTH_PASSWORD"));
146                         Add ("LOGON_USER", wr.GetServerVariable("LOGON_USER"));
147                         Add ("REMOTE_USER", wr.GetServerVariable("REMOTE_USER"));
148                         Add("CERT_COOKIE", wr.GetServerVariable("CERT_COOKIE"));
149                         Add("CERT_FLAGS", wr.GetServerVariable("CERT_FLAGS"));
150                         Add("CERT_ISSUER", wr.GetServerVariable("CERT_ISSUER"));
151                         Add("CERT_KEYSIZE", wr.GetServerVariable("CERT_KEYSIZE"));
152                         Add("CERT_SECRETKEYSIZE", wr.GetServerVariable("CERT_SECRETKEYSIZE"));
153                         Add("CERT_SERIALNUMBER", wr.GetServerVariable("CERT_SERIALNUMBER"));
154                         Add("CERT_SERVER_ISSUER", wr.GetServerVariable("CERT_SERVER_ISSUER"));
155                         Add("CERT_SERVER_SUBJECT", wr.GetServerVariable("CERT_SERVER_SUBJECT"));
156                         Add("CERT_SUBJECT", wr.GetServerVariable("CERT_SUBJECT"));
157
158                         string sTmp = wr.GetKnownRequestHeader(HttpWorkerRequest.HeaderContentLength);
159                         if (null != sTmp)
160                                 Add ("CONTENT_LENGTH", sTmp);
161                         Add ("CONTENT_TYPE", request.ContentType);
162
163                         Add("GATEWAY_INTERFACE", wr.GetServerVariable("GATEWAY_INTERFACE"));
164                         Add("HTTPS", wr.GetServerVariable("HTTPS"));
165                         Add("HTTPS_KEYSIZE", wr.GetServerVariable("HTTPS_KEYSIZE"));
166                         Add("HTTPS_SECRETKEYSIZE", wr.GetServerVariable("HTTPS_SECRETKEYSIZE"));
167                         Add("HTTPS_SERVER_ISSUER", wr.GetServerVariable("HTTPS_SERVER_ISSUER"));
168                         Add("HTTPS_SERVER_SUBJECT", wr.GetServerVariable("HTTPS_SERVER_SUBJECT"));
169                         Add("INSTANCE_ID", wr.GetServerVariable("INSTANCE_ID"));
170                         Add("INSTANCE_META_PATH", wr.GetServerVariable("INSTANCE_META_PATH"));
171                         Add("LOCAL_ADDR", wr.GetLocalAddress());
172                         Add("PATH_INFO", request.PathInfo);
173                         Add("PATH_TRANSLATED", request.PhysicalPath);
174                         Add("QUERY_STRING", request.QueryStringRaw);
175                         Add("REMOTE_ADDR", request.UserHostAddress);
176                         Add("REMOTE_HOST", request.UserHostName);
177                         Add("REMOTE_PORT", wr.GetRemotePort ().ToString ());
178                         Add("REQUEST_METHOD", request.HttpMethod);
179                         Add("SCRIPT_NAME", request.FilePath);
180                         Add("SERVER_NAME", wr.GetServerName());
181                         Add("SERVER_PORT", wr.GetLocalPort().ToString());
182                         if (wr.IsSecure()) 
183                                 Add("SERVER_PORT_SECURE", "1");
184                         else
185                                 Add("SERVER_PORT_SECURE", "0");
186                         Add("SERVER_PROTOCOL", wr.GetHttpVersion());
187                         Add("SERVER_SOFTWARE", wr.GetServerVariable("SERVER_SOFTWARE"));
188                         Add ("URL", request.FilePath);
189
190                         AddHeaderVariables (wr);
191
192                         IsReadOnly = true;
193                         loaded = true;
194                 }
195
196  
197                 public override string Get(int index)
198                 {
199                         loadServerVariablesCollection();
200                         return base.Get(index); 
201                 }
202
203                 public override string Get(string name)
204                 {
205                         string text1;
206                         if (!loaded) {
207                                 text1 = GetServerVar(name);
208                                 if (text1 != null)                              
209                                         return text1;                           
210                                 loadServerVariablesCollection(); 
211                         }
212                         return base.Get(name); 
213
214                         
215                 }
216
217                 private string GetServerVar(string name)
218                 {
219                         if (((name == null) || (name.Length <= 8)) || (this.request == null))
220                                 return null;
221                         
222                         if (string.Compare(name, "AUTH_TYPE", true, CultureInfo.InvariantCulture) == 0) {
223                                 if (null != request.Context.User && request.Context.User.Identity.IsAuthenticated) 
224                                         return request.Context.User.Identity.AuthenticationType;
225                                 else
226                                         return string.Empty;
227                         } else if (string.Compare(name, "AUTH_USER",true, CultureInfo.InvariantCulture) == 0) {
228                                 if (null != request.Context.User && request.Context.User.Identity.IsAuthenticated) 
229                                         return request.Context.User.Identity.Name;
230                                 else
231                                         return string.Empty;
232                         } else if (string.Compare(name, "QUERY_STRING", true, CultureInfo.InvariantCulture) == 0)                               
233                                 return this.request.QueryStringRaw; 
234                         else if (string.Compare(name, "PATH_INFO", true, CultureInfo.InvariantCulture) == 0)                            
235                                 return this.request.PathInfo; 
236                         else if (string.Compare(name, "PATH_TRANSLATED", true, CultureInfo.InvariantCulture) == 0)
237                                 return this.request.PhysicalPath;                       
238                         else if (string.Compare(name, "REQUEST_METHOD", true, CultureInfo.InvariantCulture) == 0)                               
239                                 return this.request.HttpMethod;
240                         else if (string.Compare(name, "REMOTE_ADDR", true, CultureInfo.InvariantCulture) == 0)                  
241                                 return this.request.UserHostAddress;                    
242                         else if (string.Compare(name, "REMOTE_HOST", true, CultureInfo.InvariantCulture) == 0)                  
243                                 return this.request.UserHostName;                       
244                         else if (string.Compare(name, "REMOTE_ADDRESS", true, CultureInfo.InvariantCulture) == 0)
245                                 return this.request.UserHostAddress; 
246                         else if (string.Compare(name, "SCRIPT_NAME", true, CultureInfo.InvariantCulture) == 0)                          
247                                 return this.request.FilePath;
248                         else if (string.Compare(name, "LOCAL_ADDR", true, CultureInfo.InvariantCulture) == 0)                           
249                                 return this.request.WorkerRequest.GetLocalAddress();
250                         else if (string.Compare(name, "SERVER_PROTOCOL", true, CultureInfo.InvariantCulture) == 0)
251                                 return request.WorkerRequest.GetHttpVersion();
252                         else if (string.Compare(name, "SERVER_SOFTWARE", true, CultureInfo.InvariantCulture) == 0)
253                                 return request.WorkerRequest.GetServerVariable("SERVER_SOFTWARE");
254                         return null; 
255                 }
256  
257                 public override string GetKey(int index)
258                 {
259                         loadServerVariablesCollection();
260                         return base.GetKey(index); 
261                 }
262  
263                 public override string[] GetValues(int index)
264                 {
265                         string text1;
266                         string[] array1;
267
268                         text1 = Get(index);
269                         if (text1 == null) 
270                                 return null;
271                         
272                         array1 = new string[1];
273                         array1[0] = text1;
274
275                         return array1; 
276                 }
277  
278                 public override string[] GetValues(string name)
279                 {
280                         string text1;
281                         string[] array1;
282
283                         text1 = Get(name);
284                         if (text1 == null)
285                                 return null; 
286                         array1 = new string[1];
287                         array1[0] = text1;
288                         
289                         return array1; 
290                 }
291  
292                 // not really useful except for not triggering Gendarme warnings
293                 [SecurityPermission (SecurityAction.Demand, SerializationFormatter = true)]
294                 public override void GetObjectData(SerializationInfo info, StreamingContext context)
295                 {
296                         throw new SerializationException(); 
297                 }
298
299                 public override string[] AllKeys 
300                 {
301                         get {
302                                 loadServerVariablesCollection ();
303                                 return base.AllKeys;
304                         }
305                 }
306
307                 public override int Count 
308                 {
309                         get {
310                                 loadServerVariablesCollection ();
311                                 return base.Count;
312                         }
313                 } 
314         }
315 }