From 7692f3e18f49fc57b63efbe54b7ac71de2fb7e16 Mon Sep 17 00:00:00 2001
From: Dr Scofield
Date: Mon, 14 Jul 2008 12:18:32 +0000
Subject: further work in progress on the HttpServer side: XmlRpc handler path
almost complete and soon to be ready for testing; OSHttpResponse code out.
---
OpenSim/Framework/Servers/OSHttpResponse.cs | 305 +++++++++++++++++++++++-----
1 file changed, 255 insertions(+), 50 deletions(-)
(limited to 'OpenSim/Framework/Servers/OSHttpResponse.cs')
diff --git a/OpenSim/Framework/Servers/OSHttpResponse.cs b/OpenSim/Framework/Servers/OSHttpResponse.cs
index e1ab005..352c6f6 100644
--- a/OpenSim/Framework/Servers/OSHttpResponse.cs
+++ b/OpenSim/Framework/Servers/OSHttpResponse.cs
@@ -25,141 +25,346 @@
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+using System;
using System.Collections;
using System.IO;
using System.Net;
using System.Text;
+using HttpServer;
namespace OpenSim.Framework.Servers
{
+ ///
+ /// OSHttpResponse is the OpenSim representation of an HTTP
+ /// response.
+ ///
+ ///
+ /// OSHttpResponse is currently dual "homed" in that it support
+ /// both the .NET HttpListenerResponse and the HttpServer
+ /// HttpResponse (similar to OSHttpRequest); this duality is only
+ /// temporary and the .NET usage will disappear once the switch to
+ /// HttpServer is completed.
+ ///
public class OSHttpResponse
{
- private string _contentType;
- private bool _contentTypeSet;
+
+ // property code below is a bit messy, will all resolve to
+ // harmony once we've completed the switch
+
+ ///
+ /// Content type property.
+ ///
+ ///
+ /// Setting this property will also set IsContentTypeSet to
+ /// true.
+ ///
public string ContentType
{
- get { return _contentType; }
+ get
+ {
+ return HttpServer ? _httpResponse.ContentType : _contentType;
+ }
set
{
- _contentType = value;
- _contentTypeSet = true;
+ if (HttpServer)
+ {
+ _httpResponse.ContentType = value;
+ }
+ else
+ {
+ _contentType = value;
+ _contentTypeSet = true;
+ }
}
}
+ private string _contentType;
+
+ ///
+ /// Boolean property indicating whether the content type
+ /// property actively has been set.
+ ///
+ ///
+ /// IsContentTypeSet will go away together with .NET base.
+ ///
public bool IsContentTypeSet
{
get { return _contentTypeSet; }
}
+ private bool _contentTypeSet;
- private long _contentLength64;
- public long ContentLength64
+
+ ///
+ /// Length of the body content; 0 if there is no body.
+ ///
+ public long ContentLength
{
- get { return _contentLength64; }
+ get
+ {
+ return HttpServer ? _httpResponse.ContentLength : _contentLength;
+ }
set
{
- _contentLength64 = value;
- if (null != _resp) _resp.ContentLength64 = value;
+ if (HttpServer)
+ _httpResponse.ContentLength = value;
+ else
+ _contentLength = value;
}
}
+ private long _contentLength;
- private Encoding _contentEncoding;
+ ///
+ /// Aliases for ContentLength.
+ ///
+ public long ContentLength64
+ {
+ get { return ContentLength; }
+ set { ContentLength = value; }
+ }
+
+ ///
+ /// Encoding of the body content.
+ ///
public Encoding ContentEncoding
{
- get { return _contentEncoding; }
+ get {
+ return HttpServer ? _httpResponse.Encoding : _contentEncoding;
+ }
set
{
- _contentEncoding = value;
- if (null != _resp) _resp.ContentEncoding = value;
+ if (HttpServer)
+ _httpResponse.Encoding = value;
+ else
+ _contentEncoding = value;
}
}
+ private Encoding _contentEncoding;
- public WebHeaderCollection Headers;
- // public CookieCollection Cookies;
+ ///
+ /// Headers of the response.
+ ///
+ public WebHeaderCollection Headers
+ {
+ get
+ {
+ return HttpServer ? null : _headers;
+ }
+ }
+ private WebHeaderCollection _headers;
- private bool _keepAlive;
+ ///
+ /// Get or set the keep alive property.
+ ///
public bool KeepAlive
{
- get { return _keepAlive; }
+ get
+ {
+ if (HttpServer)
+ return _httpResponse.Connection == ConnectionType.KeepAlive;
+ else
+ return _keepAlive;
+ }
set
{
- _keepAlive = value;
- if (null != _resp) _resp.KeepAlive = value;
+ if (HttpServer)
+ _httpResponse.Connection = ConnectionType.KeepAlive;
+ else
+ _keepAlive = value;
}
}
+ private bool _keepAlive;
- public Stream OutputStream;
+ ///
+ /// Return the output stream feeding the body.
+ ///
+ ///
+ /// On its way out...
+ ///
+ public Stream OutputStream
+ {
+ get
+ {
+ return HttpServer ? _httpResponse.Body : _outputStream;
+ }
+ }
+ private Stream _outputStream;
+
+
+ ///
+ /// Return the output stream feeding the body.
+ ///
+ public Stream Body
+ {
+ get
+ {
+ if (HttpServer)
+ return _httpResponse.Body;
+ throw new Exception("[OSHttpResponse] mixed .NET and HttpServer access");
+ }
+ }
- private string _redirectLocation;
+ ///
+ /// Set a redirct location.
+ ///
public string RedirectLocation
{
- get { return _redirectLocation; }
+ // get { return _redirectLocation; }
set
{
- _redirectLocation = value;
- if (null != _resp) _resp.RedirectLocation = value;
+ if (HttpServer)
+ _httpResponse.Redirect(value);
+ // else
+ // _redirectLocation = value;
}
}
+ // private string _redirectLocation;
- private bool _sendChunked;
+
+
+ ///
+ /// Chunk transfers.
+ ///
public bool SendChunked
{
- get { return _sendChunked; }
+ get
+ {
+ return HttpServer ? _httpResponse.Chunked :_sendChunked;
+ }
+
set
{
- _sendChunked = value;
- if (null != _resp) _resp.SendChunked = value;
+ if (HttpServer)
+ _httpResponse.Chunked = value;
+ else
+ _sendChunked = value;
}
}
+ private bool _sendChunked;
- private int _statusCode;
+
+ ///
+ /// HTTP status code.
+ ///
public int StatusCode
{
- get { return _statusCode; }
+ get
+ {
+ return HttpServer ? (int)_httpResponse.Status : _statusCode;
+ }
+
set
{
- _statusCode = value;
- if (null != _resp) _resp.StatusCode = value;
+ if (HttpServer)
+ _httpResponse.Status = (HttpStatusCode)value;
+ else
+ _statusCode = value;
}
}
+ private int _statusCode;
- private string _statusDescription;
+
+ ///
+ /// HTTP status description.
+ ///
public string StatusDescription
{
- get { return _statusDescription; }
+ get
+ {
+ return HttpServer ? _httpResponse.Reason : _statusDescription;
+ }
+
set
{
- _statusDescription = value;
- if (null != _resp) _resp.StatusDescription = value;
+ if (HttpServer)
+ _httpResponse.Reason = value;
+ else
+ _statusDescription = value;
}
}
+ private string _statusDescription;
- private HttpListenerResponse _resp;
+ private HttpResponse _httpResponse;
+
+ internal bool HttpServer
+ {
+ get { return null != _httpResponse; }
+ }
+
+ internal HttpResponse HttpResponse
+ {
+ get { return _httpResponse; }
+ }
public OSHttpResponse()
{
}
+ ///
+ /// Instantiate an OSHttpResponse object based on an
+ /// underlying .NET HttpListenerResponse.
+ ///
+ ///
+ /// Almost deprecated; will go west to make once HttpServer
+ /// base takes over.
+ ///
public OSHttpResponse(HttpListenerResponse resp)
{
- ContentEncoding = resp.ContentEncoding;
- ContentLength64 = resp.ContentLength64;
+ _contentEncoding = resp.ContentEncoding;
+ _contentLength = resp.ContentLength64;
_contentType = resp.ContentType;
- Headers = resp.Headers;
- // Cookies = resp.Cookies;
- KeepAlive = resp.KeepAlive;
- OutputStream = resp.OutputStream;
- RedirectLocation = resp.RedirectLocation;
- SendChunked = resp.SendChunked;
- StatusCode = resp.StatusCode;
- StatusDescription = resp.StatusDescription;
+ _headers = resp.Headers;
+ // _cookies = resp.Cookies;
+ _keepAlive = resp.KeepAlive;
+ _outputStream = resp.OutputStream;
+ // _redirectLocation = resp.RedirectLocation;
+ _sendChunked = resp.SendChunked;
+ _statusCode = resp.StatusCode;
+ _statusDescription = resp.StatusDescription;
_contentTypeSet = false;
- _resp = resp;
+ // _resp = resp;
}
+ ///
+ /// Instantiate an OSHttpResponse object from an OSHttpRequest
+ /// object.
+ /// Incoming OSHttpRequest to which we are
+ /// replying
+ public OSHttpResponse(OSHttpRequest req)
+ {
+ _httpResponse = new HttpResponse(req.HttpClientContext, req.HttpRequest);
+ }
+
+ ///
+ /// Add a header field and content to the response.
+ ///
+ /// string containing the header field
+ /// name
+ /// string containing the header field
+ /// value
public void AddHeader(string key, string value)
{
- Headers.Add(key, value);
+ if (HttpServer)
+ _headers.Add(key, value);
+ else
+ _httpResponse.AddHeader(key, value);
+ }
+
+ ///
+ /// Send the response back to the remote client
+ ///
+ public void Send()
+ {
+ if (HttpServer)
+ {
+ _httpResponse.Body.Flush();
+ _httpResponse.Send();
+ }
+ else
+ {
+ OutputStream.Close();
+ }
}
}
}
--
cgit v1.1