* Added a streamhandler that does streams both in and out
* The RestDeserialisehandler now does streams and returns an object instead of stringafrisby
parent
dbcab80520
commit
0d528e1d22
|
@ -43,7 +43,7 @@ namespace OpenSim.Framework.Servers
|
||||||
protected Thread m_workerThread;
|
protected Thread m_workerThread;
|
||||||
protected HttpListener m_httpListener;
|
protected HttpListener m_httpListener;
|
||||||
protected Dictionary<string, XmlRpcMethod> m_rpcHandlers = new Dictionary<string, XmlRpcMethod>();
|
protected Dictionary<string, XmlRpcMethod> m_rpcHandlers = new Dictionary<string, XmlRpcMethod>();
|
||||||
protected Dictionary<string, IStreamHandler> m_streamHandlers = new Dictionary<string, IStreamHandler>();
|
protected Dictionary<string, IRequestHandler> m_streamHandlers = new Dictionary<string, IRequestHandler>();
|
||||||
protected int m_port;
|
protected int m_port;
|
||||||
protected bool m_firstcaps = true;
|
protected bool m_firstcaps = true;
|
||||||
|
|
||||||
|
@ -57,7 +57,7 @@ namespace OpenSim.Framework.Servers
|
||||||
m_port = port;
|
m_port = port;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void AddStreamHandler(IStreamHandler handler)
|
public void AddStreamHandler(IRequestHandler handler)
|
||||||
{
|
{
|
||||||
string httpMethod = handler.HttpMethod;
|
string httpMethod = handler.HttpMethod;
|
||||||
string path = handler.Path;
|
string path = handler.Path;
|
||||||
|
@ -97,14 +97,32 @@ namespace OpenSim.Framework.Servers
|
||||||
string path = request.RawUrl;
|
string path = request.RawUrl;
|
||||||
string handlerKey = GetHandlerKey(request.HttpMethod, path);
|
string handlerKey = GetHandlerKey(request.HttpMethod, path);
|
||||||
|
|
||||||
IStreamHandler streamHandler;
|
IRequestHandler requestHandler;
|
||||||
|
|
||||||
if (TryGetStreamHandler(handlerKey, out streamHandler))
|
if (TryGetStreamHandler(handlerKey, out requestHandler))
|
||||||
{
|
{
|
||||||
byte[] buffer = streamHandler.Handle(path, request.InputStream);
|
// Okay, so this is bad, but should be considered temporary until everything is IStreamHandler.
|
||||||
request.InputStream.Close();
|
byte[] buffer;
|
||||||
|
if (requestHandler is IStreamedRequestHandler)
|
||||||
|
{
|
||||||
|
IStreamedRequestHandler streamedRequestHandler = requestHandler as IStreamedRequestHandler;
|
||||||
|
buffer = streamedRequestHandler.Handle(path, request.InputStream);
|
||||||
|
|
||||||
response.ContentType = streamHandler.ContentType;
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
IStreamHandler streamHandler = (IStreamHandler)requestHandler;
|
||||||
|
|
||||||
|
using (MemoryStream memoryStream = new MemoryStream())
|
||||||
|
{
|
||||||
|
streamHandler.Handle(path, request.InputStream, memoryStream);
|
||||||
|
memoryStream.Flush();
|
||||||
|
buffer = memoryStream.ToArray();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
request.InputStream.Close();
|
||||||
|
response.ContentType = requestHandler.ContentType;
|
||||||
response.ContentLength64 = buffer.LongLength;
|
response.ContentLength64 = buffer.LongLength;
|
||||||
response.OutputStream.Write(buffer, 0, buffer.Length);
|
response.OutputStream.Write(buffer, 0, buffer.Length);
|
||||||
response.OutputStream.Close();
|
response.OutputStream.Close();
|
||||||
|
@ -115,7 +133,7 @@ namespace OpenSim.Framework.Servers
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool TryGetStreamHandler(string handlerKey, out IStreamHandler streamHandler)
|
private bool TryGetStreamHandler(string handlerKey, out IRequestHandler streamHandler)
|
||||||
{
|
{
|
||||||
string bestMatch = null;
|
string bestMatch = null;
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,35 @@
|
||||||
|
namespace OpenSim.Framework.Servers
|
||||||
|
{
|
||||||
|
public class BaseRequestHandler
|
||||||
|
{
|
||||||
|
public virtual string ContentType
|
||||||
|
{
|
||||||
|
get { return "application/xml"; }
|
||||||
|
}
|
||||||
|
|
||||||
|
private readonly string m_httpMethod;
|
||||||
|
|
||||||
|
public virtual string HttpMethod
|
||||||
|
{
|
||||||
|
get { return m_httpMethod; }
|
||||||
|
}
|
||||||
|
|
||||||
|
private readonly string m_path;
|
||||||
|
|
||||||
|
protected BaseRequestHandler(string httpMethod, string path)
|
||||||
|
{
|
||||||
|
m_httpMethod = httpMethod;
|
||||||
|
m_path = path;
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual string Path
|
||||||
|
{
|
||||||
|
get { return m_path; }
|
||||||
|
}
|
||||||
|
|
||||||
|
protected string GetParam(string path)
|
||||||
|
{
|
||||||
|
return path.Substring(m_path.Length);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -30,38 +30,12 @@ using System.IO;
|
||||||
|
|
||||||
namespace OpenSim.Framework.Servers
|
namespace OpenSim.Framework.Servers
|
||||||
{
|
{
|
||||||
public abstract class BaseStreamHandler : IStreamHandler
|
public abstract class BaseStreamHandler : BaseRequestHandler, IStreamedRequestHandler
|
||||||
{
|
{
|
||||||
public virtual string ContentType
|
|
||||||
{
|
|
||||||
get { return "application/xml"; }
|
|
||||||
}
|
|
||||||
|
|
||||||
private string m_httpMethod;
|
|
||||||
|
|
||||||
public virtual string HttpMethod
|
|
||||||
{
|
|
||||||
get { return m_httpMethod; }
|
|
||||||
}
|
|
||||||
|
|
||||||
private string m_path;
|
|
||||||
|
|
||||||
public virtual string Path
|
|
||||||
{
|
|
||||||
get { return m_path; }
|
|
||||||
}
|
|
||||||
|
|
||||||
protected string GetParam(string path)
|
|
||||||
{
|
|
||||||
return path.Substring(m_path.Length);
|
|
||||||
}
|
|
||||||
|
|
||||||
public abstract byte[] Handle(string path, Stream request);
|
public abstract byte[] Handle(string path, Stream request);
|
||||||
|
|
||||||
protected BaseStreamHandler(string httpMethod, string path)
|
protected BaseStreamHandler(string httpMethod, string path) : base(httpMethod, path)
|
||||||
{
|
{
|
||||||
m_httpMethod = httpMethod;
|
|
||||||
m_path = path;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -30,11 +30,8 @@ using System.IO;
|
||||||
|
|
||||||
namespace OpenSim.Framework.Servers
|
namespace OpenSim.Framework.Servers
|
||||||
{
|
{
|
||||||
public interface IStreamHandler
|
public interface IRequestHandler
|
||||||
{
|
{
|
||||||
// Handle request stream, return byte array
|
|
||||||
byte[] Handle(string path, Stream request);
|
|
||||||
|
|
||||||
// Return response content type
|
// Return response content type
|
||||||
string ContentType { get; }
|
string ContentType { get; }
|
||||||
|
|
||||||
|
@ -44,4 +41,17 @@ namespace OpenSim.Framework.Servers
|
||||||
// Return path
|
// Return path
|
||||||
string Path { get; }
|
string Path { get; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public interface IStreamedRequestHandler : IRequestHandler
|
||||||
|
{
|
||||||
|
// Handle request stream, return byte array
|
||||||
|
byte[] Handle(string path, Stream request);
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IStreamHandler : IRequestHandler
|
||||||
|
{
|
||||||
|
// Handle request stream, return byte array
|
||||||
|
void Handle(string path, Stream request, Stream response);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -7,35 +7,35 @@ using System.Xml.Serialization;
|
||||||
|
|
||||||
namespace OpenSim.Framework.Servers
|
namespace OpenSim.Framework.Servers
|
||||||
{
|
{
|
||||||
public delegate string RestDeserialiseMethod<TRequest>(TRequest request);
|
public delegate TResponse RestDeserialiseMethod<TRequest, TResponse>(TRequest request);
|
||||||
|
|
||||||
public class RestDeserialisehandler<TRequest> : BaseStreamHandler
|
public class RestDeserialisehandler<TRequest, TResponse> : BaseRequestHandler, IStreamHandler
|
||||||
where TRequest : new()
|
where TRequest : new()
|
||||||
{
|
{
|
||||||
private RestDeserialiseMethod<TRequest> m_method;
|
private RestDeserialiseMethod<TRequest, TResponse> m_method;
|
||||||
|
|
||||||
public RestDeserialisehandler(string httpMethod, string path, RestDeserialiseMethod<TRequest> method)
|
public RestDeserialisehandler(string httpMethod, string path, RestDeserialiseMethod<TRequest, TResponse> method)
|
||||||
: base(httpMethod, path)
|
: base(httpMethod, path)
|
||||||
{
|
{
|
||||||
m_method = method;
|
m_method = method;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override byte[] Handle(string path, Stream request)
|
public void Handle(string path, Stream request, Stream responseStream )
|
||||||
{
|
{
|
||||||
Type type = typeof(TRequest);
|
TRequest deserial;
|
||||||
|
using (XmlTextReader xmlReader = new XmlTextReader(request))
|
||||||
TRequest deserial= default(TRequest);
|
|
||||||
using (XmlTextReader xreader = new XmlTextReader(request))
|
|
||||||
{
|
{
|
||||||
XmlSerializer serializer = new XmlSerializer(type);
|
XmlSerializer deserializer = new XmlSerializer(typeof(TRequest));
|
||||||
deserial = (TRequest)serializer.Deserialize(xreader);
|
deserial = (TRequest)deserializer.Deserialize(xmlReader);
|
||||||
}
|
}
|
||||||
|
|
||||||
string response = m_method(deserial);
|
TResponse response = m_method(deserial);
|
||||||
|
|
||||||
Encoding encoding = new UTF8Encoding(false);
|
|
||||||
return encoding.GetBytes(response);
|
|
||||||
|
|
||||||
|
using (XmlWriter xmlWriter = XmlTextWriter.Create( responseStream ))
|
||||||
|
{
|
||||||
|
XmlSerializer serializer = new XmlSerializer(typeof(TResponse));
|
||||||
|
serializer.Serialize(xmlWriter, response );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -415,7 +415,7 @@ namespace OpenSim
|
||||||
return GetPhysicsScene(m_physicsEngine);
|
return GetPhysicsScene(m_physicsEngine);
|
||||||
}
|
}
|
||||||
|
|
||||||
private class SimStatusHandler : IStreamHandler
|
private class SimStatusHandler : IStreamedRequestHandler
|
||||||
{
|
{
|
||||||
public byte[] Handle(string path, Stream request)
|
public byte[] Handle(string path, Stream request)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue