2 // System.Web.ServerVariablesCollection
5 // Alon Gazit (along@mainsoft.com)
6 // Miguel de Icaza (miguel@novell.com)
7 // Gonzalo Paniagua Javier (gonzalo@novell.com)
9 // (c) 2004 Mainsoft, Inc. (http://www.mainsoft.com)
10 // Copyright (C) 2005 Novell, Inc (http://www.novell.com)
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:
20 // The above copyright notice and this permission notice shall be
21 // included in all copies or substantial portions of the Software.
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.
33 using System.Collections;
34 using System.Collections.Specialized;
35 using System.Runtime.Serialization;
36 using System.Globalization;
37 using System.Security.Permissions;
41 class ServerVariablesCollection : NameValueCollection
46 public ServerVariablesCollection(HttpRequest request)
49 this.request = request;
52 void AppendKeyValue (StringBuilder sb, string key, string value, bool standard)
55 // Standard has HTTP_ prefix, everything is uppercase, has no space
56 // after colon, - is changed to _
58 // Raw is header, colon, space, values, raw.
62 sb.Append (key.ToUpper ().Replace ("-", "_"));
72 string Fill (HttpWorkerRequest wr, bool standard)
74 StringBuilder sb = new StringBuilder ();
76 for (int i = 0; i < HttpWorkerRequest.RequestHeaderMaximum; i++){
77 string val = wr.GetKnownRequestHeader (i);
78 if (val == null || val == "")
80 string key = HttpWorkerRequest.GetKnownRequestHeaderName (i);
81 AppendKeyValue (sb, key, val, standard);
83 string [][] other = wr.GetUnknownRequestHeaders ();
85 return sb.ToString ();
87 for (int i = other.Length; i > 0; ){
89 AppendKeyValue (sb, other [i][0], other [i][1], standard);
92 return sb.ToString ();
95 void AddHeaderVariables (HttpWorkerRequest wr)
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);
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];
117 hvalue = unknown [i][1];
118 Add ("HTTP_" + hname.ToUpper ().Replace ('-', '_'), hvalue);
123 private void loadServerVariablesCollection()
125 HttpWorkerRequest wr = request.WorkerRequest;
126 if (loaded || (wr == null))
131 Add("ALL_HTTP", Fill (wr, true));
132 Add("ALL_RAW", Fill (wr, false));
134 Add("APPL_MD_PATH", wr.GetServerVariable("APPL_MD_PATH"));
135 Add("APPL_PHYSICAL_PATH", wr.GetServerVariable("APPL_PHYSICAL_PATH"));
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);
141 Add ("AUTH_TYPE", "");
142 Add ("AUTH_USER", "");
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"));
158 string sTmp = wr.GetKnownRequestHeader(HttpWorkerRequest.HeaderContentLength);
160 Add ("CONTENT_LENGTH", sTmp);
161 Add ("CONTENT_TYPE", request.ContentType);
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());
183 Add("SERVER_PORT_SECURE", "1");
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);
190 AddHeaderVariables (wr);
197 public override string Get(int index)
199 loadServerVariablesCollection();
200 return base.Get(index);
203 public override string Get(string name)
207 text1 = GetServerVar(name);
210 loadServerVariablesCollection();
212 return base.Get(name);
217 private string GetServerVar(string name)
219 if (((name == null) || (name.Length <= 8)) || (this.request == null))
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;
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;
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");
257 public override string GetKey(int index)
259 loadServerVariablesCollection();
260 return base.GetKey(index);
263 public override string[] GetValues(int index)
272 array1 = new string[1];
278 public override string[] GetValues(string name)
286 array1 = new string[1];
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)
296 throw new SerializationException();
299 public override string[] AllKeys
302 loadServerVariablesCollection ();
307 public override int Count
310 loadServerVariablesCollection ();