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