aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs
diff options
context:
space:
mode:
authorMelanie2013-01-16 01:13:14 +0000
committerMelanie2013-01-16 01:13:14 +0000
commit70fa41863d1f2291d439592682b8d9fa78fa0f06 (patch)
tree623b693af0ceec2e5b0cda8d265b8139c757627b /OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs
parentMerge commit '7978b349bd400d14b7ecd4f8274af1921f435fee' into careminster (diff)
parentMerge branch 'master' of /home/opensim/var/repo/opensim (diff)
downloadopensim-SC_OLD-70fa41863d1f2291d439592682b8d9fa78fa0f06.zip
opensim-SC_OLD-70fa41863d1f2291d439592682b8d9fa78fa0f06.tar.gz
opensim-SC_OLD-70fa41863d1f2291d439592682b8d9fa78fa0f06.tar.bz2
opensim-SC_OLD-70fa41863d1f2291d439592682b8d9fa78fa0f06.tar.xz
Merge commit 'f54b398540698e6e09022fe77b6405624b532f5c' into careminster
Diffstat (limited to 'OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs')
-rw-r--r--OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs108
1 files changed, 108 insertions, 0 deletions
diff --git a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs
index eefcdad..bfbc480 100644
--- a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs
+++ b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs
@@ -77,6 +77,7 @@ namespace OpenSim.Framework.Servers.HttpServer
77 // protected HttpListener m_httpListener; 77 // protected HttpListener m_httpListener;
78 protected CoolHTTPListener m_httpListener2; 78 protected CoolHTTPListener m_httpListener2;
79 protected Dictionary<string, XmlRpcMethod> m_rpcHandlers = new Dictionary<string, XmlRpcMethod>(); 79 protected Dictionary<string, XmlRpcMethod> m_rpcHandlers = new Dictionary<string, XmlRpcMethod>();
80 protected Dictionary<string, JsonRPCMethod> jsonRpcHandlers = new Dictionary<string, JsonRPCMethod>();
80 protected Dictionary<string, bool> m_rpcHandlersKeepAlive = new Dictionary<string, bool>(); 81 protected Dictionary<string, bool> m_rpcHandlersKeepAlive = new Dictionary<string, bool>();
81 protected DefaultLLSDMethod m_defaultLlsdHandler = null; // <-- Moving away from the monolithic.. and going to /registered/ 82 protected DefaultLLSDMethod m_defaultLlsdHandler = null; // <-- Moving away from the monolithic.. and going to /registered/
82 protected Dictionary<string, LLSDMethod> m_llsdHandlers = new Dictionary<string, LLSDMethod>(); 83 protected Dictionary<string, LLSDMethod> m_llsdHandlers = new Dictionary<string, LLSDMethod>();
@@ -217,6 +218,37 @@ namespace OpenSim.Framework.Servers.HttpServer
217 return new List<string>(m_rpcHandlers.Keys); 218 return new List<string>(m_rpcHandlers.Keys);
218 } 219 }
219 220
221 // JsonRPC
222 public bool AddJsonRPCHandler(string method, JsonRPCMethod handler)
223 {
224 lock(jsonRpcHandlers)
225 {
226 jsonRpcHandlers.Add(method, handler);
227 }
228 return true;
229 }
230
231 public JsonRPCMethod GetJsonRPCHandler(string method)
232 {
233 lock (jsonRpcHandlers)
234 {
235 if (jsonRpcHandlers.ContainsKey(method))
236 {
237 return jsonRpcHandlers[method];
238 }
239 else
240 {
241 return null;
242 }
243 }
244 }
245
246 public List<string> GetJsonRpcHandlerKeys()
247 {
248 lock (jsonRpcHandlers)
249 return new List<string>(jsonRpcHandlers.Keys);
250 }
251
220 public bool AddHTTPHandler(string methodName, GenericHTTPMethod handler) 252 public bool AddHTTPHandler(string methodName, GenericHTTPMethod handler)
221 { 253 {
222 //m_log.DebugFormat("[BASE HTTP SERVER]: Registering {0}", methodName); 254 //m_log.DebugFormat("[BASE HTTP SERVER]: Registering {0}", methodName);
@@ -557,10 +589,18 @@ namespace OpenSim.Framework.Servers.HttpServer
557 589
558 buffer = HandleLLSDRequests(request, response); 590 buffer = HandleLLSDRequests(request, response);
559 break; 591 break;
592
593 case "application/json-rpc":
594 if (DebugLevel >= 3)
595 LogIncomingToContentTypeHandler(request);
596
597 buffer = HandleJsonRpcRequests(request, response);
598 break;
560 599
561 case "text/xml": 600 case "text/xml":
562 case "application/xml": 601 case "application/xml":
563 case "application/json": 602 case "application/json":
603
564 default: 604 default:
565 //m_log.Info("[Debug BASE HTTP SERVER]: in default handler"); 605 //m_log.Info("[Debug BASE HTTP SERVER]: in default handler");
566 // Point of note.. the DoWeHaveA methods check for an EXACT path 606 // Point of note.. the DoWeHaveA methods check for an EXACT path
@@ -986,6 +1026,74 @@ namespace OpenSim.Framework.Servers.HttpServer
986 return buffer; 1026 return buffer;
987 } 1027 }
988 1028
1029 // JsonRpc (v2.0 only)
1030 private byte[] HandleJsonRpcRequests(OSHttpRequest request, OSHttpResponse response)
1031 {
1032 Stream requestStream = request.InputStream;
1033 JsonRpcResponse jsonRpcResponse = new JsonRpcResponse();
1034 OSDMap jsonRpcRequest = null;
1035
1036 try
1037 {
1038 jsonRpcRequest = (OSDMap)OSDParser.DeserializeJson(requestStream);
1039 }
1040 catch (LitJson.JsonException e)
1041 {
1042 jsonRpcResponse.Error.Code = ErrorCode.InternalError;
1043 jsonRpcResponse.Error.Message = e.Message;
1044 }
1045
1046 requestStream.Close();
1047
1048 if (jsonRpcRequest != null)
1049 {
1050 if (jsonRpcRequest.ContainsKey("jsonrpc") || jsonRpcRequest["jsonrpc"].AsString() == "2.0")
1051 {
1052 jsonRpcResponse.JsonRpc = "2.0";
1053
1054 // If we have no id, then it's a "notification"
1055 if (jsonRpcRequest.ContainsKey("id"))
1056 {
1057 jsonRpcResponse.Id = jsonRpcRequest["id"].AsString();
1058 }
1059
1060 string methodname = jsonRpcRequest["method"];
1061 JsonRPCMethod method;
1062
1063 if (jsonRpcHandlers.ContainsKey(methodname))
1064 {
1065 lock(jsonRpcHandlers)
1066 {
1067 jsonRpcHandlers.TryGetValue(methodname, out method);
1068 }
1069
1070 method(jsonRpcRequest, ref jsonRpcResponse);
1071 }
1072 else // Error no hanlder defined for requested method
1073 {
1074 jsonRpcResponse.Error.Code = ErrorCode.InvalidRequest;
1075 jsonRpcResponse.Error.Message = string.Format ("No handler defined for {0}", methodname);
1076 }
1077 }
1078 else // not json-rpc 2.0 could be v1
1079 {
1080 jsonRpcResponse.Error.Code = ErrorCode.InvalidRequest;
1081 jsonRpcResponse.Error.Message = "Must be valid json-rpc 2.0 see: http://www.jsonrpc.org/specification";
1082
1083 if (jsonRpcRequest.ContainsKey("id"))
1084 jsonRpcResponse.Id = jsonRpcRequest["id"].AsString();
1085 }
1086 }
1087
1088 response.KeepAlive = true;
1089 string responseData = string.Empty;
1090
1091 responseData = jsonRpcResponse.Serialize();
1092
1093 byte[] buffer = Encoding.UTF8.GetBytes(responseData);
1094 return buffer;
1095 }
1096
989 private byte[] HandleLLSDRequests(OSHttpRequest request, OSHttpResponse response) 1097 private byte[] HandleLLSDRequests(OSHttpRequest request, OSHttpResponse response)
990 { 1098 {
991 //m_log.Warn("[BASE HTTP SERVER]: We've figured out it's a LLSD Request"); 1099 //m_log.Warn("[BASE HTTP SERVER]: We've figured out it's a LLSD Request");