diff options
-rw-r--r-- | OpenSim/Framework/Servers/BaseHttpServer.cs | 53 |
1 files changed, 32 insertions, 21 deletions
diff --git a/OpenSim/Framework/Servers/BaseHttpServer.cs b/OpenSim/Framework/Servers/BaseHttpServer.cs index 50e2c0c..e57682f 100644 --- a/OpenSim/Framework/Servers/BaseHttpServer.cs +++ b/OpenSim/Framework/Servers/BaseHttpServer.cs | |||
@@ -84,10 +84,12 @@ namespace OpenSim.Framework.Servers | |||
84 | 84 | ||
85 | string handlerKey = GetHandlerKey(httpMethod, path); | 85 | string handlerKey = GetHandlerKey(httpMethod, path); |
86 | 86 | ||
87 | if (!m_streamHandlers.ContainsKey(handlerKey)) | 87 | lock(m_streamHandlers) { |
88 | { | 88 | if (!m_streamHandlers.ContainsKey(handlerKey)) |
89 | //m_log.DebugFormat("[BASE HTTP SERVER]: Adding handler key {0}", handlerKey); | 89 | { |
90 | m_streamHandlers.Add(handlerKey, handler); | 90 | //m_log.DebugFormat("[BASE HTTP SERVER]: Adding handler key {0}", handlerKey); |
91 | m_streamHandlers.Add(handlerKey, handler); | ||
92 | } | ||
91 | } | 93 | } |
92 | } | 94 | } |
93 | 95 | ||
@@ -98,10 +100,12 @@ namespace OpenSim.Framework.Servers | |||
98 | 100 | ||
99 | public bool AddXmlRPCHandler(string method, XmlRpcMethod handler) | 101 | public bool AddXmlRPCHandler(string method, XmlRpcMethod handler) |
100 | { | 102 | { |
101 | if (!m_rpcHandlers.ContainsKey(method)) | 103 | lock(m_rpcHandlers) { |
102 | { | 104 | if (!m_rpcHandlers.ContainsKey(method)) |
103 | m_rpcHandlers.Add(method, handler); | 105 | { |
104 | return true; | 106 | m_rpcHandlers.Add(method, handler); |
107 | return true; | ||
108 | } | ||
105 | } | 109 | } |
106 | 110 | ||
107 | //must already have a handler for that path so return false | 111 | //must already have a handler for that path so return false |
@@ -110,10 +114,12 @@ namespace OpenSim.Framework.Servers | |||
110 | 114 | ||
111 | public bool AddHTTPHandler(string method, GenericHTTPMethod handler) | 115 | public bool AddHTTPHandler(string method, GenericHTTPMethod handler) |
112 | { | 116 | { |
113 | if (!m_HTTPHandlers.ContainsKey(method)) | 117 | lock(m_HTTPHandlers) { |
114 | { | 118 | if (!m_HTTPHandlers.ContainsKey(method)) |
115 | m_HTTPHandlers.Add(method, handler); | 119 | { |
116 | return true; | 120 | m_HTTPHandlers.Add(method, handler); |
121 | return true; | ||
122 | } | ||
117 | } | 123 | } |
118 | 124 | ||
119 | //must already have a handler for that path so return false | 125 | //must already have a handler for that path so return false |
@@ -126,10 +132,12 @@ namespace OpenSim.Framework.Servers | |||
126 | 132 | ||
127 | public bool AddAgentHandler(string agent, IHttpAgentHandler handler) | 133 | public bool AddAgentHandler(string agent, IHttpAgentHandler handler) |
128 | { | 134 | { |
129 | if (!m_agentHandlers.ContainsKey(agent)) | 135 | lock(m_agentHandlers) { |
130 | { | 136 | if (!m_agentHandlers.ContainsKey(agent)) |
131 | m_agentHandlers.Add(agent, handler); | 137 | { |
132 | return true; | 138 | m_agentHandlers.Add(agent, handler); |
139 | return true; | ||
140 | } | ||
133 | } | 141 | } |
134 | 142 | ||
135 | //must already have a handler for that path so return false | 143 | //must already have a handler for that path so return false |
@@ -156,16 +164,17 @@ namespace OpenSim.Framework.Servers | |||
156 | OSHttpRequest request = new OSHttpRequest(context.Request); | 164 | OSHttpRequest request = new OSHttpRequest(context.Request); |
157 | OSHttpResponse response = new OSHttpResponse(context.Response); | 165 | OSHttpResponse response = new OSHttpResponse(context.Response); |
158 | 166 | ||
167 | // user agent based requests? not sure where this actually gets used from | ||
159 | if (request.UserAgent != null) | 168 | if (request.UserAgent != null) |
160 | { | 169 | { |
161 | |||
162 | IHttpAgentHandler agentHandler; | 170 | IHttpAgentHandler agentHandler; |
163 | 171 | ||
164 | if (TryGetAgentHandler(request, response, out agentHandler)) | 172 | if (TryGetAgentHandler(request, response, out agentHandler)) |
165 | { | 173 | { |
166 | // m_log.DebugFormat("[HTTP-AGENT] Handler located for {0}", request.UserAgent); | 174 | if (HandleAgentRequest(agentHandler, request, response)) { |
167 | if (HandleAgentRequest(agentHandler, request, response)) | 175 | m_log.DebugFormat("[HTTP-AGENT] Handler located for {0}", request.UserAgent); |
168 | return; | 176 | return; |
177 | } | ||
169 | } | 178 | } |
170 | } | 179 | } |
171 | 180 | ||
@@ -235,7 +244,7 @@ namespace OpenSim.Framework.Servers | |||
235 | return; | 244 | return; |
236 | } | 245 | } |
237 | } | 246 | } |
238 | catch (SocketException) | 247 | catch (SocketException e) |
239 | { | 248 | { |
240 | // At least on linux, it appears that if the client makes a request without requiring the response, | 249 | // At least on linux, it appears that if the client makes a request without requiring the response, |
241 | // an unconnected socket exception is thrown when we close the response output stream. There's no | 250 | // an unconnected socket exception is thrown when we close the response output stream. There's no |
@@ -244,6 +253,7 @@ namespace OpenSim.Framework.Servers | |||
244 | // | 253 | // |
245 | // An alternative may be to turn off all response write exceptions on the HttpListener, but let's go | 254 | // An alternative may be to turn off all response write exceptions on the HttpListener, but let's go |
246 | // with the minimum first | 255 | // with the minimum first |
256 | m_log.WarnFormat("[BASE HTTP SERVER]: HandleRequest threw {0}.\nNOTE: this may be spurious on Linux", e); | ||
247 | } | 257 | } |
248 | catch (Exception e) | 258 | catch (Exception e) |
249 | { | 259 | { |
@@ -403,9 +413,10 @@ namespace OpenSim.Framework.Servers | |||
403 | { | 413 | { |
404 | response.OutputStream.Close(); | 414 | response.OutputStream.Close(); |
405 | } | 415 | } |
406 | catch (SocketException) | 416 | catch (SocketException e) |
407 | { | 417 | { |
408 | // This has to be here to prevent a Linux/Mono crash | 418 | // This has to be here to prevent a Linux/Mono crash |
419 | m_log.WarnFormat("[BASE HTTP SERVER] XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", e); | ||
409 | } | 420 | } |
410 | } | 421 | } |
411 | } | 422 | } |