diff options
Diffstat (limited to 'OpenSim/Framework')
7 files changed, 93 insertions, 45 deletions
diff --git a/OpenSim/Framework/Console/RemoteConsole.cs b/OpenSim/Framework/Console/RemoteConsole.cs index 8ad7b0d..4b88923 100644 --- a/OpenSim/Framework/Console/RemoteConsole.cs +++ b/OpenSim/Framework/Console/RemoteConsole.cs | |||
@@ -234,7 +234,7 @@ namespace OpenSim.Framework.Console | |||
234 | string uri = "/ReadResponses/" + sessionID.ToString() + "/"; | 234 | string uri = "/ReadResponses/" + sessionID.ToString() + "/"; |
235 | 235 | ||
236 | m_Server.AddPollServiceHTTPHandler( | 236 | m_Server.AddPollServiceHTTPHandler( |
237 | uri, new PollServiceEventArgs(null, uri, HasEvents, GetEvents, NoEvents, sessionID,25000)); // 25 secs timeout | 237 | uri, new PollServiceEventArgs(null, uri, HasEvents, GetEvents, NoEvents, Drop, sessionID, 25000)); // 25 secs timeout |
238 | 238 | ||
239 | XmlDocument xmldoc = new XmlDocument(); | 239 | XmlDocument xmldoc = new XmlDocument(); |
240 | XmlNode xmlnode = xmldoc.CreateNode(XmlNodeType.XmlDeclaration, | 240 | XmlNode xmlnode = xmldoc.CreateNode(XmlNodeType.XmlDeclaration, |
@@ -425,6 +425,15 @@ namespace OpenSim.Framework.Console | |||
425 | return false; | 425 | return false; |
426 | } | 426 | } |
427 | 427 | ||
428 | private void Drop(UUID RequestID, UUID sessionID) | ||
429 | { | ||
430 | lock (m_Connections) | ||
431 | { | ||
432 | if (m_Connections.ContainsKey(sessionID)) | ||
433 | m_Connections.Remove(sessionID); | ||
434 | } | ||
435 | } | ||
436 | |||
428 | private Hashtable GetEvents(UUID RequestID, UUID sessionID) | 437 | private Hashtable GetEvents(UUID RequestID, UUID sessionID) |
429 | { | 438 | { |
430 | ConsoleConnection c = null; | 439 | ConsoleConnection c = null; |
diff --git a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs index e431042..c078a73 100644 --- a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs +++ b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs | |||
@@ -461,7 +461,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
461 | } | 461 | } |
462 | 462 | ||
463 | OSHttpResponse resp = new OSHttpResponse(new HttpResponse(context, request),context); | 463 | OSHttpResponse resp = new OSHttpResponse(new HttpResponse(context, request),context); |
464 | resp.ReuseContext = true; | 464 | // resp.ReuseContext = true; |
465 | // resp.ReuseContext = false; | 465 | // resp.ReuseContext = false; |
466 | HandleRequest(req, resp); | 466 | HandleRequest(req, resp); |
467 | 467 | ||
@@ -1804,7 +1804,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
1804 | */ | 1804 | */ |
1805 | // disable this things | 1805 | // disable this things |
1806 | response.KeepAlive = false; | 1806 | response.KeepAlive = false; |
1807 | response.ReuseContext = false; | 1807 | // response.ReuseContext = false; |
1808 | 1808 | ||
1809 | // Cross-Origin Resource Sharing with simple requests | 1809 | // Cross-Origin Resource Sharing with simple requests |
1810 | if (responsedata.ContainsKey("access_control_allow_origin")) | 1810 | if (responsedata.ContainsKey("access_control_allow_origin")) |
diff --git a/OpenSim/Framework/Servers/HttpServer/Interfaces/IOSHttpResponse.cs b/OpenSim/Framework/Servers/HttpServer/Interfaces/IOSHttpResponse.cs index f61b090..d26b68a 100644 --- a/OpenSim/Framework/Servers/HttpServer/Interfaces/IOSHttpResponse.cs +++ b/OpenSim/Framework/Servers/HttpServer/Interfaces/IOSHttpResponse.cs | |||
@@ -118,7 +118,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
118 | /// </summary> | 118 | /// </summary> |
119 | string StatusDescription { get; set; } | 119 | string StatusDescription { get; set; } |
120 | 120 | ||
121 | bool ReuseContext { get; set; } | 121 | // bool ReuseContext { get; set; } |
122 | 122 | ||
123 | /// <summary> | 123 | /// <summary> |
124 | /// Add a header field and content to the response. | 124 | /// Add a header field and content to the response. |
diff --git a/OpenSim/Framework/Servers/HttpServer/OSHttpResponse.cs b/OpenSim/Framework/Servers/HttpServer/OSHttpResponse.cs index ccf9c91..8456654 100644 --- a/OpenSim/Framework/Servers/HttpServer/OSHttpResponse.cs +++ b/OpenSim/Framework/Servers/HttpServer/OSHttpResponse.cs | |||
@@ -256,7 +256,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
256 | _httpResponse.Reason = value; | 256 | _httpResponse.Reason = value; |
257 | } | 257 | } |
258 | } | 258 | } |
259 | 259 | /* | |
260 | public bool ReuseContext | 260 | public bool ReuseContext |
261 | { | 261 | { |
262 | get | 262 | get |
@@ -275,7 +275,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
275 | } | 275 | } |
276 | } | 276 | } |
277 | } | 277 | } |
278 | 278 | */ | |
279 | protected IHttpResponse _httpResponse; | 279 | protected IHttpResponse _httpResponse; |
280 | private IHttpClientContext _httpClientContext; | 280 | private IHttpClientContext _httpClientContext; |
281 | 281 | ||
diff --git a/OpenSim/Framework/Servers/HttpServer/PollServiceEventArgs.cs b/OpenSim/Framework/Servers/HttpServer/PollServiceEventArgs.cs index 3fd3bf7..a9860cc 100644 --- a/OpenSim/Framework/Servers/HttpServer/PollServiceEventArgs.cs +++ b/OpenSim/Framework/Servers/HttpServer/PollServiceEventArgs.cs | |||
@@ -37,6 +37,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
37 | public delegate Hashtable GetEventsMethod(UUID requestID, UUID pId); | 37 | public delegate Hashtable GetEventsMethod(UUID requestID, UUID pId); |
38 | 38 | ||
39 | public delegate Hashtable NoEventsMethod(UUID requestID, UUID pId); | 39 | public delegate Hashtable NoEventsMethod(UUID requestID, UUID pId); |
40 | public delegate void DropMethod(UUID requestID, UUID pId); | ||
40 | 41 | ||
41 | public class PollServiceEventArgs : EventArgs | 42 | public class PollServiceEventArgs : EventArgs |
42 | { | 43 | { |
@@ -44,6 +45,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
44 | public GetEventsMethod GetEvents; | 45 | public GetEventsMethod GetEvents; |
45 | public NoEventsMethod NoEvents; | 46 | public NoEventsMethod NoEvents; |
46 | public RequestMethod Request; | 47 | public RequestMethod Request; |
48 | public DropMethod Drop; | ||
47 | public UUID Id; | 49 | public UUID Id; |
48 | public int TimeOutms; | 50 | public int TimeOutms; |
49 | public EventType Type; | 51 | public EventType Type; |
@@ -73,13 +75,14 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
73 | RequestMethod pRequest, | 75 | RequestMethod pRequest, |
74 | string pUrl, | 76 | string pUrl, |
75 | HasEventsMethod pHasEvents, GetEventsMethod pGetEvents, NoEventsMethod pNoEvents, | 77 | HasEventsMethod pHasEvents, GetEventsMethod pGetEvents, NoEventsMethod pNoEvents, |
76 | UUID pId, int pTimeOutms) | 78 | DropMethod pDrop, UUID pId, int pTimeOutms) |
77 | { | 79 | { |
78 | Request = pRequest; | 80 | Request = pRequest; |
79 | Url = pUrl; | 81 | Url = pUrl; |
80 | HasEvents = pHasEvents; | 82 | HasEvents = pHasEvents; |
81 | GetEvents = pGetEvents; | 83 | GetEvents = pGetEvents; |
82 | NoEvents = pNoEvents; | 84 | NoEvents = pNoEvents; |
85 | Drop = pDrop; | ||
83 | Id = pId; | 86 | Id = pId; |
84 | TimeOutms = pTimeOutms; | 87 | TimeOutms = pTimeOutms; |
85 | Type = EventType.LongPoll; | 88 | Type = EventType.LongPoll; |
diff --git a/OpenSim/Framework/Servers/HttpServer/PollServiceHttpRequest.cs b/OpenSim/Framework/Servers/HttpServer/PollServiceHttpRequest.cs index 0e4a941..6537f64 100644 --- a/OpenSim/Framework/Servers/HttpServer/PollServiceHttpRequest.cs +++ b/OpenSim/Framework/Servers/HttpServer/PollServiceHttpRequest.cs | |||
@@ -47,8 +47,10 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
47 | public readonly UUID RequestID; | 47 | public readonly UUID RequestID; |
48 | public int contextHash; | 48 | public int contextHash; |
49 | 49 | ||
50 | /* | ||
50 | private void GenContextHash() | 51 | private void GenContextHash() |
51 | { | 52 | { |
53 | |||
52 | Random rnd = new Random(); | 54 | Random rnd = new Random(); |
53 | contextHash = 0; | 55 | contextHash = 0; |
54 | if (Request.Headers["remote_addr"] != null) | 56 | if (Request.Headers["remote_addr"] != null) |
@@ -62,8 +64,9 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
62 | } | 64 | } |
63 | else | 65 | else |
64 | contextHash += rnd.Next() & 0xffff; | 66 | contextHash += rnd.Next() & 0xffff; |
65 | } | ||
66 | 67 | ||
68 | } | ||
69 | */ | ||
67 | public PollServiceHttpRequest( | 70 | public PollServiceHttpRequest( |
68 | PollServiceEventArgs pPollServiceArgs, IHttpClientContext pHttpContext, IHttpRequest pRequest) | 71 | PollServiceEventArgs pPollServiceArgs, IHttpClientContext pHttpContext, IHttpRequest pRequest) |
69 | { | 72 | { |
@@ -72,7 +75,8 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
72 | Request = pRequest; | 75 | Request = pRequest; |
73 | RequestTime = System.Environment.TickCount; | 76 | RequestTime = System.Environment.TickCount; |
74 | RequestID = UUID.Random(); | 77 | RequestID = UUID.Random(); |
75 | GenContextHash(); | 78 | // GenContextHash(); |
79 | contextHash = HttpContext.contextID; | ||
76 | } | 80 | } |
77 | 81 | ||
78 | internal void DoHTTPGruntWork(BaseHttpServer server, Hashtable responsedata) | 82 | internal void DoHTTPGruntWork(BaseHttpServer server, Hashtable responsedata) |
@@ -85,7 +89,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
85 | response.SendChunked = false; | 89 | response.SendChunked = false; |
86 | response.ContentLength64 = buffer.Length; | 90 | response.ContentLength64 = buffer.Length; |
87 | response.ContentEncoding = Encoding.UTF8; | 91 | response.ContentEncoding = Encoding.UTF8; |
88 | response.ReuseContext = false; | 92 | // response.ReuseContext = false; |
89 | 93 | ||
90 | try | 94 | try |
91 | { | 95 | { |
@@ -110,7 +114,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
110 | response.SendChunked = false; | 114 | response.SendChunked = false; |
111 | response.ContentLength64 = 0; | 115 | response.ContentLength64 = 0; |
112 | response.ContentEncoding = Encoding.UTF8; | 116 | response.ContentEncoding = Encoding.UTF8; |
113 | response.ReuseContext = false; | 117 | // response.ReuseContext = false; |
114 | response.KeepAlive = false; | 118 | response.KeepAlive = false; |
115 | response.SendChunked = false; | 119 | response.SendChunked = false; |
116 | response.StatusCode = 503; | 120 | response.StatusCode = 503; |
@@ -132,8 +136,9 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
132 | { | 136 | { |
133 | if (b1.contextHash != b2.contextHash) | 137 | if (b1.contextHash != b2.contextHash) |
134 | return false; | 138 | return false; |
135 | bool b = Object.ReferenceEquals(b1.HttpContext, b2.HttpContext); | 139 | // bool b = Object.ReferenceEquals(b1.HttpContext, b2.HttpContext); |
136 | return b; | 140 | // return b; |
141 | return true; | ||
137 | } | 142 | } |
138 | 143 | ||
139 | public int GetHashCode(PollServiceHttpRequest b2) | 144 | public int GetHashCode(PollServiceHttpRequest b2) |
diff --git a/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs b/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs index ffcad0f..5b40590 100644 --- a/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs +++ b/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs | |||
@@ -160,6 +160,19 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
160 | } | 160 | } |
161 | } | 161 | } |
162 | 162 | ||
163 | public void DropByContext(PollServiceHttpRequest req) | ||
164 | { | ||
165 | Queue<PollServiceHttpRequest> ctxQeueue; | ||
166 | lock (m_bycontext) | ||
167 | { | ||
168 | if (m_bycontext.TryGetValue(req, out ctxQeueue)) | ||
169 | { | ||
170 | ctxQeueue.Clear(); | ||
171 | m_bycontext.Remove(req); | ||
172 | } | ||
173 | } | ||
174 | } | ||
175 | |||
163 | public void EnqueueInt(PollServiceHttpRequest req) | 176 | public void EnqueueInt(PollServiceHttpRequest req) |
164 | { | 177 | { |
165 | if (m_running) | 178 | if (m_running) |
@@ -263,22 +276,61 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
263 | PollServiceHttpRequest req = m_requests.Dequeue(5000); | 276 | PollServiceHttpRequest req = m_requests.Dequeue(5000); |
264 | 277 | ||
265 | Watchdog.UpdateThread(); | 278 | Watchdog.UpdateThread(); |
266 | if (req != null) | 279 | if(req == null) |
280 | continue; | ||
281 | |||
282 | try | ||
267 | { | 283 | { |
268 | try | 284 | if(!req.HttpContext.CanSend()) |
269 | { | 285 | { |
270 | if (req.PollServiceArgs.HasEvents(req.RequestID, req.PollServiceArgs.Id)) | 286 | req.PollServiceArgs.Drop(req.RequestID, req.PollServiceArgs.Id); |
287 | byContextDequeue(req); | ||
288 | continue; | ||
289 | } | ||
290 | |||
291 | if(req.HttpContext.IsSending()) | ||
292 | { | ||
293 | if ((Environment.TickCount - req.RequestTime) > req.PollServiceArgs.TimeOutms) | ||
271 | { | 294 | { |
272 | Hashtable responsedata = req.PollServiceArgs.GetEvents(req.RequestID, req.PollServiceArgs.Id); | 295 | req.PollServiceArgs.Drop(req.RequestID, req.PollServiceArgs.Id); |
296 | byContextDequeue(req); | ||
297 | } | ||
298 | else | ||
299 | ReQueueEvent(req); | ||
300 | continue; | ||
301 | } | ||
273 | 302 | ||
303 | if (req.PollServiceArgs.HasEvents(req.RequestID, req.PollServiceArgs.Id)) | ||
304 | { | ||
305 | Hashtable responsedata = req.PollServiceArgs.GetEvents(req.RequestID, req.PollServiceArgs.Id); | ||
306 | |||
307 | m_threadPool.QueueWorkItem(x => | ||
308 | { | ||
309 | try | ||
310 | { | ||
311 | req.DoHTTPGruntWork(m_server, responsedata); | ||
312 | byContextDequeue(req); | ||
313 | } | ||
314 | catch (ObjectDisposedException) // Browser aborted before we could read body, server closed the stream | ||
315 | { | ||
316 | // Ignore it, no need to reply | ||
317 | } | ||
318 | return null; | ||
319 | }, null); | ||
320 | } | ||
321 | else | ||
322 | { | ||
323 | if ((Environment.TickCount - req.RequestTime) > req.PollServiceArgs.TimeOutms) | ||
324 | { | ||
274 | m_threadPool.QueueWorkItem(x => | 325 | m_threadPool.QueueWorkItem(x => |
275 | { | 326 | { |
276 | try | 327 | try |
277 | { | 328 | { |
278 | req.DoHTTPGruntWork(m_server, responsedata); | 329 | req.DoHTTPGruntWork(m_server, |
330 | req.PollServiceArgs.NoEvents(req.RequestID, req.PollServiceArgs.Id)); | ||
279 | byContextDequeue(req); | 331 | byContextDequeue(req); |
280 | } | 332 | } |
281 | catch (ObjectDisposedException) // Browser aborted before we could read body, server closed the stream | 333 | catch (ObjectDisposedException) |
282 | { | 334 | { |
283 | // Ignore it, no need to reply | 335 | // Ignore it, no need to reply |
284 | } | 336 | } |
@@ -287,36 +339,15 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
287 | } | 339 | } |
288 | else | 340 | else |
289 | { | 341 | { |
290 | if ((Environment.TickCount - req.RequestTime) > req.PollServiceArgs.TimeOutms) | 342 | ReQueueEvent(req); |
291 | { | ||
292 | m_threadPool.QueueWorkItem(x => | ||
293 | { | ||
294 | try | ||
295 | { | ||
296 | req.DoHTTPGruntWork(m_server, | ||
297 | req.PollServiceArgs.NoEvents(req.RequestID, req.PollServiceArgs.Id)); | ||
298 | byContextDequeue(req); | ||
299 | } | ||
300 | catch (ObjectDisposedException) | ||
301 | { | ||
302 | // Ignore it, no need to reply | ||
303 | } | ||
304 | return null; | ||
305 | }, null); | ||
306 | } | ||
307 | else | ||
308 | { | ||
309 | ReQueueEvent(req); | ||
310 | } | ||
311 | } | 343 | } |
312 | } | 344 | } |
313 | catch (Exception e) | 345 | } |
314 | { | 346 | catch (Exception e) |
315 | m_log.ErrorFormat("Exception in poll service thread: " + e.ToString()); | 347 | { |
316 | } | 348 | m_log.ErrorFormat("Exception in poll service thread: " + e.ToString()); |
317 | } | 349 | } |
318 | } | 350 | } |
319 | } | 351 | } |
320 | |||
321 | } | 352 | } |
322 | } | 353 | } |