CachedRawResponse cached_response;
string user_cache_control = "private";
string redirect_location;
-
- static UnknownResponseHeader version_header;
+ string version_header;
+ bool version_header_checked;
//
// Negative Content-Length means we auto-compute the size of content-length
// 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
Encoding headerEncoding;
#endif
- static HttpResponse ()
- {
-#if NET_2_0
- HttpRuntimeSection config = WebConfigurationManager.GetWebApplicationSection ("system.web/httpRuntime") as HttpRuntimeSection;
-#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);
- }
- }
-
internal HttpResponse ()
{
output_stream = new HttpResponseStream (this);
return prev;
}
+ internal string VersionHeader {
+ get {
+ if (!version_header_checked && version_header == null) {
+ version_header_checked = true;
+#if NET_2_0
+ HttpRuntimeSection config = WebConfigurationManager.GetWebApplicationSection ("system.web/httpRuntime") as HttpRuntimeSection;
+#else
+ HttpRuntimeConfig config = HttpContext.GetAppConfig ("system.web/httpRuntime") as HttpRuntimeConfig;
+#endif
+ if (config != null && config.EnableVersionHeader)
+ version_header = Environment.Version.ToString (3);
+ }
+
+ return version_header;
+ }
+ }
+
internal string[] FileDependencies {
get {
if (fileDependencies == null || fileDependencies.Count == 0)
headerEncoding = value;
}
}
+
+ public
+#else
+ internal
#endif
+ NameValueCollection Headers {
+ get {
+ if (headers == null)
+ headers = new NameValueCollection ();
+
+ return headers;
+ }
+ }
+
+
public bool IsClientConnected {
get {
if (WorkerRequest == null)
}
}
+#if NET_2_0
+ // We ignore the two properties on Mono as they are for use with IIS7, but there is
+ // no point in throwing PlatformNotSupportedException. We might find a use for them
+ // some day.
+ public int SubStatusCode {
+ get;
+ set;
+ }
+
+ public bool TrySkipIisCustomErrors {
+ get;
+ set;
+ }
+#endif
+
public int StatusCode {
get {
return status_code;
return;
}
- headers.Add (new UnknownResponseHeader (name, value));
+ Headers.Add (name, value);
}
[AspNetHostingPermission (SecurityAction.Demand, Level = AspNetHostingPermissionLevel.Medium)]
if (virtualPath == null)
return null;
- if (virtualPath == "")
+ if (virtualPath.Length == 0)
return context.Request.RootVirtualDir;
if (UrlUtils.IsRelativeUrl (virtualPath)) {
content_length = -1;
content_type = "text/html";
transfer_encoding = null;
- user_cache_control = null;
- headers.Clear ();
+ user_cache_control = "private";
+ if (cache_policy != null)
+ cache_policy.Cacheability = HttpCacheability.Private;
+
+ if (headers != null)
+ headers.Clear ();
}
internal bool HeadersSent {
// 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);
+ string vh = VersionHeader;
+ if (vh != null)
+ write_headers.Add ("X-AspNet-Version", vh);
//
// 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) {
//
// 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 {
// close at the end.
//
if (use_chunked){
- write_headers.Add (new KnownResponseHeader (HttpWorkerRequest.HeaderConnection, "close"));
+ write_headers.Add (HttpWorkerRequest.GetKnownResponseHeaderName (HttpWorkerRequest.HeaderConnection), "close");
}
}
#endif
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
}
}
- 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);
// 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;
+ int header_index;
+
+ for (int i = 0; i < write_headers.Count; i++) {
+ header_name = write_headers.GetKey (i);
+ header_index = HttpWorkerRequest.GetKnownResponseHeaderIndex (header_name);
+ values = write_headers.GetValues (i);
+ if (values == null)
+ continue;
+
+ foreach (string val in values) {
+ if (header_index > -1)
+ WorkerRequest.SendKnownResponseHeader (header_index, val);
+ else
+ WorkerRequest.SendUnknownResponseHeader (header_name, val);
+ }
}
}
}
#endregion
#region Cache Support
- internal void SetCachedHeaders (ArrayList headers)
+ internal void SetCachedHeaders (NameValueCollection headers)
{
cached_headers = headers;
+
}
internal bool IsCached {