diff options
author | Teravus Ovares | 2008-08-25 07:35:17 +0000 |
---|---|---|
committer | Teravus Ovares | 2008-08-25 07:35:17 +0000 |
commit | 2912aafe259727351eb9405532e45aa3501b7e9a (patch) | |
tree | 34774a49306ae19a6682580d41927fcfb222ea6e /OpenSim/Framework/Servers/BaseHttpServer.cs | |
parent | Mantis#2043. Thank you kindly, Ralphos for a patch that addresses: (diff) | |
download | opensim-SC_OLD-2912aafe259727351eb9405532e45aa3501b7e9a.zip opensim-SC_OLD-2912aafe259727351eb9405532e45aa3501b7e9a.tar.gz opensim-SC_OLD-2912aafe259727351eb9405532e45aa3501b7e9a.tar.bz2 opensim-SC_OLD-2912aafe259727351eb9405532e45aa3501b7e9a.tar.xz |
* This commit incorporates the heart of the OpenGridProtocol patch that is currently on Forge in a nice, friendly modular format.
* There are a lot of changes and this is quite experimental. It's off by default, but you can turn it on by examining the bottom of the opensim.ini.example for the proper OpenSim.ini settings. Remember, you still need an agent domain..
* Furthermore, it isn't quite right when it comes to teleporting to remote regions (place_avatar)
Diffstat (limited to 'OpenSim/Framework/Servers/BaseHttpServer.cs')
-rw-r--r-- | OpenSim/Framework/Servers/BaseHttpServer.cs | 168 |
1 files changed, 145 insertions, 23 deletions
diff --git a/OpenSim/Framework/Servers/BaseHttpServer.cs b/OpenSim/Framework/Servers/BaseHttpServer.cs index 23c28e6..7b2b599 100644 --- a/OpenSim/Framework/Servers/BaseHttpServer.cs +++ b/OpenSim/Framework/Servers/BaseHttpServer.cs | |||
@@ -47,8 +47,9 @@ namespace OpenSim.Framework.Servers | |||
47 | 47 | ||
48 | protected Thread m_workerThread; | 48 | protected Thread m_workerThread; |
49 | protected HttpListener m_httpListener; | 49 | protected HttpListener m_httpListener; |
50 | protected Dictionary<string, XmlRpcMethod> m_rpcHandlers = new Dictionary<string, XmlRpcMethod>(); | 50 | protected Dictionary<string, XmlRpcMethod> m_rpcHandlers = new Dictionary<string, XmlRpcMethod>(); |
51 | protected LLSDMethod m_llsdHandler = null; | 51 | protected DefaultLLSDMethod m_defaultLlsdHandler = null; // <-- Moving away from the monolithic.. and going to /registered/ |
52 | protected Dictionary<string, LLSDMethod> m_llsdHandlers = new Dictionary<string, LLSDMethod>(); | ||
52 | protected Dictionary<string, IRequestHandler> m_streamHandlers = new Dictionary<string, IRequestHandler>(); | 53 | protected Dictionary<string, IRequestHandler> m_streamHandlers = new Dictionary<string, IRequestHandler>(); |
53 | protected Dictionary<string, GenericHTTPMethod> m_HTTPHandlers = new Dictionary<string, GenericHTTPMethod>(); | 54 | protected Dictionary<string, GenericHTTPMethod> m_HTTPHandlers = new Dictionary<string, GenericHTTPMethod>(); |
54 | protected Dictionary<string, IHttpAgentHandler> m_agentHandlers = new Dictionary<string, IHttpAgentHandler>(); | 55 | protected Dictionary<string, IHttpAgentHandler> m_agentHandlers = new Dictionary<string, IHttpAgentHandler>(); |
@@ -148,9 +149,28 @@ namespace OpenSim.Framework.Servers | |||
148 | return false; | 149 | return false; |
149 | } | 150 | } |
150 | 151 | ||
151 | public bool SetLLSDHandler(LLSDMethod handler) | 152 | /// <summary> |
153 | /// Adds a LLSD handler, yay. | ||
154 | /// </summary> | ||
155 | /// <param name="path">/resource/ path</param> | ||
156 | /// <param name="handler">handle the LLSD response</param> | ||
157 | /// <returns></returns> | ||
158 | public bool AddLLSDHandler(string path, LLSDMethod handler) | ||
152 | { | 159 | { |
153 | m_llsdHandler = handler; | 160 | lock (m_llsdHandlers) |
161 | { | ||
162 | if (!m_llsdHandlers.ContainsKey(path)) | ||
163 | { | ||
164 | m_llsdHandlers.Add(path, handler); | ||
165 | return true; | ||
166 | } | ||
167 | } | ||
168 | return false; | ||
169 | } | ||
170 | |||
171 | public bool SetDefaultLLSDHandler(DefaultLLSDMethod handler) | ||
172 | { | ||
173 | m_defaultLlsdHandler = handler; | ||
154 | return true; | 174 | return true; |
155 | } | 175 | } |
156 | 176 | ||
@@ -239,20 +259,21 @@ namespace OpenSim.Framework.Servers | |||
239 | 259 | ||
240 | switch (request.ContentType) | 260 | switch (request.ContentType) |
241 | { | 261 | { |
242 | case null: | 262 | case null: |
243 | case "text/html": | 263 | case "text/html": |
244 | HandleHTTPRequest(request, response); | 264 | HandleHTTPRequest(request, response); |
245 | return; | 265 | return; |
246 | 266 | ||
247 | case "application/xml+llsd": | 267 | case "application/llsd+xml": |
248 | HandleLLSDRequests(request, response); | 268 | case "application/xml+llsd": |
249 | return; | 269 | HandleLLSDRequests(request, response); |
270 | return; | ||
250 | 271 | ||
251 | case "text/xml": | 272 | case "text/xml": |
252 | case "application/xml": | 273 | case "application/xml": |
253 | default: | 274 | default: |
254 | HandleXmlRpcRequests(request, response); | 275 | HandleXmlRpcRequests(request, response); |
255 | return; | 276 | return; |
256 | } | 277 | } |
257 | } | 278 | } |
258 | catch (SocketException e) | 279 | catch (SocketException e) |
@@ -456,17 +477,37 @@ namespace OpenSim.Framework.Servers | |||
456 | m_log.Warn("[HTTPD]: Error - " + ex.Message); | 477 | m_log.Warn("[HTTPD]: Error - " + ex.Message); |
457 | } | 478 | } |
458 | 479 | ||
459 | if (llsdRequest != null && m_llsdHandler != null) | 480 | if (llsdRequest != null)// && m_defaultLlsdHandler != null) |
460 | { | 481 | { |
461 | llsdResponse = m_llsdHandler(llsdRequest); | 482 | |
483 | LLSDMethod llsdhandler = null; | ||
484 | |||
485 | if (TryGetLLSDHandler(request.RawUrl, out llsdhandler)) | ||
486 | { | ||
487 | // we found a registered llsd handler to service this request | ||
488 | llsdResponse = llsdhandler(request.RawUrl, llsdRequest, request.RemoteIPEndPoint.ToString()); | ||
489 | } | ||
490 | else | ||
491 | { | ||
492 | // we didn't find a registered llsd handler to service this request | ||
493 | // check if we have a default llsd handler | ||
494 | |||
495 | if (m_defaultLlsdHandler != null) | ||
496 | { | ||
497 | // LibOMV path | ||
498 | llsdResponse = m_defaultLlsdHandler(llsdRequest); | ||
499 | } | ||
500 | else | ||
501 | { | ||
502 | // Oops, no handler for this.. give em the failed message | ||
503 | llsdResponse = GenerateNoLLSDHandlerResponse(); | ||
504 | } | ||
505 | } | ||
506 | |||
462 | } | 507 | } |
463 | else | 508 | else |
464 | { | 509 | { |
465 | LLSDMap map = new LLSDMap(); | 510 | llsdResponse = GenerateNoLLSDHandlerResponse(); |
466 | map["reason"] = LLSD.FromString("LLSDRequest"); | ||
467 | map["message"] = LLSD.FromString("No handler registered for LLSD Requests"); | ||
468 | map["login"] = LLSD.FromString("false"); | ||
469 | llsdResponse = map; | ||
470 | } | 511 | } |
471 | 512 | ||
472 | response.ContentType = "application/xml+llsd"; | 513 | response.ContentType = "application/xml+llsd"; |
@@ -491,6 +532,68 @@ namespace OpenSim.Framework.Servers | |||
491 | } | 532 | } |
492 | } | 533 | } |
493 | 534 | ||
535 | private bool TryGetLLSDHandler(string path, out LLSDMethod llsdHandler) | ||
536 | { | ||
537 | llsdHandler = null; | ||
538 | // Pull out the first part of the path | ||
539 | // splitting the path by '/' means we'll get the following return.. | ||
540 | // {0}/{1}/{2} | ||
541 | // where {0} isn't something we really control 100% | ||
542 | |||
543 | string[] pathbase = path.Split('/'); | ||
544 | string searchquery = "/"; | ||
545 | |||
546 | if (pathbase.Length < 1) | ||
547 | return false; | ||
548 | |||
549 | for (int i=1; i<pathbase.Length; i++) | ||
550 | { | ||
551 | searchquery += pathbase[i]; | ||
552 | if (pathbase.Length-1 != i) | ||
553 | searchquery += "/"; | ||
554 | } | ||
555 | |||
556 | // while the matching algorithm below doesn't require it, we're expecting a query in the form | ||
557 | // | ||
558 | // [] = optional | ||
559 | // /resource/UUID/action[/action] | ||
560 | // | ||
561 | // now try to get the closest match to the reigstered path | ||
562 | // at least for OGP, registered path would probably only consist of the /resource/ | ||
563 | |||
564 | string bestMatch = null; | ||
565 | |||
566 | foreach (string pattern in m_llsdHandlers.Keys) | ||
567 | { | ||
568 | if (searchquery.StartsWith(searchquery)) | ||
569 | { | ||
570 | if (String.IsNullOrEmpty(bestMatch) || searchquery.Length > bestMatch.Length) | ||
571 | { | ||
572 | bestMatch = pattern; | ||
573 | } | ||
574 | } | ||
575 | } | ||
576 | |||
577 | if (String.IsNullOrEmpty(bestMatch)) | ||
578 | { | ||
579 | llsdHandler = null; | ||
580 | return false; | ||
581 | } | ||
582 | else | ||
583 | { | ||
584 | llsdHandler = m_llsdHandlers[bestMatch]; | ||
585 | return true; | ||
586 | } | ||
587 | } | ||
588 | |||
589 | private LLSDMap GenerateNoLLSDHandlerResponse() | ||
590 | { | ||
591 | LLSDMap map = new LLSDMap(); | ||
592 | map["reason"] = LLSD.FromString("LLSDRequest"); | ||
593 | map["message"] = LLSD.FromString("No handler registered for LLSD Requests"); | ||
594 | map["login"] = LLSD.FromString("false"); | ||
595 | return map; | ||
596 | } | ||
494 | /// <summary> | 597 | /// <summary> |
495 | /// A specific agent handler was provided. Such a handler is expecetd to have an | 598 | /// A specific agent handler was provided. Such a handler is expecetd to have an |
496 | /// intimate, and highly specific relationship with the client. Consequently, | 599 | /// intimate, and highly specific relationship with the client. Consequently, |
@@ -809,6 +912,25 @@ namespace OpenSim.Framework.Servers | |||
809 | 912 | ||
810 | return false; | 913 | return false; |
811 | } | 914 | } |
915 | public bool RemoveLLSDHandler(string path, LLSDMethod handler) | ||
916 | { | ||
917 | |||
918 | try | ||
919 | { | ||
920 | if (handler == m_llsdHandlers[path]) | ||
921 | { | ||
922 | m_llsdHandlers.Remove(path); | ||
923 | return true; | ||
924 | } | ||
925 | } | ||
926 | catch (KeyNotFoundException) | ||
927 | { | ||
928 | // This is an exception to prevent crashing because of invalid code | ||
929 | } | ||
930 | |||
931 | return false; | ||
932 | } | ||
933 | |||
812 | 934 | ||
813 | public string GetHTTP404(string host) | 935 | public string GetHTTP404(string host) |
814 | { | 936 | { |