diff --git a/OpenSim/Framework/Servers/OSHttpHttpHandler.cs b/OpenSim/Framework/Servers/OSHttpHttpHandler.cs new file mode 100644 index 0000000000..66120c333e --- /dev/null +++ b/OpenSim/Framework/Servers/OSHttpHttpHandler.cs @@ -0,0 +1,145 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSim Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.Collections; +using System.Collections.Generic; +using System.IO; +using System.Net; +using System.Reflection; +using System.Text; +using System.Text.RegularExpressions; +using System.Xml; +using log4net; +using Nwc.XmlRpc; + +namespace OpenSim.Framework.Servers +{ + public delegate XmlRpcResponse OSHttpHttpProcessor(XmlRpcRequest request); + + public class OSHttpHttpHandler: OSHttpHandler + { + private static readonly ILog _log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + + // contains handler for processing HTTP Request + private GenericHTTPMethod _handler; + + /// + /// Instantiate an HTTP handler. + /// + /// a GenericHTTPMethod + /// null or HTTP method regex + /// null or path regex + /// null or dictionary with query regexs + /// null or dictionary with header + /// regexs + /// null or IP address whitelist + public OSHttpHttpHandler(GenericHTTPMethod handler, Regex method, Regex path, + Dictionary query, + Dictionary headers, Regex whitelist) + : base(method, path, query, headers, new Regex(@"^text/html", RegexOptions.IgnoreCase | RegexOptions.Compiled), + whitelist) + { + _handler = handler; + } + + /// + /// Instantiate an HTTP handler. + /// + /// a GenericHTTPMethod + public OSHttpHttpHandler(GenericHTTPMethod handler) + : this(handler, new Regex(@"^GET$", RegexOptions.IgnoreCase | RegexOptions.Compiled), null, null, null, null) + { + } + + /// + /// Invoked by OSHttpRequestPump. + /// + public override OSHttpHandlerResult Process(OSHttpRequest request) + { + // call handler method + Hashtable responseData = _handler(request.Query); + + int responseCode = (int)responseData["int_response_code"]; + string responseString = (string)responseData["str_response_string"]; + string contentType = (string)responseData["content_type"]; + + //Even though only one other part of the entire code uses HTTPHandlers, we shouldn't expect this + //and should check for NullReferenceExceptions + + if (string.IsNullOrEmpty(contentType)) + { + contentType = "text/html"; + } + + OSHttpResponse response = new OSHttpResponse(request); + + // We're forgoing the usual error status codes here because the client + // ignores anything but 200 and 301 + + response.StatusCode = (int)OSHttpStatusCode.SuccessOk; + + if (responseCode == (int)OSHttpStatusCode.RedirectMovedPermanently) + { + response.RedirectLocation = (string)responseData["str_redirect_location"]; + response.StatusCode = responseCode; + } + + response.AddHeader("Content-type", contentType); + + byte[] buffer; + + if (!contentType.Contains("image")) + { + buffer = Encoding.UTF8.GetBytes(responseString); + } + else + { + buffer = Convert.FromBase64String(responseString); + } + + response.SendChunked = false; + response.ContentLength64 = buffer.Length; + response.ContentEncoding = Encoding.UTF8; + + try + { + response.Body.Write(buffer, 0, buffer.Length); + } + catch (Exception ex) + { + _log.ErrorFormat("[OSHttpHttpHandler]: Error: {0}", ex.Message); + } + finally + { + response.Send(); + } + + return OSHttpHandlerResult.Done; + } + } +} \ No newline at end of file