[asp.net] Fix for bug #648439. Do not prefix HttpRequest.ServerVariables ["QUERY_STRI...
[mono.git] / mcs / class / System.Web / System.Web / ServerVariablesCollection.cs
index 281ad3acbcedbc4063097c20e0f8da3e74773cfa..e94a6732e5008210c89b5a2b0601c6d54f352bc7 100644 (file)
@@ -3,10 +3,11 @@
 //
 // Authors:
 //     Alon Gazit (along@mainsoft.com)
+//     Miguel de Icaza (miguel@novell.com)
+//     Gonzalo Paniagua Javier (gonzalo@novell.com)
 //
 // (c) 2004 Mainsoft, Inc. (http://www.mainsoft.com)
-//\r
-
+// Copyright (C) 2005 Novell, Inc (http://www.novell.com)
 //
 // Permission is hereby granted, free of charge, to any person obtaining
 // a copy of this software and associated documentation files (the
 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
-using System;\r
-using System.Collections;\r
-using System.Runtime.Serialization;\r
-using System.Globalization;\r
-\r
-namespace System.Web\r
-{\r
-\r
-       internal class ServerVariablesCollection:HttpValueCollection\r
-       {\r
-               private HttpRequest _request;\r
-               private bool _loaded = false;\r
-
-               public ServerVariablesCollection(HttpRequest request)
-               {\r
-                       _request = request;\r
-               }\r
-\r
-               private void loadServerVariablesCollection()\r
-               {\r
-                       if (_loaded)\r
-                               return;\r
-                       MakeReadWrite();\r
-                       Add("ALL_HTTP", _request.GetAllHeaders(false));\r
-                       Add("ALL_RAW", _request.GetAllHeaders(true));\r
-                       Add("APPL_MD_PATH", _request.WorkerRequest.GetServerVariable("APPL_MD_PATH"));\r
-                       Add("APPL_PHYSICAL_PATH", _request.WorkerRequest.GetServerVariable("APPL_PHYSICAL_PATH"));\r
-
-                       if (null != _request.Context.User && _request.Context.User.Identity.IsAuthenticated) {
-                               Add ("AUTH_TYPE", _request.Context.User.Identity.AuthenticationType);
-                               Add ("AUTH_USER", _request.Context.User.Identity.Name);
+
+using System.Text;
+using System.Collections;
+using System.Collections.Specialized;
+using System.Runtime.Serialization;
+using System.Globalization;
+using System.Security.Permissions;
+using System.Web.Util;
+
+namespace System.Web
+{
+       class ServerVariablesCollection : BaseParamsCollection
+       {
+               HttpRequest request;
+               bool loaded;
+
+               string QueryString {
+                       get {
+                               string qs = _request.QueryStringRaw;
+
+                               if (String.IsNullOrEmpty (qs))
+                                       return qs;
+
+                               if (qs [0] == '?')
+                                       return qs.Substring (1);
+
+                               return qs;
+                       }
+               }
+               
+               public ServerVariablesCollection(HttpRequest request) : base(request)
+               {
+                       IsReadOnly = true;
+                       this.request = request;
+               }
+
+               void AppendKeyValue (StringBuilder sb, string key, string value, bool standard)
+               {
+                       //
+                       // Standard has HTTP_ prefix, everything is uppercase, has no space
+                       // after colon, - is changed to _
+                       //
+                       // Raw is header, colon, space, values, raw.
+                       //
+                       if (standard){
+                               sb.Append ("HTTP_");
+                               sb.Append (key.ToUpper (Helpers.InvariantCulture).Replace ('-', '_'));
+                               sb.Append (":");
+                       } else {
+                               sb.Append (key);
+                               sb.Append (": ");
+                       }
+                       sb.Append (value);
+                       sb.Append ("\r\n");
+               }
+                                    
+               string Fill (HttpWorkerRequest wr, bool standard)
+               {
+                       StringBuilder sb = new StringBuilder ();
+                       
+                       for (int i = 0; i < HttpWorkerRequest.RequestHeaderMaximum; i++){
+                               string val = wr.GetKnownRequestHeader (i);
+                               if (val == null || val == "")
+                                       continue;
+                               string key = HttpWorkerRequest.GetKnownRequestHeaderName (i);
+                               AppendKeyValue (sb, key, val, standard);
+                       }
+                       string [][] other = wr.GetUnknownRequestHeaders ();
+                       if (other == null)
+                               return sb.ToString ();
+
+                       for (int i = other.Length; i > 0; ){
+                               i--;
+                               AppendKeyValue (sb, other [i][0], other [i][1], standard);
+                       }
+
+                       return sb.ToString ();
+               }
+
+               void AddHeaderVariables (HttpWorkerRequest wr)
+               {
+                       string hname;
+                       string hvalue;
+
+                       // Add all known headers
+                       for (int i = 0; i < HttpWorkerRequest.RequestHeaderMaximum; i++) {
+                               hvalue = wr.GetKnownRequestHeader (i);
+                               if (null != hvalue && hvalue.Length > 0) {
+                                       hname = HttpWorkerRequest.GetKnownRequestHeaderName (i);
+                                       if (null != hname && hname.Length > 0)
+                                               Add ("HTTP_" + hname.ToUpper (Helpers.InvariantCulture).Replace ('-', '_'), hvalue);
+                               }
+                       }
+
+                       // Get all other headers
+                       string [][] unknown = wr.GetUnknownRequestHeaders ();
+                       if (null != unknown) {
+                               for (int i = 0; i < unknown.Length; i++) {
+                                       hname = unknown [i][0];
+                                       if (hname == null)
+                                               continue;
+                                       hvalue = unknown [i][1];
+                                       Add ("HTTP_" + hname.ToUpper (Helpers.InvariantCulture).Replace ('-', '_'), hvalue);
+                               }
+                       }
+               }
+
+               void loadServerVariablesCollection()
+               {
+                       HttpWorkerRequest wr = request.WorkerRequest;
+                       if (loaded || (wr == null))
+                               return;
+
+                       IsReadOnly = false;
+               
+                       Add("ALL_HTTP", Fill (wr, true));
+                       Add("ALL_RAW",  Fill (wr, false));
+                           
+                       Add("APPL_MD_PATH", wr.GetServerVariable("APPL_MD_PATH"));
+                       Add("APPL_PHYSICAL_PATH", wr.GetServerVariable("APPL_PHYSICAL_PATH"));
+
+                       if (null != request.Context.User && request.Context.User.Identity.IsAuthenticated) {
+                               Add ("AUTH_TYPE", request.Context.User.Identity.AuthenticationType);
+                               Add ("AUTH_USER", request.Context.User.Identity.Name);
                        } else {
                                Add ("AUTH_TYPE", "");
                                Add ("AUTH_USER", "");
                        }
 
-                       Add("AUTH_PASSWORD", _request.WorkerRequest.GetServerVariable("AUTH_PASSWORD"));\r
-                       Add ("LOGON_USER", _request.WorkerRequest.GetServerVariable("LOGON_USER"));
-                       Add ("REMOTE_USER", _request.WorkerRequest.GetServerVariable("REMOTE_USER"));
-                       Add("CERT_COOKIE", _request.WorkerRequest.GetServerVariable("CERT_COOKIE"));\r
-                       Add("CERT_FLAGS", _request.WorkerRequest.GetServerVariable("CERT_FLAGS"));\r
-                       Add("CERT_ISSUER", _request.WorkerRequest.GetServerVariable("CERT_ISSUER"));\r
-                       Add("CERT_KEYSIZE", _request.WorkerRequest.GetServerVariable("CERT_KEYSIZE"));\r
-                       Add("CERT_SECRETKEYSIZE", _request.WorkerRequest.GetServerVariable("CERT_SECRETKEYSIZE"));\r
-                       Add("CERT_SERIALNUMBER", _request.WorkerRequest.GetServerVariable("CERT_SERIALNUMBER"));\r
-                       Add("CERT_SERVER_ISSUER", _request.WorkerRequest.GetServerVariable("CERT_SERVER_ISSUER"));\r
-                       Add("CERT_SERVER_SUBJECT", _request.WorkerRequest.GetServerVariable("CERT_SERVER_SUBJECT"));\r
-                       Add("CERT_SUBJECT", _request.WorkerRequest.GetServerVariable("CERT_SUBJECT"));\r
-
-                       string sTmp = _request.WorkerRequest.GetKnownRequestHeader(HttpWorkerRequest.HeaderContentLength);
+                       Add("AUTH_PASSWORD", wr.GetServerVariable("AUTH_PASSWORD"));
+                       Add ("LOGON_USER", wr.GetServerVariable("LOGON_USER"));
+                       Add ("REMOTE_USER", wr.GetServerVariable("REMOTE_USER"));
+                       Add("CERT_COOKIE", wr.GetServerVariable("CERT_COOKIE"));
+                       Add("CERT_FLAGS", wr.GetServerVariable("CERT_FLAGS"));
+                       Add("CERT_ISSUER", wr.GetServerVariable("CERT_ISSUER"));
+                       Add("CERT_KEYSIZE", wr.GetServerVariable("CERT_KEYSIZE"));
+                       Add("CERT_SECRETKEYSIZE", wr.GetServerVariable("CERT_SECRETKEYSIZE"));
+                       Add("CERT_SERIALNUMBER", wr.GetServerVariable("CERT_SERIALNUMBER"));
+                       Add("CERT_SERVER_ISSUER", wr.GetServerVariable("CERT_SERVER_ISSUER"));
+                       Add("CERT_SERVER_SUBJECT", wr.GetServerVariable("CERT_SERVER_SUBJECT"));
+                       Add("CERT_SUBJECT", wr.GetServerVariable("CERT_SUBJECT"));
+
+                       string sTmp = wr.GetKnownRequestHeader(HttpWorkerRequest.HeaderContentLength);
                        if (null != sTmp)
                                Add ("CONTENT_LENGTH", sTmp);
-                       Add ("CONTENT_TYPE", _request.ContentType);
-
-                       Add("GATEWAY_INTERFACE", _request.WorkerRequest.GetServerVariable("GATEWAY_INTERFACE"));\r
-                       Add("HTTPS", _request.WorkerRequest.GetServerVariable("HTTPS"));\r
-                       Add("HTTPS_KEYSIZE", _request.WorkerRequest.GetServerVariable("HTTPS_KEYSIZE"));\r
-                       Add("HTTPS_SECRETKEYSIZE", _request.WorkerRequest.GetServerVariable("HTTPS_SECRETKEYSIZE"));\r
-                       Add("HTTPS_SERVER_ISSUER", _request.WorkerRequest.GetServerVariable("HTTPS_SERVER_ISSUER"));\r
-                       Add("HTTPS_SERVER_SUBJECT", _request.WorkerRequest.GetServerVariable("HTTPS_SERVER_SUBJECT"));\r
-                       Add("INSTANCE_ID", _request.WorkerRequest.GetServerVariable("INSTANCE_ID"));\r
-                       Add("INSTANCE_META_PATH", _request.WorkerRequest.GetServerVariable("INSTANCE_META_PATH"));\r
-                       Add("LOCAL_ADDR", _request.WorkerRequest.GetLocalAddress());\r
-                       Add("PATH_INFO", _request.PathInfo);\r
-                       Add("PATH_TRANSLATED", _request.PhysicalPath);\r
-                       Add("QUERY_STRING", _request.QueryStringRaw);\r
-                       Add("REMOTE_ADDR", _request.UserHostAddress);\r
-                       Add("REMOTE_HOST", _request.UserHostName);\r
-                       Add("REMOTE_PORT", _request.WorkerRequest.GetRemotePort ().ToString ());\r
-                       Add("REQUEST_METHOD", _request.HttpMethod);\r
-                       Add("SCRIPT_NAME", _request.FilePath);\r
-                       Add("SERVER_NAME", _request.WorkerRequest.GetServerName());\r
-                       Add("SERVER_PORT", _request.WorkerRequest.GetLocalPort().ToString());\r
-                       if (_request.WorkerRequest.IsSecure()) 
+                       Add ("CONTENT_TYPE", request.ContentType);
+
+                       Add("GATEWAY_INTERFACE", wr.GetServerVariable("GATEWAY_INTERFACE"));
+                       Add("HTTPS", wr.GetServerVariable("HTTPS"));
+                       Add("HTTPS_KEYSIZE", wr.GetServerVariable("HTTPS_KEYSIZE"));
+                       Add("HTTPS_SECRETKEYSIZE", wr.GetServerVariable("HTTPS_SECRETKEYSIZE"));
+                       Add("HTTPS_SERVER_ISSUER", wr.GetServerVariable("HTTPS_SERVER_ISSUER"));
+                       Add("HTTPS_SERVER_SUBJECT", wr.GetServerVariable("HTTPS_SERVER_SUBJECT"));
+                       Add("INSTANCE_ID", wr.GetServerVariable("INSTANCE_ID"));
+                       Add("INSTANCE_META_PATH", wr.GetServerVariable("INSTANCE_META_PATH"));
+                       Add("LOCAL_ADDR", wr.GetLocalAddress());
+                       Add("PATH_INFO", request.PathInfo);
+                       Add("PATH_TRANSLATED", request.PhysicalPath);
+                       Add("QUERY_STRING", QueryString);
+                       Add("REMOTE_ADDR", request.UserHostAddress);
+                       Add("REMOTE_HOST", request.UserHostName);
+                       Add("REMOTE_PORT", wr.GetRemotePort ().ToString ());
+                       Add("REQUEST_METHOD", request.HttpMethod);
+                       Add("SCRIPT_NAME", request.FilePath);
+                       Add("SERVER_NAME", wr.GetServerName());
+                       Add("SERVER_PORT", wr.GetLocalPort().ToString());
+                       if (wr.IsSecure()) 
                                Add("SERVER_PORT_SECURE", "1");
                        else
                                Add("SERVER_PORT_SECURE", "0");
-                       Add("SERVER_PROTOCOL", _request.WorkerRequest.GetHttpVersion());\r
-                       Add("SERVER_SOFTWARE", _request.WorkerRequest.GetServerVariable("SERVER_SOFTWARE"));\r
-                       Add ("URL", _request.Url.AbsolutePath);
-\r
-                       _request.AddHeaderVariables (this);
-                       MakeReadOnly();\r
-                       _loaded = true;\r
-               }\r
-\r
\r
-               public override string Get(int index)\r
-               {\r
-                       loadServerVariablesCollection();\r
-                       return base.Get(index); \r
-               }\r
-\r
-               public override string Get(string name)\r
-               {\r
-                       string text1;\r
-                       if (!_loaded)\r
-                       {\r
-                               text1 = GetServerVar(name);\r
-                               if (text1 != null)                              \r
-                                       return text1;                           \r
-                               loadServerVariablesCollection(); \r
-                       }\r
-                       return base.Get(name); \r
-\r
-                       \r
-               }\r
-\r
-               private string GetServerVar(string name)\r
-               {\r
-                       if (((name == null) || (name.Length <= 8)) || (this._request == null))\r
-                               return null;\r
-                       if (string.Compare(name, "AUTH_TYPE", true, CultureInfo.InvariantCulture) == 0)\r
-                       {\r
-                               if (null != _request.Context.User && _request.Context.User.Identity.IsAuthenticated) \r
-                                       return _request.Context.User.Identity.AuthenticationType;\r
-                               else\r
-                                       return string.Empty;\r
-                       }\r
-                       else if (string.Compare(name, "AUTH_USER",true, CultureInfo.InvariantCulture) == 0)\r
-                       {\r
-                               if (null != _request.Context.User && _request.Context.User.Identity.IsAuthenticated) \r
-                                       return _request.Context.User.Identity.Name;\r
-                               else\r
-                                       return string.Empty;\r
-                       }\r
-                       else if (string.Compare(name, "QUERY_STRING", true, CultureInfo.InvariantCulture) == 0)                         \r
-                               return this._request.QueryStringRaw; \r
-                       else if (string.Compare(name, "PATH_INFO", true, CultureInfo.InvariantCulture) == 0)                            \r
-                               return this._request.PathInfo; \r
-                       else if (string.Compare(name, "PATH_TRANSLATED", true, CultureInfo.InvariantCulture) == 0)\r
-                               return this._request.PhysicalPath;                      \r
-                       else if (string.Compare(name, "REQUEST_METHOD", true, CultureInfo.InvariantCulture) == 0)                               \r
-                               return this._request.HttpMethod;\r
-                       else if (string.Compare(name, "REMOTE_ADDR", true, CultureInfo.InvariantCulture) == 0)                  \r
-                               return this._request.UserHostAddress;                   \r
-                       else if (string.Compare(name, "REMOTE_HOST", true, CultureInfo.InvariantCulture) == 0)                  \r
-                               return this._request.UserHostName;                      \r
-                       else if (string.Compare(name, "REMOTE_ADDRESS", true, CultureInfo.InvariantCulture) == 0)\r
-                               return this._request.UserHostAddress; \r
-                       else if (string.Compare(name, "SCRIPT_NAME", true, CultureInfo.InvariantCulture) == 0)                          \r
-                               return this._request.FilePath;\r
-                       else if (string.Compare(name, "LOCAL_ADDR", true, CultureInfo.InvariantCulture) == 0)                           \r
-                               return this._request.WorkerRequest.GetLocalAddress();\r
-                       else if (string.Compare(name, "SERVER_PROTOCOL", true, CultureInfo.InvariantCulture) == 0)\r
-                               return _request.WorkerRequest.GetHttpVersion();\r
-                       else if (string.Compare(name, "SERVER_SOFTWARE", true, CultureInfo.InvariantCulture) == 0)\r
-                               return _request.WorkerRequest.GetServerVariable("SERVER_SOFTWARE");\r
-                       return null; \r
-               }\r
\r
-               public override string GetKey(int index)\r
-               {\r
-                       loadServerVariablesCollection();\r
-                       return base.GetKey(index); \r
-               }\r
\r
-               public override string[] GetValues(int index)\r
-               {\r
-                       string text1;\r
-                       string[] array1;\r
-                       text1 = Get(index);\r
-                       if (text1 == null)\r
-                       {\r
-                               return null; \r
-                       }\r
-                       array1 = new string[1];\r
-                       array1[0] = text1;\r
-                       return array1; \r
-               }\r
\r
-               public override string[] GetValues(string name)\r
-               {\r
-                       string text1;\r
-                       string[] array1;\r
-                       text1 = Get(name);\r
-                       if (text1 == null)\r
-                       {\r
-                               return null; \r
-                       }\r
-                       array1 = new string[1];\r
-                       array1[0] = text1;\r
-                       return array1; \r
-               }\r
\r
-               public override void GetObjectData(SerializationInfo info, StreamingContext context)\r
-               {\r
-                       throw new SerializationException(); \r
-               }\r
-\r
-               public override string[] AllKeys 
+                       Add("SERVER_PROTOCOL", wr.GetHttpVersion());
+                       Add("SERVER_SOFTWARE", wr.GetServerVariable("SERVER_SOFTWARE"));
+                       Add ("URL", request.FilePath);
+
+                       AddHeaderVariables (wr);
+
+                       IsReadOnly = true;
+                       loaded = true;
+               }
+
+               protected override void InsertInfo ()
                {
-                       get \r
-                       {
-                               loadServerVariablesCollection();
-                               return base.AllKeys;
-                       }
-               }\r
-\r
-               public override int Count 
+                       loadServerVariablesCollection ();
+               }
+
+               protected override string InternalGet (string name)
                {
-                       get \r
-                       {
-                               loadServerVariablesCollection();
-                               return base.Count;
+                       if ((name == null) || (this._request == null))
+                               return null;
+                       name = name.ToUpper (Helpers.InvariantCulture);
+                       switch (name) {
+                               case "AUTH_TYPE":
+                                       if (null != _request.Context.User && _request.Context.User.Identity.IsAuthenticated)
+                                               return _request.Context.User.Identity.AuthenticationType;
+                                       else
+                                               return string.Empty;
+                               case "AUTH_USER":
+                                       if (null != _request.Context.User && _request.Context.User.Identity.IsAuthenticated)
+                                               return _request.Context.User.Identity.Name;
+                                       else
+                                               return string.Empty;
+                               case "QUERY_STRING":
+                                       return QueryString;
+                               case "PATH_INFO":
+                                       return this._request.PathInfo;
+                               case "PATH_TRANSLATED":
+                                       return this._request.PhysicalPath;
+                               case "REQUEST_METHOD":
+                                       return this._request.HttpMethod;
+                               case "REMOTE_ADDR":
+                                       return this._request.UserHostAddress;
+                               case "REMOTE_HOST":
+                                       return this._request.UserHostName;
+                               case "REMOTE_ADDRESS":
+                                       return this._request.UserHostAddress;
+                               case "SCRIPT_NAME":
+                                       return this._request.FilePath;
+                               case "LOCAL_ADDR":
+                                       return this._request.WorkerRequest.GetLocalAddress ();
+                               case "SERVER_PROTOCOL":
+                                       return _request.WorkerRequest.GetHttpVersion ();
+                               case "CONTENT_TYPE":
+                                       return _request.ContentType;
+                               case "REMOTE_PORT":
+                                       return _request.WorkerRequest.GetRemotePort ().ToString ();
+                               case "SERVER_NAME":
+                                       return _request.WorkerRequest.GetServerName ();
+                               case "SERVER_PORT":
+                                       return _request.WorkerRequest.GetLocalPort ().ToString ();
+                               case "APPL_PHYSICAL_PATH":
+                                       return _request.WorkerRequest.GetAppPathTranslated ();
+                               case "REMOTE_USER":
+                                       return (_request.Context.User != null && _request.Context.User.Identity.IsAuthenticated) ?
+                                               _request.Context.User.Identity.Name :
+                                               String.Empty;
+                               case "URL":
+                                       return _request.FilePath;
+                               case "SERVER_PORT_SECURE":
+                                       return (_request.WorkerRequest.IsSecure ()) ? "1" : "0";
+                               case "ALL_HTTP":
+                                       return Fill (_request.WorkerRequest, true);
+                               case "ALL_RAW":
+                                       return Fill (_request.WorkerRequest, false);
+                               case "SERVER_SOFTWARE":
+                               case "APPL_MD_PATH":
+                               case "AUTH_PASSWORD":
+                               case "CERT_COOKIE":
+                               case "CERT_FLAGS":
+                               case "CERT_ISSUER":
+                               case "CERT_KEYSIZE":
+                               case "CERT_SECRETKEYSIZE":
+                               case "CERT_SERIALNUMBER":
+                               case "CERT_SERVER_ISSUER":
+                               case "CERT_SERVER_SUBJECT":
+                               case "GATEWAY_INTERFACE":
+                               case "HTTPS":
+                               case "HTTPS_KEYSIZE":
+                               case "HTTPS_SECRETKEYSIZE":
+                               case "HTTPS_SERVER_ISSUER":
+                               case "HTTPS_SERVER_SUBJECT":
+                               case "INSTANCE_ID":
+                               case "INSTANCE_META_PATH":
+                               case "LOGON_USER":
+                               case "HTTP_ACCEPT":
+                               case "HTTP_REFERER":
+                               case "HTTP_ACCEPT_LANGUAGE":
+                               case "HTTP_ACCEPT_ENCODING":
+                               case "HTTP_CONNECTION":
+                               case "HTTP_HOST":
+                               case "HTTP_USER_AGENT":
+                               case "HTTP_SOAPACTION":
+                                       return _request.WorkerRequest.GetServerVariable (name);
+                               default:
+                                       return null;
                        }
-               } \r
-       }\r
-}\r
+               }
+       }
+}