aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorJustin Clark-Casey (justincc)2013-07-15 23:22:39 +0100
committerJustin Clark-Casey (justincc)2013-07-15 23:27:46 +0100
commit1b7b664c8696531fec26378d1386362d8a3da55e (patch)
tree1bdf9c56b647c7d5fa47289ec8323c4d35ae09ca
parentReinsert PhysicsActor variable back into SOP.SubscribeForCollisionEvents() in... (diff)
downloadopensim-SC_OLD-1b7b664c8696531fec26378d1386362d8a3da55e.zip
opensim-SC_OLD-1b7b664c8696531fec26378d1386362d8a3da55e.tar.gz
opensim-SC_OLD-1b7b664c8696531fec26378d1386362d8a3da55e.tar.bz2
opensim-SC_OLD-1b7b664c8696531fec26378d1386362d8a3da55e.tar.xz
Add request received/handling stats for caps which are served by http poll handlers.
This adds explicit cap poll handler supporting to the Caps classes rather than relying on callers to do the complicated coding. Other refactoring was required to get logic into the right places to support this.
-rw-r--r--OpenSim/Capabilities/Caps.cs93
-rw-r--r--OpenSim/Framework/Console/RemoteConsole.cs2
-rw-r--r--OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs2
-rw-r--r--OpenSim/Framework/Servers/HttpServer/PollServiceEventArgs.cs14
-rw-r--r--OpenSim/Framework/Servers/HttpServer/PollServiceHttpRequest.cs45
-rw-r--r--OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs58
-rw-r--r--OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs13
-rw-r--r--OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs2
-rw-r--r--OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs66
-rw-r--r--OpenSim/Region/CoreModules/Framework/Caps/CapabilitiesModule.cs92
-rw-r--r--OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs6
11 files changed, 267 insertions, 126 deletions
diff --git a/OpenSim/Capabilities/Caps.cs b/OpenSim/Capabilities/Caps.cs
index 6c95d8b..bbf3b27 100644
--- a/OpenSim/Capabilities/Caps.cs
+++ b/OpenSim/Capabilities/Caps.cs
@@ -63,7 +63,11 @@ namespace OpenSim.Framework.Capabilities
63 public string CapsObjectPath { get { return m_capsObjectPath; } } 63 public string CapsObjectPath { get { return m_capsObjectPath; } }
64 64
65 private CapsHandlers m_capsHandlers; 65 private CapsHandlers m_capsHandlers;
66 private Dictionary<string, string> m_externalCapsHandlers; 66
67 private Dictionary<string, PollServiceEventArgs> m_pollServiceHandlers
68 = new Dictionary<string, PollServiceEventArgs>();
69
70 private Dictionary<string, string> m_externalCapsHandlers = new Dictionary<string, string>();
67 71
68 private IHttpServer m_httpListener; 72 private IHttpServer m_httpListener;
69 private UUID m_agentID; 73 private UUID m_agentID;
@@ -132,7 +136,6 @@ namespace OpenSim.Framework.Capabilities
132 136
133 m_agentID = agent; 137 m_agentID = agent;
134 m_capsHandlers = new CapsHandlers(httpServer, httpListen, httpPort, (httpServer == null) ? false : httpServer.UseSSL); 138 m_capsHandlers = new CapsHandlers(httpServer, httpListen, httpPort, (httpServer == null) ? false : httpServer.UseSSL);
135 m_externalCapsHandlers = new Dictionary<string, string>();
136 m_regionName = regionName; 139 m_regionName = regionName;
137 } 140 }
138 141
@@ -147,6 +150,27 @@ namespace OpenSim.Framework.Capabilities
147 m_capsHandlers[capName] = handler; 150 m_capsHandlers[capName] = handler;
148 } 151 }
149 152
153 public void RegisterPollHandler(string capName, PollServiceEventArgs pollServiceHandler)
154 {
155 m_pollServiceHandlers.Add(capName, pollServiceHandler);
156
157 m_httpListener.AddPollServiceHTTPHandler(pollServiceHandler.Url, pollServiceHandler);
158
159// uint port = (MainServer.Instance == null) ? 0 : MainServer.Instance.Port;
160// string protocol = "http";
161// string hostName = m_httpListenerHostName;
162//
163// if (MainServer.Instance.UseSSL)
164// {
165// hostName = MainServer.Instance.SSLCommonName;
166// port = MainServer.Instance.SSLPort;
167// protocol = "https";
168// }
169
170// RegisterHandler(
171// capName, String.Format("{0}://{1}:{2}{3}", protocol, hostName, port, pollServiceHandler.Url));
172 }
173
150 /// <summary> 174 /// <summary>
151 /// Register an external handler. The service for this capability is somewhere else 175 /// Register an external handler. The service for this capability is somewhere else
152 /// given by the URL. 176 /// given by the URL.
@@ -163,13 +187,70 @@ namespace OpenSim.Framework.Capabilities
163 /// </summary> 187 /// </summary>
164 public void DeregisterHandlers() 188 public void DeregisterHandlers()
165 { 189 {
166 if (m_capsHandlers != null) 190 foreach (string capsName in m_capsHandlers.Caps)
191 {
192 m_capsHandlers.Remove(capsName);
193 }
194
195 foreach (PollServiceEventArgs handler in m_pollServiceHandlers.Values)
196 {
197 m_httpListener.RemovePollServiceHTTPHandler("", handler.Url);
198 }
199 }
200
201 public bool TryGetPollHandler(string name, out PollServiceEventArgs pollHandler)
202 {
203 return m_pollServiceHandlers.TryGetValue(name, out pollHandler);
204 }
205
206 public Dictionary<string, PollServiceEventArgs> GetPollHandlers()
207 {
208 return new Dictionary<string, PollServiceEventArgs>(m_pollServiceHandlers);
209 }
210
211 /// <summary>
212 /// Return an LLSD-serializable Hashtable describing the
213 /// capabilities and their handler details.
214 /// </summary>
215 /// <param name="excludeSeed">If true, then exclude the seed cap.</param>
216 public Hashtable GetCapsDetails(bool excludeSeed, List<string> requestedCaps)
217 {
218 Hashtable caps = CapsHandlers.GetCapsDetails(excludeSeed, requestedCaps);
219
220 lock (m_pollServiceHandlers)
167 { 221 {
168 foreach (string capsName in m_capsHandlers.Caps) 222 foreach (KeyValuePair <string, PollServiceEventArgs> kvp in m_pollServiceHandlers)
169 { 223 {
170 m_capsHandlers.Remove(capsName); 224 if (!requestedCaps.Contains(kvp.Key))
225 continue;
226
227 string hostName = m_httpListenerHostName;
228 uint port = (MainServer.Instance == null) ? 0 : MainServer.Instance.Port;
229 string protocol = "http";
230
231 if (MainServer.Instance.UseSSL)
232 {
233 hostName = MainServer.Instance.SSLCommonName;
234 port = MainServer.Instance.SSLPort;
235 protocol = "https";
236 }
237 //
238 // caps.RegisterHandler("FetchInventoryDescendents2", String.Format("{0}://{1}:{2}{3}", protocol, hostName, port, capUrl));
239
240 caps[kvp.Key] = string.Format("{0}://{1}:{2}{3}", protocol, hostName, port, kvp.Value.Url);
171 } 241 }
172 } 242 }
243
244 // Add the external too
245 foreach (KeyValuePair<string, string> kvp in ExternalCapsHandlers)
246 {
247 if (!requestedCaps.Contains(kvp.Key))
248 continue;
249
250 caps[kvp.Key] = kvp.Value;
251 }
252
253 return caps;
173 } 254 }
174 } 255 }
175} 256} \ No newline at end of file
diff --git a/OpenSim/Framework/Console/RemoteConsole.cs b/OpenSim/Framework/Console/RemoteConsole.cs
index 3e3c2b3..8ad7b0d 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, HasEvents, GetEvents, NoEvents, sessionID,25000)); // 25 secs timeout 237 uri, new PollServiceEventArgs(null, uri, HasEvents, GetEvents, NoEvents, 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,
diff --git a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs
index 6863e0e..c4e569d 100644
--- a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs
+++ b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs
@@ -387,6 +387,8 @@ namespace OpenSim.Framework.Servers.HttpServer
387 387
388 if (TryGetPollServiceHTTPHandler(request.UriPath.ToString(), out psEvArgs)) 388 if (TryGetPollServiceHTTPHandler(request.UriPath.ToString(), out psEvArgs))
389 { 389 {
390 psEvArgs.RequestsReceived++;
391
390 PollServiceHttpRequest psreq = new PollServiceHttpRequest(psEvArgs, context, request); 392 PollServiceHttpRequest psreq = new PollServiceHttpRequest(psEvArgs, context, request);
391 393
392 if (psEvArgs.Request != null) 394 if (psEvArgs.Request != null)
diff --git a/OpenSim/Framework/Servers/HttpServer/PollServiceEventArgs.cs b/OpenSim/Framework/Servers/HttpServer/PollServiceEventArgs.cs
index 3079a7e..020bfd5 100644
--- a/OpenSim/Framework/Servers/HttpServer/PollServiceEventArgs.cs
+++ b/OpenSim/Framework/Servers/HttpServer/PollServiceEventArgs.cs
@@ -55,12 +55,26 @@ namespace OpenSim.Framework.Servers.HttpServer
55 Inventory = 2 55 Inventory = 2
56 } 56 }
57 57
58 public string Url { get; set; }
59
60 /// <summary>
61 /// Number of requests received for this poll service.
62 /// </summary>
63 public int RequestsReceived { get; set; }
64
65 /// <summary>
66 /// Number of requests handled by this poll service.
67 /// </summary>
68 public int RequestsHandled { get; set; }
69
58 public PollServiceEventArgs( 70 public PollServiceEventArgs(
59 RequestMethod pRequest, 71 RequestMethod pRequest,
72 string pUrl,
60 HasEventsMethod pHasEvents, GetEventsMethod pGetEvents, NoEventsMethod pNoEvents, 73 HasEventsMethod pHasEvents, GetEventsMethod pGetEvents, NoEventsMethod pNoEvents,
61 UUID pId, int pTimeOutms) 74 UUID pId, int pTimeOutms)
62 { 75 {
63 Request = pRequest; 76 Request = pRequest;
77 Url = pUrl;
64 HasEvents = pHasEvents; 78 HasEvents = pHasEvents;
65 GetEvents = pGetEvents; 79 GetEvents = pGetEvents;
66 NoEvents = pNoEvents; 80 NoEvents = pNoEvents;
diff --git a/OpenSim/Framework/Servers/HttpServer/PollServiceHttpRequest.cs b/OpenSim/Framework/Servers/HttpServer/PollServiceHttpRequest.cs
index 723530a..6aa9479 100644
--- a/OpenSim/Framework/Servers/HttpServer/PollServiceHttpRequest.cs
+++ b/OpenSim/Framework/Servers/HttpServer/PollServiceHttpRequest.cs
@@ -26,13 +26,19 @@
26 */ 26 */
27 27
28using System; 28using System;
29using System.Collections;
30using System.Reflection;
31using System.Text;
29using HttpServer; 32using HttpServer;
33using log4net;
30using OpenMetaverse; 34using OpenMetaverse;
31 35
32namespace OpenSim.Framework.Servers.HttpServer 36namespace OpenSim.Framework.Servers.HttpServer
33{ 37{
34 public class PollServiceHttpRequest 38 public class PollServiceHttpRequest
35 { 39 {
40 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
41
36 public readonly PollServiceEventArgs PollServiceArgs; 42 public readonly PollServiceEventArgs PollServiceArgs;
37 public readonly IHttpClientContext HttpContext; 43 public readonly IHttpClientContext HttpContext;
38 public readonly IHttpRequest Request; 44 public readonly IHttpRequest Request;
@@ -48,5 +54,44 @@ namespace OpenSim.Framework.Servers.HttpServer
48 RequestTime = System.Environment.TickCount; 54 RequestTime = System.Environment.TickCount;
49 RequestID = UUID.Random(); 55 RequestID = UUID.Random();
50 } 56 }
57
58 internal void DoHTTPGruntWork(BaseHttpServer server, Hashtable responsedata)
59 {
60 OSHttpResponse response
61 = new OSHttpResponse(new HttpResponse(HttpContext, Request), HttpContext);
62
63 byte[] buffer = server.DoHTTPGruntWork(responsedata, response);
64
65 response.SendChunked = false;
66 response.ContentLength64 = buffer.Length;
67 response.ContentEncoding = Encoding.UTF8;
68
69 try
70 {
71 response.OutputStream.Write(buffer, 0, buffer.Length);
72 }
73 catch (Exception ex)
74 {
75 m_log.Warn(string.Format("[POLL SERVICE WORKER THREAD]: Error ", ex));
76 }
77 finally
78 {
79 //response.OutputStream.Close();
80 try
81 {
82 response.OutputStream.Flush();
83 response.Send();
84
85 //if (!response.KeepAlive && response.ReuseContext)
86 // response.FreeContext();
87 }
88 catch (Exception e)
89 {
90 m_log.Warn(String.Format("[POLL SERVICE WORKER THREAD]: Error ", e));
91 }
92
93 PollServiceArgs.RequestsHandled++;
94 }
95 }
51 } 96 }
52} \ No newline at end of file 97} \ No newline at end of file
diff --git a/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs b/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs
index aee3e3c..1b9010a 100644
--- a/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs
+++ b/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs
@@ -157,8 +157,7 @@ namespace OpenSim.Framework.Servers.HttpServer
157 { 157 {
158 foreach (PollServiceHttpRequest req in m_retryRequests) 158 foreach (PollServiceHttpRequest req in m_retryRequests)
159 { 159 {
160 DoHTTPGruntWork(m_server,req, 160 req.DoHTTPGruntWork(m_server, req.PollServiceArgs.NoEvents(req.RequestID, req.PollServiceArgs.Id));
161 req.PollServiceArgs.NoEvents(req.RequestID, req.PollServiceArgs.Id));
162 } 161 }
163 } 162 }
164 catch 163 catch
@@ -179,8 +178,8 @@ namespace OpenSim.Framework.Servers.HttpServer
179 try 178 try
180 { 179 {
181 wreq = m_requests.Dequeue(0); 180 wreq = m_requests.Dequeue(0);
182 DoHTTPGruntWork(m_server,wreq, 181 wreq.DoHTTPGruntWork(
183 wreq.PollServiceArgs.NoEvents(wreq.RequestID, wreq.PollServiceArgs.Id)); 182 m_server, wreq.PollServiceArgs.NoEvents(wreq.RequestID, wreq.PollServiceArgs.Id));
184 } 183 }
185 catch 184 catch
186 { 185 {
@@ -214,7 +213,7 @@ namespace OpenSim.Framework.Servers.HttpServer
214 { 213 {
215 try 214 try
216 { 215 {
217 DoHTTPGruntWork(m_server, req, responsedata); 216 req.DoHTTPGruntWork(m_server, responsedata);
218 } 217 }
219 catch (ObjectDisposedException) // Browser aborted before we could read body, server closed the stream 218 catch (ObjectDisposedException) // Browser aborted before we could read body, server closed the stream
220 { 219 {
@@ -227,7 +226,7 @@ namespace OpenSim.Framework.Servers.HttpServer
227 { 226 {
228 try 227 try
229 { 228 {
230 DoHTTPGruntWork(m_server, req, responsedata); 229 req.DoHTTPGruntWork(m_server, responsedata);
231 } 230 }
232 catch (ObjectDisposedException) // Browser aborted before we could read body, server closed the stream 231 catch (ObjectDisposedException) // Browser aborted before we could read body, server closed the stream
233 { 232 {
@@ -242,8 +241,8 @@ namespace OpenSim.Framework.Servers.HttpServer
242 { 241 {
243 if ((Environment.TickCount - req.RequestTime) > req.PollServiceArgs.TimeOutms) 242 if ((Environment.TickCount - req.RequestTime) > req.PollServiceArgs.TimeOutms)
244 { 243 {
245 DoHTTPGruntWork(m_server, req, 244 req.DoHTTPGruntWork(
246 req.PollServiceArgs.NoEvents(req.RequestID, req.PollServiceArgs.Id)); 245 m_server, req.PollServiceArgs.NoEvents(req.RequestID, req.PollServiceArgs.Id));
247 } 246 }
248 else 247 else
249 { 248 {
@@ -258,46 +257,5 @@ namespace OpenSim.Framework.Servers.HttpServer
258 } 257 }
259 } 258 }
260 } 259 }
261
262 // DoHTTPGruntWork changed, not sending response
263 // do the same work around as core
264
265 internal static void DoHTTPGruntWork(BaseHttpServer server, PollServiceHttpRequest req, Hashtable responsedata)
266 {
267 OSHttpResponse response
268 = new OSHttpResponse(new HttpResponse(req.HttpContext, req.Request), req.HttpContext);
269
270 byte[] buffer = server.DoHTTPGruntWork(responsedata, response);
271
272 response.SendChunked = false;
273 response.ContentLength64 = buffer.Length;
274 response.ContentEncoding = Encoding.UTF8;
275
276 try
277 {
278 response.OutputStream.Write(buffer, 0, buffer.Length);
279 }
280 catch (Exception ex)
281 {
282 m_log.Warn(string.Format("[POLL SERVICE WORKER THREAD]: Error ", ex));
283 }
284 finally
285 {
286 //response.OutputStream.Close();
287 try
288 {
289 response.OutputStream.Flush();
290 response.Send();
291
292 //if (!response.KeepAlive && response.ReuseContext)
293 // response.FreeContext();
294 }
295 catch (Exception e)
296 {
297 m_log.Warn(String.Format("[POLL SERVICE WORKER THREAD]: Error ", e));
298 }
299 }
300 }
301 } 260 }
302} 261} \ No newline at end of file
303
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs
index 5c6bc1c..1d4c7f0 100644
--- a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs
+++ b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs
@@ -285,18 +285,7 @@ namespace OpenSim.Region.ClientStack.Linden
285 foreach (OSD c in capsRequested) 285 foreach (OSD c in capsRequested)
286 validCaps.Add(c.AsString()); 286 validCaps.Add(c.AsString());
287 287
288 Hashtable caps = m_HostCapsObj.CapsHandlers.GetCapsDetails(true, validCaps); 288 string result = LLSDHelpers.SerialiseLLSDReply(m_HostCapsObj.GetCapsDetails(true, validCaps));
289
290 // Add the external too
291 foreach (KeyValuePair<string, string> kvp in m_HostCapsObj.ExternalCapsHandlers)
292 {
293 if (!validCaps.Contains(kvp.Key))
294 continue;
295
296 caps[kvp.Key] = kvp.Value;
297 }
298
299 string result = LLSDHelpers.SerialiseLLSDReply(caps);
300 289
301 //m_log.DebugFormat("[CAPS] CapsRequest {0}", result); 290 //m_log.DebugFormat("[CAPS] CapsRequest {0}", result);
302 291
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs
index 50bfda1..ca38a97 100644
--- a/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs
+++ b/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs
@@ -377,7 +377,7 @@ namespace OpenSim.Region.ClientStack.Linden
377 // TODO: Add EventQueueGet name/description for diagnostics 377 // TODO: Add EventQueueGet name/description for diagnostics
378 MainServer.Instance.AddPollServiceHTTPHandler( 378 MainServer.Instance.AddPollServiceHTTPHandler(
379 eventQueueGetPath, 379 eventQueueGetPath,
380 new PollServiceEventArgs(null, HasEvents, GetEvents, NoEvents, agentID, 40000)); 380 new PollServiceEventArgs(null, eventQueueGetPath, HasEvents, GetEvents, NoEvents, agentID, 40000));
381 381
382// m_log.DebugFormat( 382// m_log.DebugFormat(
383// "[EVENT QUEUE GET MODULE]: Registered EQG handler {0} for {1} in {2}", 383// "[EVENT QUEUE GET MODULE]: Registered EQG handler {0} for {1} in {2}",
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs
index b90df17..86a0298 100644
--- a/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs
+++ b/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs
@@ -77,7 +77,6 @@ namespace OpenSim.Region.ClientStack.Linden
77 77
78 private static WebFetchInvDescHandler m_webFetchHandler; 78 private static WebFetchInvDescHandler m_webFetchHandler;
79 79
80 private Dictionary<UUID, string> m_capsDict = new Dictionary<UUID, string>();
81 private static Thread[] m_workerThreads = null; 80 private static Thread[] m_workerThreads = null;
82 81
83 private static DoubleQueue<aPollRequest> m_queue = 82 private static DoubleQueue<aPollRequest> m_queue =
@@ -114,7 +113,6 @@ namespace OpenSim.Region.ClientStack.Linden
114 return; 113 return;
115 114
116 m_scene.EventManager.OnRegisterCaps -= RegisterCaps; 115 m_scene.EventManager.OnRegisterCaps -= RegisterCaps;
117 m_scene.EventManager.OnDeregisterCaps -= DeregisterCaps;
118 116
119 foreach (Thread t in m_workerThreads) 117 foreach (Thread t in m_workerThreads)
120 Watchdog.AbortThread(t.ManagedThreadId); 118 Watchdog.AbortThread(t.ManagedThreadId);
@@ -134,7 +132,6 @@ namespace OpenSim.Region.ClientStack.Linden
134 m_webFetchHandler = new WebFetchInvDescHandler(m_InventoryService, m_LibraryService); 132 m_webFetchHandler = new WebFetchInvDescHandler(m_InventoryService, m_LibraryService);
135 133
136 m_scene.EventManager.OnRegisterCaps += RegisterCaps; 134 m_scene.EventManager.OnRegisterCaps += RegisterCaps;
137 m_scene.EventManager.OnDeregisterCaps += DeregisterCaps;
138 135
139 if (m_workerThreads == null) 136 if (m_workerThreads == null)
140 { 137 {
@@ -177,8 +174,8 @@ namespace OpenSim.Region.ClientStack.Linden
177 174
178 private Scene m_scene; 175 private Scene m_scene;
179 176
180 public PollServiceInventoryEventArgs(Scene scene, UUID pId) : 177 public PollServiceInventoryEventArgs(Scene scene, string url, UUID pId) :
181 base(null, null, null, null, pId, int.MaxValue) 178 base(null, url, null, null, null, pId, int.MaxValue)
182 { 179 {
183 m_scene = scene; 180 m_scene = scene;
184 181
@@ -308,40 +305,39 @@ namespace OpenSim.Region.ClientStack.Linden
308 if (m_fetchInventoryDescendents2Url == "") 305 if (m_fetchInventoryDescendents2Url == "")
309 return; 306 return;
310 307
311 string capUrl = "/CAPS/" + UUID.Random() + "/";
312
313 // Register this as a poll service 308 // Register this as a poll service
314 PollServiceInventoryEventArgs args = new PollServiceInventoryEventArgs(m_scene, agentID); 309 PollServiceInventoryEventArgs args
315 310 = new PollServiceInventoryEventArgs(m_scene, "/CAPS/" + UUID.Random() + "/", agentID);
316 args.Type = PollServiceEventArgs.EventType.Inventory; 311 args.Type = PollServiceEventArgs.EventType.Inventory;
317 MainServer.Instance.AddPollServiceHTTPHandler(capUrl, args);
318
319 string hostName = m_scene.RegionInfo.ExternalHostName;
320 uint port = (MainServer.Instance == null) ? 0 : MainServer.Instance.Port;
321 string protocol = "http";
322
323 if (MainServer.Instance.UseSSL)
324 {
325 hostName = MainServer.Instance.SSLCommonName;
326 port = MainServer.Instance.SSLPort;
327 protocol = "https";
328 }
329
330 caps.RegisterHandler("FetchInventoryDescendents2", String.Format("{0}://{1}:{2}{3}", protocol, hostName, port, capUrl));
331 312
332 m_capsDict[agentID] = capUrl; 313 caps.RegisterPollHandler("FetchInventoryDescendents2", args);
314
315// MainServer.Instance.AddPollServiceHTTPHandler(capUrl, args);
316//
317// string hostName = m_scene.RegionInfo.ExternalHostName;
318// uint port = (MainServer.Instance == null) ? 0 : MainServer.Instance.Port;
319// string protocol = "http";
320//
321// if (MainServer.Instance.UseSSL)
322// {
323// hostName = MainServer.Instance.SSLCommonName;
324// port = MainServer.Instance.SSLPort;
325// protocol = "https";
326// }
327//
328// caps.RegisterHandler("FetchInventoryDescendents2", String.Format("{0}://{1}:{2}{3}", protocol, hostName, port, capUrl));
333 } 329 }
334 330
335 private void DeregisterCaps(UUID agentID, Caps caps) 331// private void DeregisterCaps(UUID agentID, Caps caps)
336 { 332// {
337 string capUrl; 333// string capUrl;
338 334//
339 if (m_capsDict.TryGetValue(agentID, out capUrl)) 335// if (m_capsDict.TryGetValue(agentID, out capUrl))
340 { 336// {
341 MainServer.Instance.RemoveHTTPHandler("", capUrl); 337// MainServer.Instance.RemoveHTTPHandler("", capUrl);
342 m_capsDict.Remove(agentID); 338// m_capsDict.Remove(agentID);
343 } 339// }
344 } 340// }
345 341
346 private void DoInventoryRequests() 342 private void DoInventoryRequests()
347 { 343 {
@@ -355,4 +351,4 @@ namespace OpenSim.Region.ClientStack.Linden
355 } 351 }
356 } 352 }
357 } 353 }
358} 354} \ No newline at end of file
diff --git a/OpenSim/Region/CoreModules/Framework/Caps/CapabilitiesModule.cs b/OpenSim/Region/CoreModules/Framework/Caps/CapabilitiesModule.cs
index bd60611..ad1c4ce 100644
--- a/OpenSim/Region/CoreModules/Framework/Caps/CapabilitiesModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/Caps/CapabilitiesModule.cs
@@ -80,7 +80,7 @@ namespace OpenSim.Region.CoreModules.Framework
80 80
81 MainConsole.Instance.Commands.AddCommand( 81 MainConsole.Instance.Commands.AddCommand(
82 "Comms", false, "show caps stats by user", 82 "Comms", false, "show caps stats by user",
83 "show caps stats [<first-name> <last-name>]", 83 "show caps stats by user [<first-name> <last-name>]",
84 "Shows statistics on capabilities use by user.", 84 "Shows statistics on capabilities use by user.",
85 "If a user name is given, then prints a detailed breakdown of caps use ordered by number of requests received.", 85 "If a user name is given, then prints a detailed breakdown of caps use ordered by number of requests received.",
86 HandleShowCapsStatsByUserCommand); 86 HandleShowCapsStatsByUserCommand);
@@ -285,27 +285,31 @@ namespace OpenSim.Region.CoreModules.Framework
285 if (SceneManager.Instance.CurrentScene != null && SceneManager.Instance.CurrentScene != m_scene) 285 if (SceneManager.Instance.CurrentScene != null && SceneManager.Instance.CurrentScene != m_scene)
286 return; 286 return;
287 287
288 StringBuilder caps = new StringBuilder(); 288 StringBuilder capsReport = new StringBuilder();
289 caps.AppendFormat("Region {0}:\n", m_scene.RegionInfo.RegionName); 289 capsReport.AppendFormat("Region {0}:\n", m_scene.RegionInfo.RegionName);
290 290
291 lock (m_capsObjects) 291 lock (m_capsObjects)
292 { 292 {
293 foreach (KeyValuePair<UUID, Caps> kvp in m_capsObjects) 293 foreach (KeyValuePair<UUID, Caps> kvp in m_capsObjects)
294 { 294 {
295 caps.AppendFormat("** User {0}:\n", kvp.Key); 295 capsReport.AppendFormat("** User {0}:\n", kvp.Key);
296 Caps caps = kvp.Value;
296 297
297 for (IDictionaryEnumerator kvp2 = kvp.Value.CapsHandlers.GetCapsDetails(false, null).GetEnumerator(); kvp2.MoveNext(); ) 298 for (IDictionaryEnumerator kvp2 = caps.CapsHandlers.GetCapsDetails(false, null).GetEnumerator(); kvp2.MoveNext(); )
298 { 299 {
299 Uri uri = new Uri(kvp2.Value.ToString()); 300 Uri uri = new Uri(kvp2.Value.ToString());
300 caps.AppendFormat(m_showCapsCommandFormat, kvp2.Key, uri.PathAndQuery); 301 capsReport.AppendFormat(m_showCapsCommandFormat, kvp2.Key, uri.PathAndQuery);
301 } 302 }
302 303
303 foreach (KeyValuePair<string, string> kvp3 in kvp.Value.ExternalCapsHandlers) 304 foreach (KeyValuePair<string, PollServiceEventArgs> kvp2 in caps.GetPollHandlers())
304 caps.AppendFormat(m_showCapsCommandFormat, kvp3.Key, kvp3.Value); 305 capsReport.AppendFormat(m_showCapsCommandFormat, kvp2.Key, kvp2.Value.Url);
306
307 foreach (KeyValuePair<string, string> kvp3 in caps.ExternalCapsHandlers)
308 capsReport.AppendFormat(m_showCapsCommandFormat, kvp3.Key, kvp3.Value);
305 } 309 }
306 } 310 }
307 311
308 MainConsole.Instance.Output(caps.ToString()); 312 MainConsole.Instance.Output(capsReport.ToString());
309 } 313 }
310 314
311 private void HandleShowCapsStatsByCapCommand(string module, string[] cmdParams) 315 private void HandleShowCapsStatsByCapCommand(string module, string[] cmdParams)
@@ -362,7 +366,16 @@ namespace OpenSim.Region.CoreModules.Framework
362 { 366 {
363 receivedStats[sp.Name] = reqHandler.RequestsReceived; 367 receivedStats[sp.Name] = reqHandler.RequestsReceived;
364 handledStats[sp.Name] = reqHandler.RequestsHandled; 368 handledStats[sp.Name] = reqHandler.RequestsHandled;
365 } 369 }
370 else
371 {
372 PollServiceEventArgs pollHandler = null;
373 if (caps.TryGetPollHandler(capName, out pollHandler))
374 {
375 receivedStats[sp.Name] = pollHandler.RequestsReceived;
376 handledStats[sp.Name] = pollHandler.RequestsHandled;
377 }
378 }
366 } 379 }
367 ); 380 );
368 381
@@ -391,11 +404,9 @@ namespace OpenSim.Region.CoreModules.Framework
391 Caps caps = m_scene.CapsModule.GetCapsForUser(sp.UUID); 404 Caps caps = m_scene.CapsModule.GetCapsForUser(sp.UUID);
392 405
393 if (caps == null) 406 if (caps == null)
394 return; 407 return;
395
396 Dictionary<string, IRequestHandler> capsHandlers = caps.CapsHandlers.GetCapsHandlers();
397 408
398 foreach (IRequestHandler reqHandler in capsHandlers.Values) 409 foreach (IRequestHandler reqHandler in caps.CapsHandlers.GetCapsHandlers().Values)
399 { 410 {
400 string reqName = reqHandler.Name ?? ""; 411 string reqName = reqHandler.Name ?? "";
401 412
@@ -410,6 +421,23 @@ namespace OpenSim.Region.CoreModules.Framework
410 handledStats[reqName] += reqHandler.RequestsHandled; 421 handledStats[reqName] += reqHandler.RequestsHandled;
411 } 422 }
412 } 423 }
424
425 foreach (KeyValuePair<string, PollServiceEventArgs> kvp in caps.GetPollHandlers())
426 {
427 string name = kvp.Key;
428 PollServiceEventArgs pollHandler = kvp.Value;
429
430 if (!receivedStats.ContainsKey(name))
431 {
432 receivedStats[name] = pollHandler.RequestsReceived;
433 handledStats[name] = pollHandler.RequestsHandled;
434 }
435 else
436 {
437 receivedStats[name] += pollHandler.RequestsReceived;
438 handledStats[name] += pollHandler.RequestsHandled;
439 }
440 }
413 } 441 }
414 ); 442 );
415 443
@@ -468,12 +496,16 @@ namespace OpenSim.Region.CoreModules.Framework
468 if (caps == null) 496 if (caps == null)
469 return; 497 return;
470 498
471 Dictionary<string, IRequestHandler> capsHandlers = caps.CapsHandlers.GetCapsHandlers(); 499 List<CapTableRow> capRows = new List<CapTableRow>();
472 500
473 foreach (IRequestHandler reqHandler in capsHandlers.Values.OrderByDescending(rh => rh.RequestsReceived)) 501 foreach (IRequestHandler reqHandler in caps.CapsHandlers.GetCapsHandlers().Values)
474 { 502 capRows.Add(new CapTableRow(reqHandler.Name, reqHandler.RequestsReceived, reqHandler.RequestsHandled));
475 cdt.AddRow(reqHandler.Name, reqHandler.RequestsReceived, reqHandler.RequestsHandled); 503
476 } 504 foreach (KeyValuePair<string, PollServiceEventArgs> kvp in caps.GetPollHandlers())
505 capRows.Add(new CapTableRow(kvp.Key, kvp.Value.RequestsReceived, kvp.Value.RequestsHandled));
506
507 foreach (CapTableRow ctr in capRows.OrderByDescending(ctr => ctr.RequestsReceived))
508 cdt.AddRow(ctr.Name, ctr.RequestsReceived, ctr.RequestsHandled);
477 509
478 sb.Append(cdt.ToString()); 510 sb.Append(cdt.ToString());
479 } 511 }
@@ -505,6 +537,14 @@ namespace OpenSim.Region.CoreModules.Framework
505 totalRequestsReceived += reqHandler.RequestsReceived; 537 totalRequestsReceived += reqHandler.RequestsReceived;
506 totalRequestsHandled += reqHandler.RequestsHandled; 538 totalRequestsHandled += reqHandler.RequestsHandled;
507 } 539 }
540
541 Dictionary<string, PollServiceEventArgs> capsPollHandlers = caps.GetPollHandlers();
542
543 foreach (PollServiceEventArgs handler in capsPollHandlers.Values)
544 {
545 totalRequestsReceived += handler.RequestsReceived;
546 totalRequestsHandled += handler.RequestsHandled;
547 }
508 548
509 cdt.AddRow(sp.Name, sp.IsChildAgent ? "child" : "root", totalRequestsReceived, totalRequestsHandled); 549 cdt.AddRow(sp.Name, sp.IsChildAgent ? "child" : "root", totalRequestsReceived, totalRequestsHandled);
510 } 550 }
@@ -512,5 +552,19 @@ namespace OpenSim.Region.CoreModules.Framework
512 552
513 sb.Append(cdt.ToString()); 553 sb.Append(cdt.ToString());
514 } 554 }
555
556 private class CapTableRow
557 {
558 public string Name { get; set; }
559 public int RequestsReceived { get; set; }
560 public int RequestsHandled { get; set; }
561
562 public CapTableRow(string name, int requestsReceived, int requestsHandled)
563 {
564 Name = name;
565 RequestsReceived = requestsReceived;
566 RequestsHandled = requestsHandled;
567 }
568 }
515 } 569 }
516} \ No newline at end of file 570} \ No newline at end of file
diff --git a/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs b/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs
index def8162..99a3122 100644
--- a/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs
+++ b/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs
@@ -235,7 +235,8 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
235 235
236 string uri = "/lslhttp/" + urlcode.ToString() + "/"; 236 string uri = "/lslhttp/" + urlcode.ToString() + "/";
237 237
238 PollServiceEventArgs args = new PollServiceEventArgs(HttpRequestHandler, HasEvents, GetEvents, NoEvents, urlcode, 25000); 238 PollServiceEventArgs args
239 = new PollServiceEventArgs(HttpRequestHandler, uri, HasEvents, GetEvents, NoEvents, urlcode, 25000);
239 args.Type = PollServiceEventArgs.EventType.LslHttp; 240 args.Type = PollServiceEventArgs.EventType.LslHttp;
240 m_HttpServer.AddPollServiceHTTPHandler(uri, args); 241 m_HttpServer.AddPollServiceHTTPHandler(uri, args);
241 242
@@ -280,7 +281,8 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
280 281
281 string uri = "/lslhttps/" + urlcode.ToString() + "/"; 282 string uri = "/lslhttps/" + urlcode.ToString() + "/";
282 283
283 PollServiceEventArgs args = new PollServiceEventArgs(HttpRequestHandler, HasEvents, GetEvents, NoEvents, urlcode, 25000); 284 PollServiceEventArgs args
285 = new PollServiceEventArgs(HttpRequestHandler, uri, HasEvents, GetEvents, NoEvents, urlcode, 25000);
284 args.Type = PollServiceEventArgs.EventType.LslHttp; 286 args.Type = PollServiceEventArgs.EventType.LslHttp;
285 m_HttpsServer.AddPollServiceHTTPHandler(uri, args); 287 m_HttpsServer.AddPollServiceHTTPHandler(uri, args);
286 288