Add Json-Rpc 2.0 To Registered Handlers
Added registration json-rpc handlers in the http server. Covers version 2.0 See: http://www.jsonrpc.org/specificationuser_profiles
parent
b592ec265b
commit
ca3e0d67d2
|
@ -77,6 +77,7 @@ namespace OpenSim.Framework.Servers.HttpServer
|
|||
// protected HttpListener m_httpListener;
|
||||
protected CoolHTTPListener m_httpListener2;
|
||||
protected Dictionary<string, XmlRpcMethod> m_rpcHandlers = new Dictionary<string, XmlRpcMethod>();
|
||||
protected Dictionary<string, JsonRPCMethod> jsonRpcHandlers = new Dictionary<string, JsonRPCMethod>();
|
||||
protected Dictionary<string, bool> m_rpcHandlersKeepAlive = new Dictionary<string, bool>();
|
||||
protected DefaultLLSDMethod m_defaultLlsdHandler = null; // <-- Moving away from the monolithic.. and going to /registered/
|
||||
protected Dictionary<string, LLSDMethod> m_llsdHandlers = new Dictionary<string, LLSDMethod>();
|
||||
|
@ -217,6 +218,37 @@ namespace OpenSim.Framework.Servers.HttpServer
|
|||
return new List<string>(m_rpcHandlers.Keys);
|
||||
}
|
||||
|
||||
// JsonRPC
|
||||
public bool AddJsonRPCHandler(string method, JsonRPCMethod handler)
|
||||
{
|
||||
lock(jsonRpcHandlers)
|
||||
{
|
||||
jsonRpcHandlers.Add(method, handler);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public JsonRPCMethod GetJsonRPCHandler(string method)
|
||||
{
|
||||
lock (jsonRpcHandlers)
|
||||
{
|
||||
if (jsonRpcHandlers.ContainsKey(method))
|
||||
{
|
||||
return jsonRpcHandlers[method];
|
||||
}
|
||||
else
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public List<string> GetJsonRpcHandlerKeys()
|
||||
{
|
||||
lock (jsonRpcHandlers)
|
||||
return new List<string>(jsonRpcHandlers.Keys);
|
||||
}
|
||||
|
||||
public bool AddHTTPHandler(string methodName, GenericHTTPMethod handler)
|
||||
{
|
||||
//m_log.DebugFormat("[BASE HTTP SERVER]: Registering {0}", methodName);
|
||||
|
@ -556,10 +588,18 @@ namespace OpenSim.Framework.Servers.HttpServer
|
|||
|
||||
buffer = HandleLLSDRequests(request, response);
|
||||
break;
|
||||
|
||||
case "application/json-rpc":
|
||||
if (DebugLevel >= 3)
|
||||
LogIncomingToContentTypeHandler(request);
|
||||
|
||||
buffer = HandleJsonRpcRequests(request, response);
|
||||
break;
|
||||
|
||||
case "text/xml":
|
||||
case "application/xml":
|
||||
case "application/json":
|
||||
|
||||
default:
|
||||
//m_log.Info("[Debug BASE HTTP SERVER]: in default handler");
|
||||
// Point of note.. the DoWeHaveA methods check for an EXACT path
|
||||
|
@ -985,6 +1025,74 @@ namespace OpenSim.Framework.Servers.HttpServer
|
|||
return buffer;
|
||||
}
|
||||
|
||||
// JsonRpc (v2.0 only)
|
||||
private byte[] HandleJsonRpcRequests(OSHttpRequest request, OSHttpResponse response)
|
||||
{
|
||||
Stream requestStream = request.InputStream;
|
||||
JsonRpcResponse jsonRpcResponse = new JsonRpcResponse();
|
||||
OSDMap jsonRpcRequest = null;
|
||||
|
||||
try
|
||||
{
|
||||
jsonRpcRequest = (OSDMap)OSDParser.DeserializeJson(requestStream);
|
||||
}
|
||||
catch (LitJson.JsonException e)
|
||||
{
|
||||
jsonRpcResponse.Error.Code = ErrorCode.InternalError;
|
||||
jsonRpcResponse.Error.Message = e.Message;
|
||||
}
|
||||
|
||||
requestStream.Close();
|
||||
|
||||
if (jsonRpcRequest != null)
|
||||
{
|
||||
if (jsonRpcRequest.ContainsKey("jsonrpc") || jsonRpcRequest["jsonrpc"].AsString() == "2.0")
|
||||
{
|
||||
jsonRpcResponse.JsonRpc = "2.0";
|
||||
|
||||
// If we have no id, then it's a "notification"
|
||||
if (jsonRpcRequest.ContainsKey("id"))
|
||||
{
|
||||
jsonRpcResponse.Id = jsonRpcRequest["id"].AsString();
|
||||
}
|
||||
|
||||
string methodname = jsonRpcRequest["method"];
|
||||
JsonRPCMethod method;
|
||||
|
||||
if (jsonRpcHandlers.ContainsKey(methodname))
|
||||
{
|
||||
lock(jsonRpcHandlers)
|
||||
{
|
||||
jsonRpcHandlers.TryGetValue(methodname, out method);
|
||||
}
|
||||
|
||||
method(jsonRpcRequest, ref jsonRpcResponse);
|
||||
}
|
||||
else // Error no hanlder defined for requested method
|
||||
{
|
||||
jsonRpcResponse.Error.Code = ErrorCode.InvalidRequest;
|
||||
jsonRpcResponse.Error.Message = string.Format ("No handler defined for {0}", methodname);
|
||||
}
|
||||
}
|
||||
else // not json-rpc 2.0 could be v1
|
||||
{
|
||||
jsonRpcResponse.Error.Code = ErrorCode.InvalidRequest;
|
||||
jsonRpcResponse.Error.Message = "Must be valid json-rpc 2.0 see: http://www.jsonrpc.org/specification";
|
||||
|
||||
if (jsonRpcRequest.ContainsKey("id"))
|
||||
jsonRpcResponse.Id = jsonRpcRequest["id"].AsString();
|
||||
}
|
||||
}
|
||||
|
||||
response.KeepAlive = true;
|
||||
string responseData = string.Empty;
|
||||
|
||||
responseData = jsonRpcResponse.Serialize();
|
||||
|
||||
byte[] buffer = Encoding.UTF8.GetBytes(responseData);
|
||||
return buffer;
|
||||
}
|
||||
|
||||
private byte[] HandleLLSDRequests(OSHttpRequest request, OSHttpResponse response)
|
||||
{
|
||||
//m_log.Warn("[BASE HTTP SERVER]: We've figured out it's a LLSD Request");
|
||||
|
|
|
@ -97,6 +97,8 @@ namespace OpenSim.Framework.Servers.HttpServer
|
|||
bool AddXmlRPCHandler(string method, XmlRpcMethod handler);
|
||||
bool AddXmlRPCHandler(string method, XmlRpcMethod handler, bool keepAlive);
|
||||
|
||||
bool AddJsonRPCHandler(string method, JsonRPCMethod handler);
|
||||
|
||||
/// <summary>
|
||||
/// Gets the XML RPC handler for given method name
|
||||
/// </summary>
|
||||
|
|
|
@ -0,0 +1,34 @@
|
|||
/*
|
||||
* 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.Net;
|
||||
using OpenMetaverse.StructuredData;
|
||||
|
||||
namespace OpenSim.Framework.Servers.HttpServer
|
||||
{
|
||||
public delegate void JsonRPCMethod(OSDMap jsonRpcRequest, ref JsonRpcResponse response);
|
||||
}
|
|
@ -0,0 +1,150 @@
|
|||
/*
|
||||
* 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.Net;
|
||||
using OpenMetaverse.StructuredData;
|
||||
|
||||
namespace OpenSim.Framework.Servers.HttpServer
|
||||
{
|
||||
public sealed class ErrorCode
|
||||
{
|
||||
private ErrorCode() {}
|
||||
|
||||
public const int ParseError = -32700;
|
||||
public const int InvalidRequest = -32600;
|
||||
public const int MethodNotFound = -32601;
|
||||
public const int InvalidParams = -32602;
|
||||
public const int InternalError = -32604;
|
||||
|
||||
}
|
||||
|
||||
public class JsonRpcError
|
||||
{
|
||||
internal OSDMap Error = new OSDMap();
|
||||
|
||||
public int Code
|
||||
{
|
||||
get
|
||||
{
|
||||
if (Error.ContainsKey("code"))
|
||||
return Error["code"].AsInteger();
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
set
|
||||
{
|
||||
Error["code"] = OSD.FromInteger(value);
|
||||
}
|
||||
}
|
||||
|
||||
public string Message
|
||||
{
|
||||
get
|
||||
{
|
||||
if (Error.ContainsKey("message"))
|
||||
return Error["message"].AsString();
|
||||
else
|
||||
return null;
|
||||
}
|
||||
set
|
||||
{
|
||||
Error["message"] = OSD.FromString(value);
|
||||
}
|
||||
}
|
||||
|
||||
public OSD Data
|
||||
{
|
||||
get; set;
|
||||
}
|
||||
}
|
||||
|
||||
public class JsonRpcResponse
|
||||
{
|
||||
public string JsonRpc
|
||||
{
|
||||
get
|
||||
{
|
||||
return Reply["jsonrpc"].AsString();
|
||||
}
|
||||
set
|
||||
{
|
||||
Reply["jsonrpc"] = OSD.FromString(value);
|
||||
}
|
||||
}
|
||||
|
||||
public string Id
|
||||
{
|
||||
get
|
||||
{
|
||||
return Reply["id"].AsString();
|
||||
}
|
||||
set
|
||||
{
|
||||
Reply["id"] = OSD.FromString(value);
|
||||
}
|
||||
}
|
||||
|
||||
public OSD Result
|
||||
{
|
||||
get; set;
|
||||
}
|
||||
|
||||
public JsonRpcError Error
|
||||
{
|
||||
get; set;
|
||||
}
|
||||
|
||||
public OSDMap Reply = new OSDMap();
|
||||
|
||||
public JsonRpcResponse()
|
||||
{
|
||||
Error = new JsonRpcError();
|
||||
}
|
||||
|
||||
public string Serialize()
|
||||
{
|
||||
if (Result != null)
|
||||
Reply["result"] = Result;
|
||||
|
||||
if (Error.Code != 0)
|
||||
{
|
||||
Reply["error"] = (OSD)Error.Error;
|
||||
}
|
||||
|
||||
string result = string.Empty;
|
||||
try
|
||||
{
|
||||
result = OSDParser.SerializeJsonString(Reply);
|
||||
}
|
||||
catch
|
||||
{
|
||||
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -230,6 +230,10 @@ namespace OpenSim.Framework.Servers
|
|||
List<String> poll = httpServer.GetPollServiceHandlerKeys();
|
||||
foreach (String s in httpServer.GetHTTPHandlerKeys())
|
||||
handlers.AppendFormat("\t{0} {1}\n", s, (poll.Contains(s) ? "(poll service)" : string.Empty));
|
||||
|
||||
handlers.AppendFormat("* JSONRPC:\n");
|
||||
foreach (String s in httpServer.GetJsonRpcHandlerKeys())
|
||||
handlers.AppendFormat("\t{0}\n", s);
|
||||
|
||||
// handlers.AppendFormat("* Agent:\n");
|
||||
// foreach (String s in httpServer.GetAgentHandlerKeys())
|
||||
|
|
Loading…
Reference in New Issue