From 7692f3e18f49fc57b63efbe54b7ac71de2fb7e16 Mon Sep 17 00:00:00 2001 From: Dr Scofield Date: Mon, 14 Jul 2008 12:18:32 +0000 Subject: further work in progress on the HttpServer side: XmlRpc handler path almost complete and soon to be ready for testing; OSHttpResponse code out. --- OpenSim/Framework/Servers/OSHttpRequestPump.cs | 80 ++++++++++++++++++-------- 1 file changed, 57 insertions(+), 23 deletions(-) (limited to 'OpenSim/Framework/Servers/OSHttpRequestPump.cs') diff --git a/OpenSim/Framework/Servers/OSHttpRequestPump.cs b/OpenSim/Framework/Servers/OSHttpRequestPump.cs index 4218be5..56714fa 100644 --- a/OpenSim/Framework/Servers/OSHttpRequestPump.cs +++ b/OpenSim/Framework/Servers/OSHttpRequestPump.cs @@ -28,6 +28,7 @@ using System; using System.Collections.Generic; using System.Collections.Specialized; +using System.IO; using System.Net; using System.Reflection; using System.Text.RegularExpressions; @@ -114,7 +115,7 @@ namespace OpenSim.Framework.Servers // process req: we try each handler in turn until // we are either out of handlers or get back a - // Handled or Detached + // Pass or Done OSHttpHandlerResult rc = OSHttpHandlerResult.Unprocessed; foreach (OSHttpHandler h in handlers) { @@ -123,22 +124,35 @@ namespace OpenSim.Framework.Servers // Pass: handler did not process the request, // try next handler if (OSHttpHandlerResult.Pass == rc) continue; - // Detached: handler is taking over processing - // of request, we are done - if (OSHttpHandlerResult.Detached == rc) break; - - if (OSHttpHandlerResult.Handled != rc) - { - // something went wrong - throw new Exception(String.Format("[{0}] got unexpected OSHttpHandlerResult {1}", EngineID, rc)); - } + + // Handled: handler has processed the request + if (OSHttpHandlerResult.Done == rc) break; - // Handled: clean up now - req.HttpRequest.AddHeader("keep-alive", "false"); + // hmm, something went wrong + throw new Exception(String.Format("[{0}] got unexpected OSHttpHandlerResult {1}", EngineID, rc)); + } + + if (OSHttpHandlerResult.Unprocessed == rc) + { + _log.InfoFormat("[{0}] OSHttpHandler: no handler registered for {1}", EngineID, req); + + // set up response header + OSHttpResponse resp = new OSHttpResponse(req); + resp.StatusCode = (int)OSHttpStatusCode.ClientErrorNotFound; + resp.StatusDescription = String.Format("no handler on call for {0}", req); + resp.ContentType = "text/html"; + + // add explanatory message + StreamWriter body = new StreamWriter(resp.Body); + body.WriteLine(""); + body.WriteLine("
Ooops...
"); + body.WriteLine(String.Format("

{0}

", resp.StatusDescription)); + body.WriteLine(""); + body.Flush(); - break; + // and ship it back + resp.HttpResponse.Send(); } - } catch (Exception e) { @@ -199,17 +213,37 @@ namespace OpenSim.Framework.Servers NameValueCollection headers = req.HttpRequest.Headers; foreach (string tag in headerRegexs.Keys) { - if (null != headers[tag]) + // do we have a header "tag"? + if (null == headers[tag]) { - Match hm = headerRegexs[tag].Match(headers[tag]); - if (hm.Success) { - headersMatch++; - continue; - } + // no: remove the handler if it was added + // earlier and on to the next one + scoredHandlers.Remove(h); + break; } - - scoredHandlers.Remove(h); - break; + + // does the content of header "tag" match + // the supplied regex? + Match hm = headerRegexs[tag].Match(headers[tag]); + if (!hm.Success) { + // no: remove the handler if it was added + // earlier and on to the next one + scoredHandlers.Remove(h); + break; + } + + // if we are looking at the "content-type" tag, + // check wether h has a ContentTypeChecker and + // invoke it if it has + if ((null != h.ContentTypeChecker) && !h.ContentTypeChecker(req)) + { + scoredHandlers.Remove(h); + break; + } + + // ok: header matches + headersMatch++; + continue; } // check whether h got kicked out if (!scoredHandlers.ContainsKey(h)) continue; -- cgit v1.1