From 4567555c49cb560dd6f109bbfec42086af3de56f Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Mon, 5 Dec 2011 20:44:20 +0000
Subject: Implement IOSHttpRequest and IOSHttpResponse http interfaces and use
instead of OSHttpRequest/OSHttpResponse.
This is required for the substitution of different HTTP servers or the newer HttpServer.dll without having to commit to a particular implementation.
This is also required to write regression tests that involve the HTTP layer.
If you need to recompile, all you need to do is replace OSHttpRequest/OSHttpResponse references with IOSHttpRequest/IOSHttpResponse.
---
OpenSim/Framework/Servers/BaseOpenSimServer.cs | 2 +-
.../Servers/HttpServer/BaseStreamHandler.cs | 2 +-
.../Servers/HttpServer/BinaryStreamHandler.cs | 2 +-
.../HttpServer/Interfaces/IOSHttpRequest.cs | 59 +++++++++
.../HttpServer/Interfaces/IOSHttpResponse.cs | 138 +++++++++++++++++++++
.../HttpServer/Interfaces/IStreamHandler.cs | 4 +-
.../Framework/Servers/HttpServer/OSHttpRequest.cs | 3 +-
.../Framework/Servers/HttpServer/OSHttpResponse.cs | 5 +-
.../Servers/HttpServer/RestDeserialiseHandler.cs | 2 +-
OpenSim/Framework/Servers/HttpServer/RestMethod.cs | 2 +-
.../Servers/HttpServer/RestSessionService.cs | 4 +-
.../Servers/HttpServer/RestStreamHandler.cs | 2 +-
12 files changed, 210 insertions(+), 15 deletions(-)
create mode 100644 OpenSim/Framework/Servers/HttpServer/Interfaces/IOSHttpRequest.cs
create mode 100644 OpenSim/Framework/Servers/HttpServer/Interfaces/IOSHttpResponse.cs
(limited to 'OpenSim/Framework')
diff --git a/OpenSim/Framework/Servers/BaseOpenSimServer.cs b/OpenSim/Framework/Servers/BaseOpenSimServer.cs
index db063f1..4c381d0 100644
--- a/OpenSim/Framework/Servers/BaseOpenSimServer.cs
+++ b/OpenSim/Framework/Servers/BaseOpenSimServer.cs
@@ -600,7 +600,7 @@ namespace OpenSim.Framework.Servers
}
- public string StatReport(OSHttpRequest httpRequest)
+ public string StatReport(IOSHttpRequest httpRequest)
{
// If we catch a request for "callback", wrap the response in the value for jsonp
if (httpRequest.Query.ContainsKey("callback"))
diff --git a/OpenSim/Framework/Servers/HttpServer/BaseStreamHandler.cs b/OpenSim/Framework/Servers/HttpServer/BaseStreamHandler.cs
index 04943d1..f1cde74 100644
--- a/OpenSim/Framework/Servers/HttpServer/BaseStreamHandler.cs
+++ b/OpenSim/Framework/Servers/HttpServer/BaseStreamHandler.cs
@@ -32,7 +32,7 @@ namespace OpenSim.Framework.Servers.HttpServer
public abstract class BaseStreamHandler : BaseRequestHandler, IStreamedRequestHandler
{
public abstract byte[] Handle(string path, Stream request,
- OSHttpRequest httpRequest, OSHttpResponse httpResponse);
+ IOSHttpRequest httpRequest, IOSHttpResponse httpResponse);
protected BaseStreamHandler(string httpMethod, string path) : base(httpMethod, path)
{
diff --git a/OpenSim/Framework/Servers/HttpServer/BinaryStreamHandler.cs b/OpenSim/Framework/Servers/HttpServer/BinaryStreamHandler.cs
index bae4e1b..1699233 100644
--- a/OpenSim/Framework/Servers/HttpServer/BinaryStreamHandler.cs
+++ b/OpenSim/Framework/Servers/HttpServer/BinaryStreamHandler.cs
@@ -36,7 +36,7 @@ namespace OpenSim.Framework.Servers.HttpServer
{
private BinaryMethod m_method;
- public override byte[] Handle(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse)
+ public override byte[] Handle(string path, Stream request, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
{
byte[] data = ReadFully(request);
string param = GetParam(path);
diff --git a/OpenSim/Framework/Servers/HttpServer/Interfaces/IOSHttpRequest.cs b/OpenSim/Framework/Servers/HttpServer/Interfaces/IOSHttpRequest.cs
new file mode 100644
index 0000000..caf0edd
--- /dev/null
+++ b/OpenSim/Framework/Servers/HttpServer/Interfaces/IOSHttpRequest.cs
@@ -0,0 +1,59 @@
+/*
+ * 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 OpenSimulator 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.Specialized;
+using System.IO;
+using System.Net;
+using System.Text;
+using System.Web;
+
+namespace OpenSim.Framework.Servers.HttpServer
+{
+ public interface IOSHttpRequest
+ {
+ string[] AcceptTypes { get; }
+ Encoding ContentEncoding { get; }
+ long ContentLength { get; }
+ long ContentLength64 { get; }
+ string ContentType { get; }
+ HttpCookieCollection Cookies { get; }
+ bool HasEntityBody { get; }
+ NameValueCollection Headers { get; }
+ string HttpMethod { get; }
+ Stream InputStream { get; }
+ bool IsSecured { get; }
+ bool KeepAlive { get; }
+ NameValueCollection QueryString { get; }
+ Hashtable Query { get; }
+ string RawUrl { get; }
+ IPEndPoint RemoteIPEndPoint { get; }
+ Uri Url { get; }
+ string UserAgent { get; }
+ }
+}
\ No newline at end of file
diff --git a/OpenSim/Framework/Servers/HttpServer/Interfaces/IOSHttpResponse.cs b/OpenSim/Framework/Servers/HttpServer/Interfaces/IOSHttpResponse.cs
new file mode 100644
index 0000000..33a1663
--- /dev/null
+++ b/OpenSim/Framework/Servers/HttpServer/Interfaces/IOSHttpResponse.cs
@@ -0,0 +1,138 @@
+/*
+ * 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 OpenSimulator 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.Specialized;
+using System.IO;
+using System.Net;
+using System.Text;
+using System.Web;
+
+namespace OpenSim.Framework.Servers.HttpServer
+{
+ public interface IOSHttpResponse
+ {
+ ///
+ /// Content type property.
+ ///
+ ///
+ /// Setting this property will also set IsContentTypeSet to
+ /// true.
+ ///
+ string ContentType { get; set; }
+
+ ///
+ /// 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;
+
+ ///
+ /// Length of the body content; 0 if there is no body.
+ ///
+ long ContentLength { get; set; }
+
+ ///
+ /// Alias for ContentLength.
+ ///
+ long ContentLength64 { get; set; }
+
+ ///
+ /// Encoding of the body content.
+ ///
+ Encoding ContentEncoding { get; set; }
+
+ bool KeepAlive { get; set; }
+
+ ///
+ /// Get or set the keep alive timeout property (default is
+ /// 20). Setting this to 0 also disables KeepAlive. Setting
+ /// this to something else but 0 also enable KeepAlive.
+ ///
+ int KeepAliveTimeout { get; set; }
+
+ ///
+ /// Return the output stream feeding the body.
+ ///
+ ///
+ /// On its way out...
+ ///
+ Stream OutputStream { get; }
+
+ string ProtocolVersion { get; set; }
+
+ ///
+ /// Return the output stream feeding the body.
+ ///
+ Stream Body { get; }
+
+ ///
+ /// Set a redirct location.
+ ///
+ string RedirectLocation { set; }
+
+ ///
+ /// Chunk transfers.
+ ///
+ bool SendChunked { get; set; }
+
+ ///
+ /// HTTP status code.
+ ///
+ int StatusCode { get; set; }
+
+ ///
+ /// HTTP status description.
+ ///
+ string StatusDescription { get; set; }
+
+ bool ReuseContext { get; set; }
+
+ ///
+ /// Add a header field and content to the response.
+ ///
+ /// string containing the header field
+ /// name
+ /// string containing the header field
+ /// value
+ void AddHeader(string key, string value);
+
+ ///
+ /// Send the response back to the remote client
+ ///
+ void Send();
+ }
+}
+
diff --git a/OpenSim/Framework/Servers/HttpServer/Interfaces/IStreamHandler.cs b/OpenSim/Framework/Servers/HttpServer/Interfaces/IStreamHandler.cs
index 2e1bc0b..a449c2d 100644
--- a/OpenSim/Framework/Servers/HttpServer/Interfaces/IStreamHandler.cs
+++ b/OpenSim/Framework/Servers/HttpServer/Interfaces/IStreamHandler.cs
@@ -45,13 +45,13 @@ namespace OpenSim.Framework.Servers.HttpServer
public interface IStreamedRequestHandler : IRequestHandler
{
// Handle request stream, return byte array
- byte[] Handle(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse);
+ byte[] Handle(string path, Stream request, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse);
}
public interface IStreamHandler : IRequestHandler
{
// Handle request stream, return byte array
- void Handle(string path, Stream request, Stream response, OSHttpRequest httpReqbuest, OSHttpResponse httpResponse);
+ void Handle(string path, Stream request, Stream response, IOSHttpRequest httpReqbuest, IOSHttpResponse httpResponse);
}
public interface IGenericHTTPHandler : IRequestHandler
diff --git a/OpenSim/Framework/Servers/HttpServer/OSHttpRequest.cs b/OpenSim/Framework/Servers/HttpServer/OSHttpRequest.cs
index e354dfb..fc8daf3 100644
--- a/OpenSim/Framework/Servers/HttpServer/OSHttpRequest.cs
+++ b/OpenSim/Framework/Servers/HttpServer/OSHttpRequest.cs
@@ -39,7 +39,7 @@ using log4net;
namespace OpenSim.Framework.Servers.HttpServer
{
- public class OSHttpRequest
+ public class OSHttpRequest : IOSHttpRequest
{
private static readonly ILog _log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
@@ -174,7 +174,6 @@ namespace OpenSim.Framework.Servers.HttpServer
}
private Dictionary _whiteboard = new Dictionary();
-
public OSHttpRequest() {}
public OSHttpRequest(IHttpClientContext context, IHttpRequest req)
diff --git a/OpenSim/Framework/Servers/HttpServer/OSHttpResponse.cs b/OpenSim/Framework/Servers/HttpServer/OSHttpResponse.cs
index 7029289..f9227ac 100644
--- a/OpenSim/Framework/Servers/HttpServer/OSHttpResponse.cs
+++ b/OpenSim/Framework/Servers/HttpServer/OSHttpResponse.cs
@@ -36,7 +36,7 @@ namespace OpenSim.Framework.Servers.HttpServer
/// OSHttpResponse is the OpenSim representation of an HTTP
/// response.
///
- public class OSHttpResponse
+ public class OSHttpResponse : IOSHttpResponse
{
///
/// Content type property.
@@ -275,7 +275,6 @@ namespace OpenSim.Framework.Servers.HttpServer
}
}
-
protected IHttpResponse _httpResponse;
private IHttpClientContext _httpClientContext;
@@ -331,4 +330,4 @@ namespace OpenSim.Framework.Servers.HttpServer
}
}
-}
+}
\ No newline at end of file
diff --git a/OpenSim/Framework/Servers/HttpServer/RestDeserialiseHandler.cs b/OpenSim/Framework/Servers/HttpServer/RestDeserialiseHandler.cs
index 3f2b265..a467a83 100644
--- a/OpenSim/Framework/Servers/HttpServer/RestDeserialiseHandler.cs
+++ b/OpenSim/Framework/Servers/HttpServer/RestDeserialiseHandler.cs
@@ -45,7 +45,7 @@ namespace OpenSim.Framework.Servers.HttpServer
}
public void Handle(string path, Stream request, Stream responseStream,
- OSHttpRequest httpRequest, OSHttpResponse httpResponse)
+ IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
{
TRequest deserial;
using (XmlTextReader xmlReader = new XmlTextReader(request))
diff --git a/OpenSim/Framework/Servers/HttpServer/RestMethod.cs b/OpenSim/Framework/Servers/HttpServer/RestMethod.cs
index f97efbe..80bc7ef 100644
--- a/OpenSim/Framework/Servers/HttpServer/RestMethod.cs
+++ b/OpenSim/Framework/Servers/HttpServer/RestMethod.cs
@@ -28,5 +28,5 @@
namespace OpenSim.Framework.Servers.HttpServer
{
public delegate string RestMethod(string request, string path, string param,
- OSHttpRequest httpRequest, OSHttpResponse httpResponse);
+ IOSHttpRequest httpRequest, IOSHttpResponse httpResponse);
}
diff --git a/OpenSim/Framework/Servers/HttpServer/RestSessionService.cs b/OpenSim/Framework/Servers/HttpServer/RestSessionService.cs
index 7ebb462..19c03a8 100644
--- a/OpenSim/Framework/Servers/HttpServer/RestSessionService.cs
+++ b/OpenSim/Framework/Servers/HttpServer/RestSessionService.cs
@@ -211,7 +211,7 @@ namespace OpenSim.Framework.Servers.HttpServer
}
public void Handle(string path, Stream request, Stream responseStream,
- OSHttpRequest httpRequest, OSHttpResponse httpResponse)
+ IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
{
RestSessionObject deserial = default(RestSessionObject);
bool fail = false;
@@ -270,7 +270,7 @@ namespace OpenSim.Framework.Servers.HttpServer
}
public void Handle(string path, Stream request, Stream responseStream,
- OSHttpRequest httpRequest, OSHttpResponse httpResponse)
+ IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
{
TRequest deserial = default(TRequest);
bool fail = false;
diff --git a/OpenSim/Framework/Servers/HttpServer/RestStreamHandler.cs b/OpenSim/Framework/Servers/HttpServer/RestStreamHandler.cs
index 2d43cd4..d2c4002 100644
--- a/OpenSim/Framework/Servers/HttpServer/RestStreamHandler.cs
+++ b/OpenSim/Framework/Servers/HttpServer/RestStreamHandler.cs
@@ -39,7 +39,7 @@ namespace OpenSim.Framework.Servers.HttpServer
get { return m_restMethod; }
}
- public override byte[] Handle(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse)
+ public override byte[] Handle(string path, Stream request, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
{
Encoding encoding = Encoding.UTF8;
StreamReader streamReader = new StreamReader(request, encoding);
--
cgit v1.1