string charset;
bool charset_set;
CachedRawResponse cached_response;
- string cache_control = "private";
+ string user_cache_control = "private";
string redirect_location;
//
public Stream Filter {
get {
+ if (WorkerRequest == null)
+ return null;
+
return output_stream.Filter;
}
throw new HttpException ("headers have been already sent");
if (String.Compare (name, "content-length", true, CultureInfo.InvariantCulture) == 0){
- content_length = Int64.Parse (value);
+ content_length = (long) UInt64.Parse (value);
use_chunked = false;
return;
}
}
if (String.Compare (name, "cache-control", true, CultureInfo.InvariantCulture) == 0){
- cache_control = value;
+ user_cache_control = value;
return;
}
content_length = -1;
content_type = "text/html";
transfer_encoding = null;
- cache_control = "private";
+ user_cache_control = null;
headers.Clear ();
}
Thread.CurrentThread.Abort (FlagEnd);
} else {
// If this is called from an async event, signal the completion
- // but don't thow.
+ // but don't throw.
context.ApplicationInstance.CompleteRequest ();
}
}
// Content-Type
// Transfer-Encoding (chunked)
// Cache-Control
- internal void WriteHeaders (bool final_flush)
+ void AddHeadersNoCache (ArrayList write_headers, bool final_flush)
{
- if (headers_sent)
- return;
-
- if (WorkerRequest != null)
- WorkerRequest.SendStatus (status_code, StatusDescription);
-
- if (cached_response != null)
- cached_response.SetHeaders (headers);
-
- // If this page is cached use the cached headers
- // instead of the standard headers
- ArrayList write_headers = headers;
- if (cached_headers != null)
- write_headers = cached_headers;
-
//
// Transfer-Encoding
//
// If we are not chunked, we need to set "Connection: close".
//
if (use_chunked){
+#if DEBUG
Console.WriteLine ("Setting to close2");
+#endif
write_headers.Add (new KnownResponseHeader (HttpWorkerRequest.HeaderConnection, "close"));
}
}
// close at the end.
//
if (use_chunked){
+#if DEBUG
Console.WriteLine ("Setting to close");
+#endif
write_headers.Add (new KnownResponseHeader (HttpWorkerRequest.HeaderConnection, "close"));
}
}
if (cache_policy != null)
cache_policy.SetHeaders (this, headers);
else
- write_headers.Add (new UnknownResponseHeader ("Cache-Control", cache_control));
+ write_headers.Add (new UnknownResponseHeader ("Cache-Control", CacheControl));
//
// Content-Type
write_headers.Add (cookies.Get (i).GetCookieHeader ());
}
+ }
+
+ internal void WriteHeaders (bool final_flush)
+ {
+ if (headers_sent)
+ return;
+
+ if (WorkerRequest != null)
+ WorkerRequest.SendStatus (status_code, StatusDescription);
+
+ if (cached_response != null)
+ cached_response.SetHeaders (headers);
+
+ // If this page is cached use the cached headers
+ // instead of the standard headers
+ ArrayList write_headers = headers;
+ if (cached_headers != null)
+ write_headers = cached_headers;
+ else
+ AddHeadersNoCache (write_headers, final_flush);
+
//
// Flush
//
internal void DoFilter (bool close)
{
- if (output_stream.Filter != null && context != null && context.Error == null)
+ if (output_stream.HaveFilter && context != null && context.Error == null)
output_stream.ApplyFilter (close);
}
Flush ();
}
-#if !TARGET_JVM
+#if TARGET_JVM
+ public void WriteFile (IntPtr fileHandle, long offset, long size) {
+ throw new NotSupportedException("IntPtr not supported");
+ }
+#else
public void WriteFile (IntPtr fileHandle, long offset, long size)
{
if (offset < 0)
internal void TransmitFile (string filename, bool final_flush)
{
FileInfo fi = new FileInfo (filename);
+ using (Stream s = fi.OpenRead ()); // Just check if we can read.
output_stream.WriteFile (filename, 0, fi.Length);
output_stream.ApplyFilter (final_flush);
Flush (final_flush);
//
public string CacheControl {
set {
- if (String.Compare (value, "public", true, CultureInfo.InvariantCulture) == 0)
+ if (value == null || value == "") {
+ Cache.SetCacheability (HttpCacheability.NoCache);
+ user_cache_control = null;
+ } else if (String.Compare (value, "public", true, CultureInfo.InvariantCulture) == 0) {
Cache.SetCacheability (HttpCacheability.Public);
- else if (String.Compare (value, "private", true, CultureInfo.InvariantCulture) == 0)
+ user_cache_control = "public";
+ } else if (String.Compare (value, "private", true, CultureInfo.InvariantCulture) == 0) {
Cache.SetCacheability (HttpCacheability.Private);
- else if (String.Compare (value, "no-cache", true, CultureInfo.InvariantCulture) == 0)
+ user_cache_control = "private";
+ } else if (String.Compare (value, "no-cache", true, CultureInfo.InvariantCulture) == 0) {
Cache.SetCacheability (HttpCacheability.NoCache);
- else
+ user_cache_control = "no-cache";
+ } else
throw new ArgumentException ("CacheControl property only allows `public', " +
"`private' or no-cache, for different uses, use " +
"Response.AppendHeader");
- cache_control = value;
}
- get {
- if ((cache_control == null) && (cache_policy != null)) {
- switch (Cache.Cacheability) {
- case (HttpCacheability)0:
- case HttpCacheability.NoCache:
- return "no-cache";
- case HttpCacheability.Private:
- case HttpCacheability.Server:
- case HttpCacheability.ServerAndPrivate:
- return "private";
- case HttpCacheability.Public:
- return "public";
- default:
- throw new Exception ("Unknown internal state: " + Cache.Cacheability);
- }
- }
- return cache_control;
- }
+ get { return (user_cache_control != null) ? user_cache_control : "private"; }
}
#endregion