Call SetEndOfSendNotification
[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 using System.Web.Util;
39
40 namespace System.Web
41 {
42         class ServerVariablesCollection : BaseParamsCollection
43         {
44                 HttpRequest request;
45                 bool loaded;
46
47                 public ServerVariablesCollection(HttpRequest request) : base(request)
48                 {
49                         IsReadOnly = true;
50                         this.request = request;
51                 }
52
53                 void AppendKeyValue (StringBuilder sb, string key, string value, bool standard)
54                 {
55                         //
56                         // Standard has HTTP_ prefix, everything is uppercase, has no space
57                         // after colon, - is changed to _
58                         //
59                         // Raw is header, colon, space, values, raw.
60                         //
61                         if (standard){
62                                 sb.Append ("HTTP_");
63                                 sb.Append (key.ToUpper (Helpers.InvariantCulture).Replace ('-', '_'));
64                                 sb.Append (":");
65                         } else {
66                                 sb.Append (key);
67                                 sb.Append (": ");
68                         }
69                         sb.Append (value);
70                         sb.Append ("\r\n");
71                 }
72                                      
73                 string Fill (HttpWorkerRequest wr, bool standard)
74                 {
75                         StringBuilder sb = new StringBuilder ();
76                         
77                         for (int i = 0; i < HttpWorkerRequest.RequestHeaderMaximum; i++){
78                                 string val = wr.GetKnownRequestHeader (i);
79                                 if (val == null || val == "")
80                                         continue;
81                                 string key = HttpWorkerRequest.GetKnownRequestHeaderName (i);
82                                 AppendKeyValue (sb, key, val, standard);
83                         }
84                         string [][] other = wr.GetUnknownRequestHeaders ();
85                         if (other == null)
86                                 return sb.ToString ();
87
88                         for (int i = other.Length; i > 0; ){
89                                 i--;
90                                 AppendKeyValue (sb, other [i][0], other [i][1], standard);
91                         }
92
93                         return sb.ToString ();
94                 }
95
96                 void AddHeaderVariables (HttpWorkerRequest wr)
97                 {
98                         string hname;
99                         string hvalue;
100
101                         // Add all known headers
102                         for (int i = 0; i < HttpWorkerRequest.RequestHeaderMaximum; i++) {
103                                 hvalue = wr.GetKnownRequestHeader (i);
104                                 if (null != hvalue && hvalue.Length > 0) {
105                                         hname = HttpWorkerRequest.GetKnownRequestHeaderName (i);
106                                         if (null != hname && hname.Length > 0)
107                                                 Add ("HTTP_" + hname.ToUpper (Helpers.InvariantCulture).Replace ('-', '_'), hvalue);
108                                 }
109                         }
110
111                         // Get all other headers
112                         string [][] unknown = wr.GetUnknownRequestHeaders ();
113                         if (null != unknown) {
114                                 for (int i = 0; i < unknown.Length; i++) {
115                                         hname = unknown [i][0];
116                                         if (hname == null)
117                                                 continue;
118                                         hvalue = unknown [i][1];
119                                         Add ("HTTP_" + hname.ToUpper (Helpers.InvariantCulture).Replace ('-', '_'), hvalue);
120                                 }
121                         }
122                 }
123
124                 void loadServerVariablesCollection()
125                 {
126                         HttpWorkerRequest wr = request.WorkerRequest;
127                         if (loaded || (wr == null))
128                                 return;
129
130                         IsReadOnly = false;
131                 
132                         Add("ALL_HTTP", Fill (wr, true));
133                         Add("ALL_RAW",  Fill (wr, false));
134                             
135                         Add("APPL_MD_PATH", wr.GetServerVariable("APPL_MD_PATH"));
136                         Add("APPL_PHYSICAL_PATH", wr.GetServerVariable("APPL_PHYSICAL_PATH"));
137
138                         if (null != request.Context.User && request.Context.User.Identity.IsAuthenticated) {
139                                 Add ("AUTH_TYPE", request.Context.User.Identity.AuthenticationType);
140                                 Add ("AUTH_USER", request.Context.User.Identity.Name);
141                         } else {
142                                 Add ("AUTH_TYPE", "");
143                                 Add ("AUTH_USER", "");
144                         }
145
146                         Add("AUTH_PASSWORD", wr.GetServerVariable("AUTH_PASSWORD"));
147                         Add ("LOGON_USER", wr.GetServerVariable("LOGON_USER"));
148                         Add ("REMOTE_USER", wr.GetServerVariable("REMOTE_USER"));
149                         Add("CERT_COOKIE", wr.GetServerVariable("CERT_COOKIE"));
150                         Add("CERT_FLAGS", wr.GetServerVariable("CERT_FLAGS"));
151                         Add("CERT_ISSUER", wr.GetServerVariable("CERT_ISSUER"));
152                         Add("CERT_KEYSIZE", wr.GetServerVariable("CERT_KEYSIZE"));
153                         Add("CERT_SECRETKEYSIZE", wr.GetServerVariable("CERT_SECRETKEYSIZE"));
154                         Add("CERT_SERIALNUMBER", wr.GetServerVariable("CERT_SERIALNUMBER"));
155                         Add("CERT_SERVER_ISSUER", wr.GetServerVariable("CERT_SERVER_ISSUER"));
156                         Add("CERT_SERVER_SUBJECT", wr.GetServerVariable("CERT_SERVER_SUBJECT"));
157                         Add("CERT_SUBJECT", wr.GetServerVariable("CERT_SUBJECT"));
158
159                         string sTmp = wr.GetKnownRequestHeader(HttpWorkerRequest.HeaderContentLength);
160                         if (null != sTmp)
161                                 Add ("CONTENT_LENGTH", sTmp);
162                         Add ("CONTENT_TYPE", request.ContentType);
163
164                         Add("GATEWAY_INTERFACE", wr.GetServerVariable("GATEWAY_INTERFACE"));
165                         Add("HTTPS", wr.GetServerVariable("HTTPS"));
166                         Add("HTTPS_KEYSIZE", wr.GetServerVariable("HTTPS_KEYSIZE"));
167                         Add("HTTPS_SECRETKEYSIZE", wr.GetServerVariable("HTTPS_SECRETKEYSIZE"));
168                         Add("HTTPS_SERVER_ISSUER", wr.GetServerVariable("HTTPS_SERVER_ISSUER"));
169                         Add("HTTPS_SERVER_SUBJECT", wr.GetServerVariable("HTTPS_SERVER_SUBJECT"));
170                         Add("INSTANCE_ID", wr.GetServerVariable("INSTANCE_ID"));
171                         Add("INSTANCE_META_PATH", wr.GetServerVariable("INSTANCE_META_PATH"));
172                         Add("LOCAL_ADDR", wr.GetLocalAddress());
173                         Add("PATH_INFO", request.PathInfo);
174                         Add("PATH_TRANSLATED", request.PhysicalPath);
175                         Add("QUERY_STRING", request.QueryStringRaw);
176                         Add("REMOTE_ADDR", request.UserHostAddress);
177                         Add("REMOTE_HOST", request.UserHostName);
178                         Add("REMOTE_PORT", wr.GetRemotePort ().ToString ());
179                         Add("REQUEST_METHOD", request.HttpMethod);
180                         Add("SCRIPT_NAME", request.FilePath);
181                         Add("SERVER_NAME", wr.GetServerName());
182                         Add("SERVER_PORT", wr.GetLocalPort().ToString());
183                         if (wr.IsSecure()) 
184                                 Add("SERVER_PORT_SECURE", "1");
185                         else
186                                 Add("SERVER_PORT_SECURE", "0");
187                         Add("SERVER_PROTOCOL", wr.GetHttpVersion());
188                         Add("SERVER_SOFTWARE", wr.GetServerVariable("SERVER_SOFTWARE"));
189                         Add ("URL", request.FilePath);
190
191                         AddHeaderVariables (wr);
192
193                         IsReadOnly = true;
194                         loaded = true;
195                 }
196
197                 protected override void InsertInfo ()
198                 {
199                         loadServerVariablesCollection ();
200                 }
201
202                 protected override string InternalGet (string name)
203                 {
204                         if ((name == null) || (this._request == null))
205                                 return null;
206                         name = name.ToUpper (Helpers.InvariantCulture);
207                         switch (name) {
208                                 case "AUTH_TYPE":
209                                         if (null != _request.Context.User && _request.Context.User.Identity.IsAuthenticated)
210                                                 return _request.Context.User.Identity.AuthenticationType;
211                                         else
212                                                 return string.Empty;
213                                 case "AUTH_USER":
214                                         if (null != _request.Context.User && _request.Context.User.Identity.IsAuthenticated)
215                                                 return _request.Context.User.Identity.Name;
216                                         else
217                                                 return string.Empty;
218                                 case "QUERY_STRING":
219                                         return this._request.QueryStringRaw;
220                                 case "PATH_INFO":
221                                         return this._request.PathInfo;
222                                 case "PATH_TRANSLATED":
223                                         return this._request.PhysicalPath;
224                                 case "REQUEST_METHOD":
225                                         return this._request.HttpMethod;
226                                 case "REMOTE_ADDR":
227                                         return this._request.UserHostAddress;
228                                 case "REMOTE_HOST":
229                                         return this._request.UserHostName;
230                                 case "REMOTE_ADDRESS":
231                                         return this._request.UserHostAddress;
232                                 case "SCRIPT_NAME":
233                                         return this._request.FilePath;
234                                 case "LOCAL_ADDR":
235                                         return this._request.WorkerRequest.GetLocalAddress ();
236                                 case "SERVER_PROTOCOL":
237                                         return _request.WorkerRequest.GetHttpVersion ();
238                                 case "CONTENT_TYPE":
239                                         return _request.ContentType;
240                                 case "REMOTE_PORT":
241                                         return _request.WorkerRequest.GetRemotePort ().ToString ();
242                                 case "SERVER_NAME":
243                                         return _request.WorkerRequest.GetServerName ();
244                                 case "SERVER_PORT":
245                                         return _request.WorkerRequest.GetLocalPort ().ToString ();
246                                 case "APPL_PHYSICAL_PATH":
247                                         return _request.WorkerRequest.GetAppPathTranslated ();
248                                 case "REMOTE_USER":
249                                         return (_request.Context.User != null && _request.Context.User.Identity.IsAuthenticated) ?
250                                                 _request.Context.User.Identity.Name :
251                                                 String.Empty;
252                                 case "URL":
253                                         return _request.FilePath;
254                                 case "SERVER_PORT_SECURE":
255                                         return (_request.WorkerRequest.IsSecure ()) ? "1" : "0";
256                                 case "ALL_HTTP":
257                                         return Fill (_request.WorkerRequest, true);
258                                 case "ALL_RAW":
259                                         return Fill (_request.WorkerRequest, false);
260                                 case "SERVER_SOFTWARE":
261                                 case "APPL_MD_PATH":
262                                 case "AUTH_PASSWORD":
263                                 case "CERT_COOKIE":
264                                 case "CERT_FLAGS":
265                                 case "CERT_ISSUER":
266                                 case "CERT_KEYSIZE":
267                                 case "CERT_SECRETKEYSIZE":
268                                 case "CERT_SERIALNUMBER":
269                                 case "CERT_SERVER_ISSUER":
270                                 case "CERT_SERVER_SUBJECT":
271                                 case "GATEWAY_INTERFACE":
272                                 case "HTTPS":
273                                 case "HTTPS_KEYSIZE":
274                                 case "HTTPS_SECRETKEYSIZE":
275                                 case "HTTPS_SERVER_ISSUER":
276                                 case "HTTPS_SERVER_SUBJECT":
277                                 case "INSTANCE_ID":
278                                 case "INSTANCE_META_PATH":
279                                 case "LOGON_USER":
280                                 case "HTTP_ACCEPT":
281                                 case "HTTP_REFERER":
282                                 case "HTTP_ACCEPT_LANGUAGE":
283                                 case "HTTP_ACCEPT_ENCODING":
284                                 case "HTTP_CONNECTION":
285                                 case "HTTP_HOST":
286                                 case "HTTP_USER_AGENT":
287                                 case "HTTP_SOAPACTION":
288                                         return _request.WorkerRequest.GetServerVariable (name);
289                                 default:
290                                         return null;
291                         }
292                 }
293         }
294 }