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); | ||||
|  | @ -557,9 +589,17 @@ 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;  | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | @ -231,6 +231,10 @@ namespace OpenSim.Framework.Servers | |||
|                     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()) | ||||
| //                        handlers.AppendFormat("\t{0}\n", s); | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 BlueWall
						BlueWall