Browse Source

2009-03-03 Marek Habersack <[email protected]>

	* CachedRawResponse.cs: headers are stored in NameValueCollection
	now.

2009-03-03  Marek Habersack  <[email protected]>

	* HttpResponse.cs: fully implemented the Headers property.
	It is also used in the 1.1 profile, but is internal.

	* HttpCookie.cs: GetCookieHeader renamed to GetCookieHeaderValue -
	now returns a string with the header value.

	* HttpCacheVaryByParams.cs: GetResponseHeader renamed to
	GetResponseHeaderValue - now returns a string with the header
	value.

	* HttpCachePolicy.cs: SetHeaders now takes a NameValueCollection
	instead of an ArrayList

svn path=/trunk/mcs/; revision=128494
Marek Habersack 17 years ago
parent
commit
12d560e4e0

+ 4 - 3
mcs/class/System.Web/System.Web.Caching/CachedRawResponse.cs

@@ -32,6 +32,7 @@
 using System;
 using System.Text;
 using System.Collections;
+using System.Collections.Specialized;
 
 namespace System.Web.Caching {
 
@@ -42,7 +43,7 @@ namespace System.Web.Caching {
 		int status_code;
 		string status_desc;
 		int content_length;
-		ArrayList headers;
+		NameValueCollection headers;
 		byte[] buffer;
 		
 		internal CachedRawResponse (HttpCachePolicy policy)
@@ -76,11 +77,11 @@ namespace System.Web.Caching {
 			set { content_length = value; }
 		}
 		
-		internal ArrayList Headers {
+		internal NameValueCollection Headers {
 			get { return headers; }
 		}
 
-		internal void SetHeaders (ArrayList headers) {
+		internal void SetHeaders (NameValueCollection headers) {
 			this.headers = headers;
 		}
 

+ 5 - 0
mcs/class/System.Web/System.Web.Caching/ChangeLog

@@ -1,3 +1,8 @@
+2009-03-03  Marek Habersack  <[email protected]>
+
+	* CachedRawResponse.cs: headers are stored in NameValueCollection
+	now.
+
 2009-01-09  Marek Habersack  <[email protected]>
 
 	* Cache.cs: System.Threading.Timer.Change takes a long, not an

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

@@ -1,5 +1,18 @@
 2009-03-03  Marek Habersack  <[email protected]>
 
+	* HttpResponse.cs: fully implemented the Headers property.
+	It is also used in the 1.1 profile, but is internal.
+
+	* HttpCookie.cs: GetCookieHeader renamed to GetCookieHeaderValue -
+	now returns a string with the header value.
+
+	* HttpCacheVaryByParams.cs: GetResponseHeader renamed to
+	GetResponseHeaderValue - now returns a string with the header
+	value.
+
+	* HttpCachePolicy.cs: SetHeaders now takes a NameValueCollection
+	instead of an ArrayList
+
 	* HttpRequest.cs: avoid calculating the same value twice in
 	MakeInputStream
 

+ 10 - 10
mcs/class/System.Web/System.Web/HttpCachePolicy.cs

@@ -28,6 +28,7 @@
 //
 
 using System.Collections;
+using System.Collections.Specialized;
 using System.ComponentModel;
 using System.Globalization;
 using System.IO;
@@ -315,7 +316,7 @@ namespace System.Web
 				allow_response_in_browser_history = allow;
 		}
 
-		internal void SetHeaders (HttpResponse response, ArrayList headers)
+		internal void SetHeaders (HttpResponse response, NameValueCollection headers)
 		{
 			bool noCache = false;
 			string cc = null;
@@ -341,8 +342,8 @@ namespace System.Web
 			if (noCache) {
 				response.CacheControl = cc;
 				if (!allow_response_in_browser_history) {
-					headers.Add (new UnknownResponseHeader ("Expires", "-1"));
-					headers.Add (new UnknownResponseHeader ("Pragma", "no-cache"));
+					headers.Add ("Expires", "-1");
+					headers.Add ("Pragma", "no-cache");
 				}
 			} else {
 				if (MaxAge.TotalSeconds != 0)
@@ -350,7 +351,7 @@ namespace System.Web
 
 				if (have_expire_date) {
 					string expires = TimeUtil.ToUtcTimeString (expire_date);
-					headers.Add (new UnknownResponseHeader ("Expires", expires));
+					headers.Add ("Expires", expires);
 				}
 			}
 
@@ -359,22 +360,21 @@ namespace System.Web
 			if (set_no_transform)
 				cc = String.Concat (cc, ", no-transform");
 
-			headers.Add (new UnknownResponseHeader ("Cache-Control", cc));
+			headers.Add ("Cache-Control", cc);
 
 			if (last_modified_from_file_dependencies || etag_from_file_dependencies)
 				HeadersFromFileDependencies (response);
 
 			if (etag != null)
-				headers.Add (new UnknownResponseHeader ("ETag", etag));
+				headers.Add ("ETag", etag);
 
 			if (have_last_modified)
-				headers.Add (new UnknownResponseHeader ("Last-Modified",
-							     TimeUtil.ToUtcTimeString (last_modified)));
+				headers.Add ("Last-Modified", TimeUtil.ToUtcTimeString (last_modified));
 
 			if (!vary_by_params.IgnoreParams) {
-				BaseResponseHeader vb = vary_by_params.GetResponseHeader ();
+				string vb = vary_by_params.GetResponseHeaderValue ();
 				if (vb != null)
-					headers.Add (vb);
+					headers.Add ("Vary", vb);
 			}
 		}
 

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

@@ -63,9 +63,9 @@ namespace System.Web {
 			return names;
 		}
 
-		internal BaseResponseHeader GetResponseHeader ()
+		internal string GetResponseHeaderValue ()
 		{
-			StringBuilder builder = new StringBuilder ("");
+			StringBuilder builder = new StringBuilder ();
 
 			foreach (string parm in parms.Keys) {
 				builder.Append (parm);
@@ -75,7 +75,7 @@ namespace System.Web {
 			if (builder.Length == 0)
 				return null;
 
-			return new UnknownResponseHeader ("Vary", builder.ToString());
+			return builder.ToString();
 		}
 
 		public bool IgnoreParams {

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

@@ -78,9 +78,9 @@ namespace System.Web {
 			Value = value;
 		}
 
-		internal BaseResponseHeader GetCookieHeader ()
+		internal string GetCookieHeaderValue ()
 		{
-			StringBuilder builder = new StringBuilder ("");
+			StringBuilder builder = new StringBuilder ();
 
 			builder.Append (name);
 			builder.Append ("=");
@@ -109,7 +109,7 @@ namespace System.Web {
 				builder.Append ("; HttpOnly");
 			}
 
-			return new UnknownResponseHeader ("Set-Cookie", builder.ToString());
+			return builder.ToString ();
 		}
 
 		public string Domain {

+ 53 - 35
mcs/class/System.Web/System.Web/HttpResponse.cs

@@ -69,7 +69,7 @@ namespace System.Web {
 		string user_cache_control = "private";
 		string redirect_location;
 		
-		static UnknownResponseHeader version_header;
+		static string version_header;
 		
 		//
 		// Negative Content-Length means we auto-compute the size of content-length
@@ -81,9 +81,10 @@ namespace System.Web {
 		// The list of the headers that we will send back to the client, except
 		// the headers that we compute here.
 		//
-		ArrayList headers = new ArrayList ();
+
+		NameValueCollection headers;
 		bool headers_sent;
-		ArrayList cached_headers;
+		NameValueCollection cached_headers;
 
 		//
 		// Transfer encoding state
@@ -111,10 +112,8 @@ namespace System.Web {
 #else
 			HttpRuntimeConfig config = HttpContext.GetAppConfig ("system.web/httpRuntime") as HttpRuntimeConfig;
 #endif
-			if (config != null && config.EnableVersionHeader) {
-				string version = Environment.Version.ToString (3);
-				version_header = new UnknownResponseHeader ("X-AspNet-Version", version);
-			}
+			if (config != null && config.EnableVersionHeader)
+				version_header = Environment.Version.ToString (3);
 		}
 		
 		internal HttpResponse ()
@@ -309,14 +308,20 @@ namespace System.Web {
 			}
 		}
 
-		[MonoTODO ("Not implemented")]
-		public NameValueCollection Headers {
+		public
+#else
+		internal
+#endif
+		NameValueCollection Headers {
 			get {
-				// TODO: currently only return empty NameValueColletion
-				return new NameValueCollection ();
+				if (headers == null)
+					headers = new NameValueCollection ();
+
+				return headers;
 			}
 		}
-#endif
+
+		
 		public bool IsClientConnected {
 			get {
 				if (WorkerRequest == null)
@@ -514,7 +519,7 @@ namespace System.Web {
 				return;
 			}
 
-			headers.Add (new UnknownResponseHeader (name, value));
+			headers.Add (name, value);
 		}
 
 		[AspNetHostingPermission (SecurityAction.Demand, Level = AspNetHostingPermissionLevel.Medium)]
@@ -529,7 +534,7 @@ namespace System.Web {
 			if (virtualPath == null)
 				return null;
 		
-			if (virtualPath == "")
+			if (virtualPath.Length == 0)
 				return context.Request.RootVirtualDir;
 
 			if (UrlUtils.IsRelativeUrl (virtualPath)) {
@@ -589,7 +594,8 @@ namespace System.Web {
 			content_type = "text/html";
 			transfer_encoding = null;
 			user_cache_control = null;
-			headers.Clear ();
+			if (headers != null)
+				headers.Clear ();
 		}
 
 		internal bool HeadersSent {
@@ -636,30 +642,30 @@ namespace System.Web {
 		//   Transfer-Encoding (chunked)
 		//   Cache-Control
 		//   X-AspNet-Version
-		void AddHeadersNoCache (ArrayList write_headers, bool final_flush)
+		void AddHeadersNoCache (NameValueCollection write_headers, bool final_flush)
 		{
 #if !TARGET_J2EE
 			//
 			// Transfer-Encoding
 			//
 			if (use_chunked)
-				write_headers.Add (new UnknownResponseHeader ("Transfer-Encoding", "chunked"));
+				write_headers.Add ("Transfer-Encoding", "chunked");
 			else if (transfer_encoding != null)
-				write_headers.Add (new UnknownResponseHeader ("Transfer-Encoding", transfer_encoding));
+				write_headers.Add ("Transfer-Encoding", transfer_encoding);
 #endif
 			if (redirect_location != null)
-				write_headers.Add (new UnknownResponseHeader ("Location", redirect_location));
+				write_headers.Add ("Location", redirect_location);
 			
 #if !TARGET_J2EE
 			if (version_header != null)
-				write_headers.Add (version_header);
+				write_headers.Add ("X-AspNet-Version", version_header);
 
 			//
 			// If Content-Length is set.
 			//
 			if (content_length >= 0) {
-				write_headers.Add (new KnownResponseHeader (HttpWorkerRequest.HeaderContentLength,
-								      content_length.ToString (CultureInfo.InvariantCulture)));
+				write_headers.Add (HttpWorkerRequest.GetKnownResponseHeaderName (HttpWorkerRequest.HeaderContentLength),
+						   content_length.ToString (CultureInfo.InvariantCulture));
 			} else if (BufferOutput) {
 				if (final_flush) {					
 					//
@@ -667,15 +673,15 @@ namespace System.Web {
 					// we know the content-length.
 					//
 					content_length = output_stream.total;
-					write_headers.Add (new KnownResponseHeader (HttpWorkerRequest.HeaderContentLength,
-									      content_length.ToString (CultureInfo.InvariantCulture)));
+					write_headers.Add (HttpWorkerRequest.GetKnownResponseHeaderName (HttpWorkerRequest.HeaderContentLength),
+							   content_length.ToString (CultureInfo.InvariantCulture));
 				} else {
 					//
 					// We are buffering, and this is a flush in the middle.
 					// If we are not chunked, we need to set "Connection: close".
 					//
 					if (use_chunked){
-						write_headers.Add (new KnownResponseHeader (HttpWorkerRequest.HeaderConnection, "close"));
+						write_headers.Add (HttpWorkerRequest.GetKnownResponseHeaderName (HttpWorkerRequest.HeaderConnection), "close");
 					}
 				}
 			} else {
@@ -684,7 +690,7 @@ namespace System.Web {
 				// close at the end.
 				//
 				if (use_chunked){
-					write_headers.Add (new KnownResponseHeader (HttpWorkerRequest.HeaderConnection, "close"));
+					write_headers.Add (HttpWorkerRequest.GetKnownResponseHeaderName (HttpWorkerRequest.HeaderConnection), "close");
 				}
 			}
 #endif
@@ -695,7 +701,7 @@ namespace System.Web {
 			if (cache_policy != null)
 				cache_policy.SetHeaders (this, headers);
 			else
-				write_headers.Add (new UnknownResponseHeader ("Cache-Control", CacheControl));
+				write_headers.Add ("Cache-Control", CacheControl);
 			
 			//
 			// Content-Type
@@ -711,13 +717,13 @@ namespace System.Web {
 					}
 				}
 				
-				write_headers.Add (new UnknownResponseHeader ("Content-Type", header));
+				write_headers.Add ("Content-Type", header);
 			}
 
 			if (cookies != null && cookies.Count != 0){
 				int n = cookies.Count;
 				for (int i = 0; i < n; i++)
-					write_headers.Add (cookies.Get (i).GetCookieHeader ());
+					write_headers.Add ("Set-Cookie", cookies.Get (i).GetCookieHeaderValue ());
 #if TARGET_J2EE
 				// For J2EE Portal support emulate cookies by storing them in the session.
 				context.Request.SetSessionCookiesForPortal (cookies);
@@ -746,18 +752,29 @@ namespace System.Web {
 
 			// If this page is cached use the cached headers
 			// instead of the standard headers	
-			ArrayList write_headers = headers;
+			NameValueCollection write_headers;
 			if (cached_headers != null)
 				write_headers = cached_headers;
-			else
+			else {
+				write_headers = Headers;
 				AddHeadersNoCache (write_headers, final_flush);
-
+			}
+			
 			if (WorkerRequest != null)
 				WorkerRequest.SendStatus (status_code, StatusDescription);
 
 			if (WorkerRequest != null) {
-				foreach (BaseResponseHeader header in write_headers){
-					header.SendContent (WorkerRequest);
+				string header_name;
+				string[] values;
+				
+				for (int i = 0; i < write_headers.Count; i++) {
+					header_name = write_headers.GetKey (i);
+					values = write_headers.GetValues (i);
+					if (values == null)
+						continue;
+					
+					foreach (string val in values)
+						WorkerRequest.SendUnknownResponseHeader (header_name, val);
 				}
 			}
 		}
@@ -1049,9 +1066,10 @@ namespace System.Web {
 #endregion
 		
 #region Cache Support
-		internal void SetCachedHeaders (ArrayList headers)
+		internal void SetCachedHeaders (NameValueCollection headers)
 		{
 			cached_headers = headers;
+			
 		}
 
 		internal bool IsCached {