Przeglądaj źródła

2002-08-26 Gonzalo Paniagua Javier <[email protected]>

	* HttpApplicationFactory.cs:
	* HttpCachePolicy.cs:
	* HttpResponseHeader.cs:
	* HttpResponseStream.cs:
	* HttpResponseStreamProxy.cs:
	* HttpValueCollection.cs: misc. fixes based on class status page.

	* IHttpMapPath.cs: New file.

	* HttpRequest.cs: implemented ContentEncoding.
	* HttpWorkerRequest.cs: mono-stylized and implemented
	SendResponseFromMemory.

svn path=/trunk/mcs/; revision=7057
Gonzalo Paniagua Javier 23 lat temu
rodzic
commit
22239e7634

+ 15 - 0
mcs/class/System.Web/System.Web/ChangeLog

@@ -1,3 +1,18 @@
+2002-08-26  Gonzalo Paniagua Javier <[email protected]>
+
+	* HttpApplicationFactory.cs:
+	* HttpCachePolicy.cs:
+	* HttpResponseHeader.cs:
+	* HttpResponseStream.cs:
+	* HttpResponseStreamProxy.cs:
+	* HttpValueCollection.cs: misc. fixes based on class status page.
+
+	* IHttpMapPath.cs: New file.
+
+	* HttpRequest.cs: implemented ContentEncoding.
+	* HttpWorkerRequest.cs: mono-stylized and implemented
+	SendResponseFromMemory.
+
 2002-08-18  Gonzalo Paniagua Javier <[email protected]>
 
 	* HttpContext.cs: reformatted.

+ 3 - 3
mcs/class/System.Web/System.Web/HttpApplicationFactory.cs

@@ -15,7 +15,7 @@ namespace System.Web {
 	/// TODO: We need to compile the global.asax into a type inherited from HttpApplication
 	/// </summary>
 	[MonoTODO]
-	public class HttpApplicationFactory {
+	class HttpApplicationFactory {
 		private string _appFilename;
 		private Type _appType;
 
@@ -182,8 +182,8 @@ namespace System.Web {
 			s_Factory.FireOnSessionStart(state, source, args);
 		}
 
-		static public void EndSession(HttpSessionState state, object source, EventArgs args) {
+		static void EndSession(HttpSessionState state, object source, EventArgs args) {
 			s_Factory.FireOnSessionEnd(state, source, args);
 		}
 	}
-}
+}

+ 4 - 0
mcs/class/System.Web/System.Web/HttpCachePolicy.cs

@@ -10,6 +10,10 @@ using System;
 namespace System.Web {
 	public sealed class HttpCachePolicy {
 
+		internal HttpCachePolicy ()
+		{
+		}
+
 		#region Fields
 
 		HttpCacheVaryByHeaders varyByHeaders;

+ 42 - 8
mcs/class/System.Web/System.Web/HttpRequest.cs

@@ -1,9 +1,13 @@
 // 
 // System.Web.HttpRequest
 //
-// Author:
-//   Patrik Torstensson ([email protected])
-//
+// Authors:
+//   	Patrik Torstensson ([email protected])
+//   	Gonzalo Paniagua Javier ([email protected])
+// 
+// (c) 2001, 2002 Patrick Torstensson
+// (c) 2002 Ximian, Inc. (http://www.ximian.com)
+// 
 using System;
 using System.Collections;
 using System.Collections.Specialized;
@@ -287,13 +291,43 @@ namespace System.Web {
 			}
 		}
 
-		[MonoTODO("Get content encoding from Syste.Web.Configuration namespace")]
-		public Encoding ContentEncoding {
+		private string GetValueFromHeader (string header, string attr)
+		{
+			int where = header.IndexOf (attr + '=');
+			if (where == -1)
+				return null;
+
+			where += attr.Length + 1;
+			int max = header.Length;
+			if (where >= max)
+				return String.Empty;
+
+			char ending = header [where];
+			if (ending != '"')
+				ending = ' ';
+
+			int end = header.Substring (where + 1).IndexOf (ending);
+			if (end == -1)
+				return (ending == '"') ? null : header.Substring (where);
+
+			return header.Substring (where, end);
+		}
+		
+		public Encoding ContentEncoding
+		{
 			get {
 				if (_oContentEncoding == null) {
-					// TODO: Get from config what is the default encoding
-					// TODO: Should we get encoding from HttpHeaders? Just get charset from ContentType and the get encoding..
-					_oContentEncoding = Encoding.Default;
+					if (!_WorkerRequest.HasEntityBody () || ContentType != String.Empty)
+						return null;
+
+					string charset = GetValueFromHeader (_sContentType, "charset");
+					if (charset == null)
+						return null;
+
+					try {
+						_oContentEncoding = Encoding.GetEncoding (charset);
+					} catch {
+					}
 				}
 
 				return _oContentEncoding;

+ 0 - 4
mcs/class/System.Web/System.Web/HttpResponseHeader.cs

@@ -38,10 +38,6 @@ namespace System.Web {
          }
       }
 
-      override public string ToString() {
-         return Name + ": " + Value;
-      }
-
       internal void SendContent(HttpWorkerRequest WorkerRequest) {
          if (null != _sHeader) {
             WorkerRequest.SendUnknownResponseHeader(_sHeader, _sValue);

+ 1 - 1
mcs/class/System.Web/System.Web/HttpResponseStream.cs

@@ -11,7 +11,7 @@ namespace System.Web {
    /// <summary>
    /// Simple wrapper around HttpWriter to support the Stream interface
    /// </summary>
-   public class HttpResponseStream : Stream {
+   class HttpResponseStream : Stream {
       private HttpWriter _Writer;
 	   
       internal HttpResponseStream(HttpWriter Writer) {

+ 1 - 1
mcs/class/System.Web/System.Web/HttpResponseStreamProxy.cs

@@ -11,7 +11,7 @@ namespace System.Web {
    /// <summary>
    /// Used to detect if there is a valid filter proxy.
    /// </summary>
-   public class HttpResponseStreamProxy : HttpResponseStream {
+   class HttpResponseStreamProxy : HttpResponseStream {
       bool _FilteringActive;
 	   
       internal HttpResponseStreamProxy(HttpWriter Writer) : base(Writer) {

+ 1 - 1
mcs/class/System.Web/System.Web/HttpValueCollection.cs

@@ -12,7 +12,7 @@ using System.Text;
 namespace System.Web {
 
    [Serializable]
-   public class HttpValueCollection : NameValueCollection {
+   class HttpValueCollection : NameValueCollection {
       private bool	_bHeaders;
 
       internal HttpValueCollection() {

+ 529 - 477
mcs/class/System.Web/System.Web/HttpWorkerRequest.cs

@@ -1,477 +1,529 @@
-// 
-// System.Web.HttpResponseStreamProxy
-//
-// Author:
-//   Patrik Torstensson ([email protected])
-//   (constants from Bob Smith ([email protected]))
-//
-using System;
-using System.Collections;
-
-namespace System.Web {
-   public abstract class HttpWorkerRequest {
-      public delegate void EndOfSendNotification(HttpWorkerRequest wr, object extraData);
-
-      public const int HeaderAccept = 20;
-      public const int HeaderAcceptCharset = 21;
-      public const int HeaderAcceptEncoding = 22;
-      public const int HeaderAcceptLanguage = 23;
-      public const int HeaderAcceptRanges = 20;
-      public const int HeaderAge = 21;
-      public const int HeaderAllow = 10;
-      public const int HeaderAuthorization = 24;
-      public const int HeaderCacheControl = 0;
-      public const int HeaderConnection = 1;
-      public const int HeaderContentEncoding = 13;
-      public const int HeaderContentLanguage = 14;
-      public const int HeaderContentLength = 11;
-      public const int HeaderContentLocation = 15;
-      public const int HeaderContentMd5 = 16;
-      public const int HeaderContentRange = 17;
-      public const int HeaderContentType = 12;
-      public const int HeaderCookie = 25;
-      public const int HeaderDate = 2;
-      public const int HeaderEtag = 22;
-      public const int HeaderExpect = 26;
-      public const int HeaderExpires = 18;
-      public const int HeaderFrom = 27;
-      public const int HeaderHost = 28;
-      public const int HeaderIfMatch = 29;
-      public const int HeaderIfModifiedSince = 30;
-      public const int HeaderIfNoneMatch = 31;
-      public const int HeaderIfRange = 32;
-      public const int HeaderIfUnmodifiedSince = 33;
-      public const int HeaderKeepAlive = 3;
-      public const int HeaderLastModified = 19;
-      public const int HeaderLocation = 23;
-      public const int HeaderMaxForwards = 34;
-      public const int HeaderPragma = 4;
-      public const int HeaderProxyAuthenticate = 24;
-      public const int HeaderProxyAuthorization = 35;
-      public const int HeaderRange = 37;
-      public const int HeaderReferer = 36;
-      public const int HeaderRetryAfter = 25;
-      public const int HeaderServer = 26;
-      public const int HeaderSetCookie = 27;
-      public const int HeaderTe = 38;
-      public const int HeaderTrailer = 5;
-      public const int HeaderTransferEncoding = 6;
-      public const int HeaderUpgrade = 7;
-      public const int HeaderUserAgent = 39;
-      public const int HeaderVary = 28;
-      public const int HeaderVia = 8;
-      public const int HeaderWarning = 9;
-      public const int HeaderWwwAuthenticate = 29;
-      public const int ReasonCachePolicy = 2;
-      public const int ReasonCacheSecurity = 3;
-      public const int ReasonClientDisconnect = 4;
-      public const int ReasonDefault = 0;
-      public const int ReasonFileHandleCacheMiss = 1;
-      public const int ReasonResponseCacheMiss = 0;
-      public const int RequestHeaderMaximum = 40;
-      public const int ResponseHeaderMaximum = 30;
-
-      static string [][] s_HttpStatusDescriptions;
-      static string [] s_HttpRequestHeaderNames;
-      static string [] s_HttpResponseHeaderNames;
-
-      static Hashtable s_HttpResponseHeadersTable;
-      static Hashtable s_HttpRequestHeaderTable;
-
-      static HttpWorkerRequest() {
-         string[] sSubCodes;
-
-         s_HttpStatusDescriptions = new string[6][];
-
-         sSubCodes = new String[3];
-         sSubCodes[0] = "Continue";
-         sSubCodes[1] = "Switching Protocols";
-         sSubCodes[2] = "Processing";
-         s_HttpStatusDescriptions[1] = sSubCodes;
-
-         sSubCodes = new String[8];
-         sSubCodes[0] = "OK";
-         sSubCodes[1] = "Created";
-         sSubCodes[2] = "Accepted";
-         sSubCodes[3] = "Non-Authoritative Information";
-         sSubCodes[4] = "No Content";
-         sSubCodes[5] = "Reset Content";
-         sSubCodes[6] = "Partial Content";
-         sSubCodes[7] = "Multi-Status";
-         s_HttpStatusDescriptions[2] = sSubCodes;
-         
-         sSubCodes = new String[8];
-         sSubCodes[0] = "Multiple Choices";
-         sSubCodes[1] = "Moved Permanently";
-         sSubCodes[2] = "Found";
-         sSubCodes[3] = "See Other";
-         sSubCodes[4] = "Not Modified";
-         sSubCodes[5] = "Use Proxy";
-         sSubCodes[6] = "";
-         sSubCodes[7] = "Temporary Redirect";
-         s_HttpStatusDescriptions[3] = sSubCodes;
-
-         sSubCodes = new String[24];
-         sSubCodes[0] = "Bad Request";
-         sSubCodes[1] = "Unauthorized";
-         sSubCodes[2] = "Payment Required";
-         sSubCodes[3] = "Forbidden";
-         sSubCodes[4] = "Not Found";
-         sSubCodes[5] = "Method Not Allowed";
-         sSubCodes[6] = "Not Acceptable";
-         sSubCodes[7] = "Proxy Authentication Required";
-         sSubCodes[8] = "Request Timeout";
-         sSubCodes[9] = "Conflict";
-         sSubCodes[10] = "Gone";
-         sSubCodes[11] = "Length Required";
-         sSubCodes[12] = "Precondition Failed";
-         sSubCodes[13] = "Request Entity Too Large";
-         sSubCodes[14] = "Request-Uri Too Long";
-         sSubCodes[15] = "Unsupported Media Type";
-         sSubCodes[16] = "Requested Range Not Satisfiable";
-         sSubCodes[17] = "Expectation Failed";
-         sSubCodes[18] = "";
-         sSubCodes[19] = "";
-         sSubCodes[20] = "";
-         sSubCodes[21] = "Unprocessable Entity";
-         sSubCodes[22] = "Locked";
-         sSubCodes[23] = "Failed Dependency";
-         s_HttpStatusDescriptions[4] = sSubCodes;
-         
-         sSubCodes = new String[8];
-         sSubCodes[0] = "Internal Server Error";
-         sSubCodes[1] = "Not Implemented";
-         sSubCodes[2] = "Bad Gateway";
-         sSubCodes[3] = "Service Unavailable";
-         sSubCodes[4] = "Gateway Timeout";
-         sSubCodes[5] = "Http Version Not Supported";
-         sSubCodes[6] = "";
-         sSubCodes[7] = "Insufficient Storage";
-         s_HttpStatusDescriptions[5] = sSubCodes;     
- 
-         InitLookupTables();
-      }
-
-      protected HttpWorkerRequest() {
-      }
-
-      static private void InitLookupTables() {
-         // Performance arrays
-         s_HttpRequestHeaderNames = new string[40];
-         s_HttpResponseHeaderNames = new string[30];
-
-         // Lookup tables (name -> id)
-         s_HttpRequestHeaderTable = new Hashtable();
-         s_HttpResponseHeadersTable = new Hashtable();
-
-         AddHeader(true, true, 0, "Cache-Control");
-         AddHeader(true, true, 1, "Connection");
-         AddHeader(true, true, 2, "Date");
-         AddHeader(true, true, 3, "Keep-Alive");
-         AddHeader(true, true, 4, "Pragma");
-         AddHeader(true, true, 5, "Trailer");
-         AddHeader(true, true, 6, "Transfer-Encoding");
-         AddHeader(true, true, 7, "Upgrade");
-         AddHeader(true, true, 8, "Via");
-         AddHeader(true, true, 9, "Warning");
-         AddHeader(true, true, 10, "Allow");
-         AddHeader(true, true, 11, "Content-Length");
-         AddHeader(true, true, 12, "Content-Type");
-         AddHeader(true, true, 13, "Content-Encoding");
-         AddHeader(true, true, 14, "Content-Language");
-         AddHeader(true, true, 15, "Content-Location");
-         AddHeader(true, true, 16, "Content-MD5");
-         AddHeader(true, true, 17, "Content-Range");
-         AddHeader(true, true, 18, "Expires");
-         AddHeader(true, true, 19, "Last-Modified");
-         AddHeader(true, false, 20, "Accept");
-         AddHeader(true, false, 21, "Accept-Charset");
-         AddHeader(true, false, 22, "Accept-Encoding");
-         AddHeader(true, false, 23, "Accept-Language");
-         AddHeader(true, false, 24, "Authorization");
-         AddHeader(true, false, 25, "Cookie");
-         AddHeader(true, false, 26, "Expect");
-         AddHeader(true, false, 27, "From");
-         AddHeader(true, false, 28, "Host");
-         AddHeader(true, false, 29, "If-Match");
-         AddHeader(true, false, 30, "If-Modified-Since");
-         AddHeader(true, false, 31, "If-None-Match");
-         AddHeader(true, false, 32, "If-Range");
-         AddHeader(true, false, 33, "If-Unmodified-Since");
-         AddHeader(true, false, 34, "Max-Forwards");
-         AddHeader(true, false, 35, "Proxy-Authorization");
-         AddHeader(true, false, 36, "Referer");
-         AddHeader(true, false, 37, "Range");
-         AddHeader(true, false, 38, "TE");
-         AddHeader(true, false, 39, "User-Agent");
-         AddHeader(false, true, 20, "Accept-Ranges");
-         AddHeader(false, true, 21, "Age");
-         AddHeader(false, true, 22, "ETag");
-         AddHeader(false, true, 23, "Location");
-         AddHeader(false, true, 24, "Proxy-Authenticate");
-         AddHeader(false, true, 25, "Retry-After");
-         AddHeader(false, true, 26, "Server");
-         AddHeader(false, true, 27, "Set-Cookie");
-         AddHeader(false, true, 28, "Vary");
-         AddHeader(false, true, 29, "WWW-Authenticate");
-      }
-
-      static private void AddHeader(bool bRequest, bool bResponse, int iID, string sHeader) {
-         if (bResponse) {
-            s_HttpResponseHeaderNames[iID] = sHeader;
-            s_HttpResponseHeadersTable.Add(sHeader, iID);
-         }
-
-         if (bRequest) {
-            s_HttpRequestHeaderNames[iID] = sHeader;
-            s_HttpRequestHeaderTable.Add(sHeader, iID);
-         }
-      }
-
-      public virtual void CloseConnection() {}
-      public abstract void EndOfRequest();
-      public abstract void FlushResponse(bool finalFlush);
-      
-      public virtual string GetAppPath() {
-         return null;
-      }
-      
-      public virtual string GetAppPathTranslated() {
-         return null;
-      }
-      
-      public virtual string GetAppPoolID() {
-         return null;
-      }
-      
-      public virtual long GetBytesRead() {
-         return 0;
-      }
-      
-      public virtual byte[] GetClientCertificate() {
-         return new byte[0];
-      }
-      
-      public virtual byte[] GetClientCertificateBinaryIssuer() {
-         return new byte[0];
-      }
-      
-      public virtual int GetClientCertificateEncoding() {
-         return 0;
-      }
-      
-      public virtual byte[] GetClientCertificatePublicKey() {
-         return new byte[0];
-      }
-      
-      public virtual DateTime GetClientCertificateValidFrom() {
-         return DateTime.Now;
-      }
-
-      public virtual DateTime GetClientCertificateValidUntil() {
-         return DateTime.Now;
-      }
-
-      public virtual long GetConnectionID() {
-         return 0;
-      }
-      
-      public virtual string GetFilePath() {
-         return GetUriPath();
-      }
-   
-      public virtual string GetFilePathTranslated() {
-         return null;
-      }
-      
-      public abstract string GetHttpVerbName();
-      public abstract string GetHttpVersion();
-      
-      public virtual string GetKnownRequestHeader(int index) {
-         return null;
-      }
-      
-      public static int GetKnownRequestHeaderIndex(string header) {
-         object Index;
-         Index = s_HttpRequestHeaderTable[header];
-         if (null != Index) {
-            return (Int32) Index;
-         }
-
-         return -1;
-      }
-
-      public static string GetKnownRequestHeaderName(int index) {
-         return s_HttpRequestHeaderNames[index];
-      }
-
-      public static int GetKnownResponseHeaderIndex(string header) {
-         object Index;
-
-         Index = s_HttpResponseHeadersTable[header];
-         if (null != Index) {
-            return (Int32) Index;
-         }
-
-         return -1;
-      }
-
-      public static string GetKnownResponseHeaderName(int index) {
-         return s_HttpResponseHeaderNames[index];
-      }
-
-      public abstract string GetLocalAddress();
-      public abstract int GetLocalPort();
-      
-      public virtual string GetPathInfo() {
-         return "";
-      }
-      
-      public virtual byte[] GetPreloadedEntityBody() {
-         return null;
-      }
-      
-      public virtual string GetProtocol() {
-         if (IsSecure()) {
-            return "HTTPS";
-         } 
-         
-         return "HTTP";
-      }
-      
-      public abstract string GetQueryString();
-      
-      public virtual byte[] GetQueryStringRawBytes() {
-         return null;
-      }
-      
-      public abstract string GetRawUrl();
-      public abstract string GetRemoteAddress();
-      
-      public virtual string GetRemoteName() {
-         return GetRemoteAddress();
-      }
-      
-      public abstract int GetRemotePort();
-
-      public virtual int GetRequestReason() {
-         return 0;
-      }
-      
-      public virtual string GetServerName() {
-         return GetLocalAddress();  
-      }
-      
-      public virtual string GetServerVariable(string name) {
-         return null;
-      }
-
-      public static string GetStatusDescription(int code) {
-         if (code>= 100 && code < 600) {
-            int iMajor = code / 100;
-            int iMinor = code % 100;
-            if (iMinor < (int) s_HttpStatusDescriptions[iMajor].Length) {
-               return s_HttpStatusDescriptions[iMajor][iMinor];
-            }
-         }
-
-         return "";
-      }
-      
-      public virtual string GetUnknownRequestHeader(string name) {
-         return null;
-      }
-      
-      [CLSCompliant(false)]
-      public virtual string[][] GetUnknownRequestHeaders() {
-         return null;
-      }
-
-      public abstract string GetUriPath();
-
-      public virtual long GetUrlContextID() {
-         return 0;
-      }
-      
-      public virtual IntPtr GetUserToken() {
-         throw new NotSupportedException();
-      }
-      
-      public virtual IntPtr GetVirtualPathToken() {
-         throw new NotSupportedException();
-      }
-      
-      public bool HasEntityBody() {
-         string sContentLength = GetKnownRequestHeader(HeaderContentLength);
-         if (null != sContentLength && sContentLength != "0") {
-            return true;
-         }
-
-         if (null != GetKnownRequestHeader(HeaderTransferEncoding)) {
-            return true;
-         }
-         
-         if (null != GetPreloadedEntityBody() || IsEntireEntityBodyIsPreloaded()) {
-            return true;
-         }
-
-         return false;
-      }
-      
-      public virtual bool HeadersSent() {
-         return true;
-      }
-      
-      public virtual bool IsClientConnected() {
-         return true;
-      }
-      
-      public virtual bool IsEntireEntityBodyIsPreloaded() {
-         return false;
-      }
-      
-      public virtual bool IsSecure() {
-         return false;
-      }
-      
-      public virtual string MapPath(string virtualPath) {
-         return null;
-      }
-      
-      public virtual int ReadEntityBody(byte[] buffer, int size) {
-         return 0;
-      }
-      
-      public virtual void SendCalculatedContentLength(int contentLength) {
-      }
-      
-      public abstract void SendKnownResponseHeader(int index, string value);
-      public abstract void SendResponseFromFile(IntPtr handle, long offset, long length);
-      public abstract void SendResponseFromFile(string filename, long offset, long length);
-      public abstract void SendResponseFromMemory(byte[] data, int length);
-      
-      [MonoTODO("Should we support this method? We could just use the stringresource to build a string and then send it via SendResponseFromMemory?")]
-      public virtual void SendResponseFromMemory(IntPtr data, int length) {
-         throw new NotSupportedException();
-      }
-      
-      public abstract void SendStatus(int statusCode, string statusDescription);
-      public abstract void SendUnknownResponseHeader(string name, string value);
-      
-      public virtual void SetEndOfSendNotification(HttpWorkerRequest.EndOfSendNotification callback, object extraData) {
-      }
-
-      public virtual string MachineConfigPath {
-         get {
-            return null;
-         }
-      }
-      
-      public virtual string MachineInstallDirectory {
-         get {
-            return null;
-         }
-      }
-   }
-}
-
+// 
+// System.Web.HttpResponseStreamProxy
+//
+// Authors:
+// 	Patrik Torstensson ([email protected])
+//   	(constants from Bob Smith ([email protected]))
+//   	Gonzalo Paniagua Javier ([email protected])
+//
+// (c) Patrik Torstensson
+// (c) 2002 Ximian, Inc. (http://www.ximian.com)
+//
+using System;
+using System.Collections;
+using System.Runtime.InteropServices;
+
+namespace System.Web
+{
+	public abstract class HttpWorkerRequest : IHttpMapPath
+	{
+		public delegate void EndOfSendNotification (HttpWorkerRequest wr, object extraData);
+
+		public const int HeaderAccept = 20;
+		public const int HeaderAcceptCharset = 21;
+		public const int HeaderAcceptEncoding = 22;
+		public const int HeaderAcceptLanguage = 23;
+		public const int HeaderAcceptRanges = 20;
+		public const int HeaderAge = 21;
+		public const int HeaderAllow = 10;
+		public const int HeaderAuthorization = 24;
+		public const int HeaderCacheControl = 0;
+		public const int HeaderConnection = 1;
+		public const int HeaderContentEncoding = 13;
+		public const int HeaderContentLanguage = 14;
+		public const int HeaderContentLength = 11;
+		public const int HeaderContentLocation = 15;
+		public const int HeaderContentMd5 = 16;
+		public const int HeaderContentRange = 17;
+		public const int HeaderContentType = 12;
+		public const int HeaderCookie = 25;
+		public const int HeaderDate = 2;
+		public const int HeaderEtag = 22;
+		public const int HeaderExpect = 26;
+		public const int HeaderExpires = 18;
+		public const int HeaderFrom = 27;
+		public const int HeaderHost = 28;
+		public const int HeaderIfMatch = 29;
+		public const int HeaderIfModifiedSince = 30;
+		public const int HeaderIfNoneMatch = 31;
+		public const int HeaderIfRange = 32;
+		public const int HeaderIfUnmodifiedSince = 33;
+		public const int HeaderKeepAlive = 3;
+		public const int HeaderLastModified = 19;
+		public const int HeaderLocation = 23;
+		public const int HeaderMaxForwards = 34;
+		public const int HeaderPragma = 4;
+		public const int HeaderProxyAuthenticate = 24;
+		public const int HeaderProxyAuthorization = 35;
+		public const int HeaderRange = 37;
+		public const int HeaderReferer = 36;
+		public const int HeaderRetryAfter = 25;
+		public const int HeaderServer = 26;
+		public const int HeaderSetCookie = 27;
+		public const int HeaderTe = 38;
+		public const int HeaderTrailer = 5;
+		public const int HeaderTransferEncoding = 6;
+		public const int HeaderUpgrade = 7;
+		public const int HeaderUserAgent = 39;
+		public const int HeaderVary = 28;
+		public const int HeaderVia = 8;
+		public const int HeaderWarning = 9;
+		public const int HeaderWwwAuthenticate = 29;
+		public const int ReasonCachePolicy = 2;
+		public const int ReasonCacheSecurity = 3;
+		public const int ReasonClientDisconnect = 4;
+		public const int ReasonDefault = 0;
+		public const int ReasonFileHandleCacheMiss = 1;
+		public const int ReasonResponseCacheMiss = 0;
+		public const int RequestHeaderMaximum = 40;
+		public const int ResponseHeaderMaximum = 30;
+
+		static string [][] s_HttpStatusDescriptions;
+		static string [] s_HttpRequestHeaderNames;
+		static string [] s_HttpResponseHeaderNames;
+
+		static Hashtable s_HttpResponseHeadersTable;
+		static Hashtable s_HttpRequestHeaderTable;
+
+		static HttpWorkerRequest ()
+		{
+			string [] sSubCodes;
+
+			s_HttpStatusDescriptions = new string [6][];
+
+			sSubCodes = new String [3];
+			sSubCodes [0] = "Continue";
+			sSubCodes [1] = "Switching Protocols";
+			sSubCodes [2] = "Processing";
+			s_HttpStatusDescriptions [1] = sSubCodes;
+
+			sSubCodes = new String [8];
+			sSubCodes [0] = "OK";
+			sSubCodes [1] = "Created";
+			sSubCodes [2] = "Accepted";
+			sSubCodes [3] = "Non-Authoritative Information";
+			sSubCodes [4] = "No Content";
+			sSubCodes [5] = "Reset Content";
+			sSubCodes [6] = "Partial Content";
+			sSubCodes [7] = "Multi-Status";
+			s_HttpStatusDescriptions [2] = sSubCodes;
+
+			sSubCodes = new String [8];
+			sSubCodes [0] = "Multiple Choices";
+			sSubCodes [1] = "Moved Permanently";
+			sSubCodes [2] = "Found";
+			sSubCodes [3] = "See Other";
+			sSubCodes [4] = "Not Modified";
+			sSubCodes [5] = "Use Proxy";
+			sSubCodes [6] = String.Empty;
+			sSubCodes [7] = "Temporary Redirect";
+			s_HttpStatusDescriptions [3] = sSubCodes;
+
+			sSubCodes = new String [24];
+			sSubCodes [0] = "Bad Request";
+			sSubCodes [1] = "Unauthorized";
+			sSubCodes [2] = "Payment Required";
+			sSubCodes [3] = "Forbidden";
+			sSubCodes [4] = "Not Found";
+			sSubCodes [5] = "Method Not Allowed";
+			sSubCodes [6] = "Not Acceptable";
+			sSubCodes [7] = "Proxy Authentication Required";
+			sSubCodes [8] = "Request Timeout";
+			sSubCodes [9] = "Conflict";
+			sSubCodes [10] = "Gone";
+			sSubCodes [11] = "Length Required";
+			sSubCodes [12] = "Precondition Failed";
+			sSubCodes [13] = "Request Entity Too Large";
+			sSubCodes [14] = "Request-Uri Too Long";
+			sSubCodes [15] = "Unsupported Media Type";
+			sSubCodes [16] = "Requested Range Not Satisfiable";
+			sSubCodes [17] = "Expectation Failed";
+			sSubCodes [18] = String.Empty;
+			sSubCodes [19] = String.Empty;
+			sSubCodes [20] = String.Empty;
+			sSubCodes [21] = "Unprocessable Entity";
+			sSubCodes [22] = "Locked";
+			sSubCodes [23] = "Failed Dependency";
+			s_HttpStatusDescriptions [4] = sSubCodes;
+
+			sSubCodes = new String [8];
+			sSubCodes [0] = "Internal Server Error";
+			sSubCodes [1] = "Not Implemented";
+			sSubCodes [2] = "Bad Gateway";
+			sSubCodes [3] = "Service Unavailable";
+			sSubCodes [4] = "Gateway Timeout";
+			sSubCodes [5] = "Http Version Not Supported";
+			sSubCodes [6] = String.Empty;
+			sSubCodes [7] = "Insufficient Storage";
+			s_HttpStatusDescriptions [5] = sSubCodes;     
+
+			InitLookupTables ();
+		}
+
+		protected HttpWorkerRequest ()
+		{
+		}
+
+		static private void InitLookupTables ()
+		{
+			// Performance arrays
+			s_HttpRequestHeaderNames = new string [40];
+			s_HttpResponseHeaderNames = new string [30];
+
+			// Lookup tables (name -> id)
+			s_HttpRequestHeaderTable = new Hashtable ();
+			s_HttpResponseHeadersTable = new Hashtable ();
+
+			AddHeader (true, true, 0, "Cache-Control");
+			AddHeader (true, true, 1, "Connection");
+			AddHeader (true, true, 2, "Date");
+			AddHeader (true, true, 3, "Keep-Alive");
+			AddHeader (true, true, 4, "Pragma");
+			AddHeader (true, true, 5, "Trailer");
+			AddHeader (true, true, 6, "Transfer-Encoding");
+			AddHeader (true, true, 7, "Upgrade");
+			AddHeader (true, true, 8, "Via");
+			AddHeader (true, true, 9, "Warning");
+			AddHeader (true, true, 10, "Allow");
+			AddHeader (true, true, 11, "Content-Length");
+			AddHeader (true, true, 12, "Content-Type");
+			AddHeader (true, true, 13, "Content-Encoding");
+			AddHeader (true, true, 14, "Content-Language");
+			AddHeader (true, true, 15, "Content-Location");
+			AddHeader (true, true, 16, "Content-MD5");
+			AddHeader (true, true, 17, "Content-Range");
+			AddHeader (true, true, 18, "Expires");
+			AddHeader (true, true, 19, "Last-Modified");
+			AddHeader (true, false, 20, "Accept");
+			AddHeader (true, false, 21, "Accept-Charset");
+			AddHeader (true, false, 22, "Accept-Encoding");
+			AddHeader (true, false, 23, "Accept-Language");
+			AddHeader (true, false, 24, "Authorization");
+			AddHeader (true, false, 25, "Cookie");
+			AddHeader (true, false, 26, "Expect");
+			AddHeader (true, false, 27, "From");
+			AddHeader (true, false, 28, "Host");
+			AddHeader (true, false, 29, "If-Match");
+			AddHeader (true, false, 30, "If-Modified-Since");
+			AddHeader (true, false, 31, "If-None-Match");
+			AddHeader (true, false, 32, "If-Range");
+			AddHeader (true, false, 33, "If-Unmodified-Since");
+			AddHeader (true, false, 34, "Max-Forwards");
+			AddHeader (true, false, 35, "Proxy-Authorization");
+			AddHeader (true, false, 36, "Referer");
+			AddHeader (true, false, 37, "Range");
+			AddHeader (true, false, 38, "TE");
+			AddHeader (true, false, 39, "User-Agent");
+			AddHeader (false, true, 20, "Accept-Ranges");
+			AddHeader (false, true, 21, "Age");
+			AddHeader (false, true, 22, "ETag");
+			AddHeader (false, true, 23, "Location");
+			AddHeader (false, true, 24, "Proxy-Authenticate");
+			AddHeader (false, true, 25, "Retry-After");
+			AddHeader (false, true, 26, "Server");
+			AddHeader (false, true, 27, "Set-Cookie");
+			AddHeader (false, true, 28, "Vary");
+			AddHeader (false, true, 29, "WWW-Authenticate");
+		}
+
+		static private void AddHeader(bool bRequest, bool bResponse, int iID, string sHeader)
+		{
+			if (bResponse) {
+				s_HttpResponseHeaderNames [iID] = sHeader;
+				s_HttpResponseHeadersTable.Add (sHeader, iID);
+			}
+
+			if (bRequest) {
+				s_HttpRequestHeaderNames [iID] = sHeader;
+				s_HttpRequestHeaderTable.Add (sHeader, iID);
+			}
+		}
+
+		public virtual void CloseConnection ()
+		{
+		}
+		
+		public abstract void EndOfRequest ();
+		public abstract void FlushResponse (bool finalFlush);
+
+		public virtual string GetAppPath ()
+		{
+			return null;
+		}
+
+		public virtual string GetAppPathTranslated ()
+		{
+			return null;
+		}
+
+		public virtual string GetAppPoolID ()
+		{
+			return null;
+		}
+
+		public virtual long GetBytesRead ()
+		{
+			return 0;
+		}
+
+		public virtual byte[] GetClientCertificate ()
+		{
+			return new byte[0];
+		}
+
+		public virtual byte[] GetClientCertificateBinaryIssuer ()
+		{
+			return new byte[0];
+		}
+
+		public virtual int GetClientCertificateEncoding ()
+		{
+			return 0;
+		}
+
+		public virtual byte[] GetClientCertificatePublicKey ()
+		{
+			return new byte[0];
+		}
+
+		public virtual DateTime GetClientCertificateValidFrom ()
+		{
+			return DateTime.Now;
+		}
+
+		public virtual DateTime GetClientCertificateValidUntil ()
+		{
+			return DateTime.Now;
+		}
+
+		public virtual long GetConnectionID ()
+		{
+			return 0;
+		}
+
+		public virtual string GetFilePath ()
+		{
+			return GetUriPath();
+		}
+
+		public virtual string GetFilePathTranslated ()
+		{
+			return null;
+		}
+
+		public abstract string GetHttpVerbName ();
+		public abstract string GetHttpVersion ();
+
+		public virtual string GetKnownRequestHeader (int index)
+		{
+			return null;
+		}
+
+		public static int GetKnownRequestHeaderIndex (string header)
+		{
+			object index;
+			index = s_HttpRequestHeaderTable [header];
+			if (null != index)
+				return (Int32) index;
+
+			return -1;
+		}
+
+		public static string GetKnownRequestHeaderName (int index)
+		{
+			return s_HttpRequestHeaderNames [index];
+		}
+
+		public static int GetKnownResponseHeaderIndex (string header)
+		{
+			object index;
+
+			index = s_HttpResponseHeadersTable [header];
+			if (null != index)
+				return (Int32) index;
+
+			return -1;
+		}
+
+		public static string GetKnownResponseHeaderName(int index)
+		{
+			return s_HttpResponseHeaderNames [index];
+		}
+
+		public abstract string GetLocalAddress ();
+		public abstract int GetLocalPort ();
+
+		public virtual string GetPathInfo ()
+		{
+			return String.Empty;
+		}
+
+		public virtual byte [] GetPreloadedEntityBody ()
+		{
+			return null;
+		}
+
+		public virtual string GetProtocol ()
+		{
+			return (IsSecure ()) ? "https" : "http";
+		}
+
+		public abstract string GetQueryString ();
+
+		public virtual byte[] GetQueryStringRawBytes ()
+		{
+			return null;
+		}
+
+		public abstract string GetRawUrl ();
+		public abstract string GetRemoteAddress ();
+
+		public virtual string GetRemoteName ()
+		{
+			return GetRemoteAddress();
+		}
+
+		public abstract int GetRemotePort ();
+
+		public virtual int GetRequestReason ()
+		{
+			return 0;
+		}
+
+		public virtual string GetServerName ()
+		{
+			return GetLocalAddress();  
+		}
+
+		public virtual string GetServerVariable (string name)
+		{
+			return null;
+		}
+
+		public static string GetStatusDescription (int code)
+		{
+			if (code>= 100 && code < 600) {
+				int iMajor = code / 100;
+				int iMinor = code % 100;
+				if (iMinor < (int) s_HttpStatusDescriptions [iMajor].Length)
+					return s_HttpStatusDescriptions [iMajor][iMinor];
+			}
+
+			return String.Empty;
+		}
+
+		public virtual string GetUnknownRequestHeader (string name)
+		{
+			return null;
+		}
+
+		[CLSCompliant(false)]
+		public virtual string [][] GetUnknownRequestHeaders ()
+		{
+			return null;
+		}
+
+		public abstract string GetUriPath ();
+
+		public virtual long GetUrlContextID ()
+		{
+			return 0;
+		}
+
+		public virtual IntPtr GetUserToken ()
+		{
+			throw new NotSupportedException ();
+		}
+
+		public virtual IntPtr GetVirtualPathToken ()
+		{
+			throw new NotSupportedException ();
+		}
+
+		public bool HasEntityBody ()
+		{
+			string sContentLength = GetKnownRequestHeader (HeaderContentLength);
+			if (null != sContentLength && sContentLength != "0")
+				return true;
+
+			if (null != GetKnownRequestHeader (HeaderTransferEncoding))
+				return true;
+
+			if (null != GetPreloadedEntityBody () || IsEntireEntityBodyIsPreloaded ())
+				return true;
+
+			return false;
+		}
+
+		public virtual bool HeadersSent ()
+		{
+			return true;
+		}
+
+		public virtual bool IsClientConnected ()
+		{
+			return true;
+		}
+
+		public virtual bool IsEntireEntityBodyIsPreloaded ()
+		{
+			return false;
+		}
+
+		public virtual bool IsSecure () 
+		{
+			return false;
+		}
+
+		public virtual string MapPath (string virtualPath)
+		{
+			return null;
+		}
+
+		public virtual int ReadEntityBody (byte[] buffer, int size)
+		{
+			return 0;
+		}
+
+		public virtual void SendCalculatedContentLength (int contentLength)
+		{
+		}
+
+		public abstract void SendKnownResponseHeader (int index, string value);
+		public abstract void SendResponseFromFile (IntPtr handle, long offset, long length);
+		public abstract void SendResponseFromFile (string filename, long offset, long length);
+		public abstract void SendResponseFromMemory (byte [] data, int length);
+
+		public virtual void SendResponseFromMemory (IntPtr data, int length)
+		{
+			if (length <= 0)
+				return;
+
+			byte [] dataBytes = new byte [length];
+			Marshal.Copy (data, dataBytes, 0, length);
+			SendResponseFromMemory (dataBytes, length);
+		}
+
+		public abstract void SendStatus (int statusCode, string statusDescription);
+		public abstract void SendUnknownResponseHeader (string name, string value);
+
+		public virtual void SetEndOfSendNotification (EndOfSendNotification callback, object extraData)
+		{
+		}
+
+		public virtual string MachineConfigPath
+		{
+			get {
+				return null;
+			}
+		}
+
+		public virtual string MachineInstallDirectory
+		{
+			get {
+				return null;
+			}
+		}
+	}
+}
+

+ 19 - 0
mcs/class/System.Web/System.Web/IHttpMapPath.cs

@@ -0,0 +1,19 @@
+//
+// System.Web.IHttpMapPath
+//
+// Authors:
+//	Gonzalo Paniagua Javier ([email protected])
+//
+// (C) 2002 Ximian, Inc (http://www.ximian.com)
+//
+
+namespace System.Web
+{
+	interface IHttpMapPath
+	{
+		string MapPath (string path);
+		string MachineConfigPath { get; }
+	}
+
+}
+