//
// (c) 2002 Ximian, Inc. (http://www.ximian.com)
//
+
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// 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;
using System.Collections;
using System.Globalization;
public sealed class HttpResponse
{
// Chunked encoding static helpers
- static byte [] s_arrChunkSuffix = { 10, 13 };
- static byte [] s_arrChunkEnd = { 10 , 13 };
+ static byte [] s_arrChunkSuffix = {13, 10};
+ static byte [] s_arrChunkEnd = {48, 13, 10, 13, 10};
static string s_sChunkedPrefix = "\r\n";
ArrayList _Headers;
cached_headers = headers;
}
- [MonoTODO("We need to add cache headers also")]
private ArrayList GenerateHeaders ()
{
ArrayList oHeaders = new ArrayList (_Headers.ToArray ());
CultureInfo oSavedInfo = Thread.CurrentThread.CurrentCulture;
Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
- string date = DateTime.Now.ToUniversalTime ().ToString ("ddd, d MMM yyyy HH:mm:ss ");
+ string date = DateTime.UtcNow.ToString ("ddd, d MMM yyyy HH:mm:ss ");
HttpResponseHeader date_header = new HttpResponseHeader ("Date", date + "GMT");
oHeaders.Add (date_header);
virtualPath = UrlUtils.Reduce (virtualPath);
}
- if (app_path_mod != null && virtualPath.IndexOf (app_path_mod) > 0)
- virtualPath = UrlUtils.Combine (app_path_mod, virtualPath);
+ if (app_path_mod != null && virtualPath.IndexOf (app_path_mod) < 0) {
+ string rvd = _Context.Request.RootVirtualDir;
+ string basevd = rvd.Replace (app_path_mod, "");
+
+ if (!virtualPath.StartsWith (basevd))
+ return virtualPath;
+
+ virtualPath = UrlUtils.Combine (rvd, virtualPath.Substring (basevd.Length));
+ }
return virtualPath;
}
}
set {
- if (!_expiresInMinutesSet || (value < _expiresInMinutes))\r
- {\r
- _expiresInMinutes = value;\r
- Cache.SetExpires(_Context.Timestamp.Add(new TimeSpan(0, _expiresInMinutes, 0)));\r
+ if (!_expiresInMinutesSet || (value < _expiresInMinutes))
+ {
+ _expiresInMinutes = value;
+ Cache.SetExpires(_Context.Timestamp.Add(new TimeSpan(0, _expiresInMinutes, 0)));
}
_expiresInMinutesSet = true;
}
}
set {
- if (!_expiresAbsoluteSet || value.CompareTo(_expiresAbsolute)<0)\r
- {\r
- _expiresAbsolute = value;\r
- Cache.SetExpires(_expiresAbsolute); \r
+ if (!_expiresAbsoluteSet || value.CompareTo(_expiresAbsolute)<0)
+ {
+ _expiresAbsolute = value;
+ Cache.SetExpires(_expiresAbsolute);
}
_expiresAbsoluteSet = true;
}
}
set {
- if (_bHeadersSent)
- throw new HttpException ("Headers has been sent to the client");
-
_bSuppressContent = true;
}
}
break;
case HttpWorkerRequest.HeaderTransferEncoding:
_sTransferEncoding = value;
- if (value.Equals ("chunked")) {
- _bChunked = true;
- } else {
- _bChunked = false;
- }
+ _bChunked = (value == "chunked");
break;
case HttpWorkerRequest.HeaderPragma:
_sCacheControl = value;
break;
case "transfer-encoding":
_sTransferEncoding = value;
- if (value.Equals ("chunked")) {
- _bChunked = true;
- } else {
- _bChunked = false;
- }
+ _bChunked = (value == "chunked");
break;
case "pragma":
_sCacheControl = value;
Clear();
}
+ internal void SetHeadersSent (bool val)
+ {
+ _bHeadersSent = val;
+ }
+
public void ClearHeaders ()
{
if (_bHeadersSent)
_sTransferEncoding == null) {
// Check we are going todo chunked encoding
string sProto = Request.ServerVariables ["SERVER_PROTOCOL"];
- sProto = "HTTP/1.0"; // Remove this line when we support properly
- // chunked content
-
if (sProto != null && sProto == "HTTP/1.1") {
AppendHeader (
HttpWorkerRequest.HeaderTransferEncoding,
}
if (length == 0) {
+ if (bFinish && _bChunked) {
+ _WorkerRequest.SendResponseFromMemory (s_arrChunkEnd,
+ s_arrChunkEnd.Length);
+ }
+
_WorkerRequest.FlushResponse (bFinish);
if (!bFinish)
_Writer.Clear ();
if (!_bSuppressContent && Request.HttpMethod == "HEAD")
_bSuppressContent = true;
+ if (_bSuppressContent)
+ _Writer.Clear ();
+
if (!_bSuppressContent) {
_bClientDisconnected = false;
if (_bChunked) {