diff options
Diffstat (limited to 'OpenSim/Region/CoreModules/Scripting/LSLHttp')
-rw-r--r-- | OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs | 159 |
1 files changed, 106 insertions, 53 deletions
diff --git a/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs b/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs index 61afc76..56c3c7d 100644 --- a/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs +++ b/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs | |||
@@ -61,6 +61,7 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp | |||
61 | //public ManualResetEvent ev; | 61 | //public ManualResetEvent ev; |
62 | public bool requestDone; | 62 | public bool requestDone; |
63 | public int startTime; | 63 | public int startTime; |
64 | public bool responseSent; | ||
64 | public string uri; | 65 | public string uri; |
65 | } | 66 | } |
66 | 67 | ||
@@ -79,7 +80,7 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp | |||
79 | /// <summary> | 80 | /// <summary> |
80 | /// Maximum number of external urls that can be set up by this module. | 81 | /// Maximum number of external urls that can be set up by this module. |
81 | /// </summary> | 82 | /// </summary> |
82 | private int m_TotalUrls = 100; | 83 | private int m_TotalUrls = 5000; |
83 | 84 | ||
84 | private uint https_port = 0; | 85 | private uint https_port = 0; |
85 | private IHttpServer m_HttpServer = null; | 86 | private IHttpServer m_HttpServer = null; |
@@ -169,7 +170,7 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp | |||
169 | engine.PostScriptEvent(itemID, "http_request", new Object[] { urlcode.ToString(), "URL_REQUEST_DENIED", "" }); | 170 | engine.PostScriptEvent(itemID, "http_request", new Object[] { urlcode.ToString(), "URL_REQUEST_DENIED", "" }); |
170 | return urlcode; | 171 | return urlcode; |
171 | } | 172 | } |
172 | string url = "http://" + m_ExternalHostNameForLSL + ":" + m_HttpServer.Port.ToString() + "/lslhttp/" + urlcode.ToString() + "/"; | 173 | string url = "http://" + m_ExternalHostNameForLSL + ":" + m_HttpServer.Port.ToString() + "/lslhttp/" + urlcode.ToString(); |
173 | 174 | ||
174 | UrlData urlData = new UrlData(); | 175 | UrlData urlData = new UrlData(); |
175 | urlData.hostID = host.UUID; | 176 | urlData.hostID = host.UUID; |
@@ -178,10 +179,10 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp | |||
178 | urlData.url = url; | 179 | urlData.url = url; |
179 | urlData.urlcode = urlcode; | 180 | urlData.urlcode = urlcode; |
180 | urlData.requests = new Dictionary<UUID, RequestData>(); | 181 | urlData.requests = new Dictionary<UUID, RequestData>(); |
181 | 182 | ||
182 | m_UrlMap[url] = urlData; | 183 | m_UrlMap[url] = urlData; |
183 | 184 | ||
184 | string uri = "/lslhttp/" + urlcode.ToString() + "/"; | 185 | string uri = "/lslhttp/" + urlcode.ToString(); |
185 | 186 | ||
186 | m_HttpServer.AddPollServiceHTTPHandler( | 187 | m_HttpServer.AddPollServiceHTTPHandler( |
187 | uri, | 188 | uri, |
@@ -254,12 +255,15 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp | |||
254 | return; | 255 | return; |
255 | } | 256 | } |
256 | 257 | ||
257 | foreach (UUID req in data.requests.Keys) | 258 | lock (m_RequestMap) |
258 | m_RequestMap.Remove(req); | 259 | { |
259 | 260 | foreach (UUID req in data.requests.Keys) | |
260 | m_log.DebugFormat( | 261 | m_RequestMap.Remove(req); |
261 | "[URL MODULE]: Releasing url {0} for {1} in {2}", | 262 | } |
262 | url, data.itemID, data.hostID); | 263 | |
264 | // m_log.DebugFormat( | ||
265 | // "[URL MODULE]: Releasing url {0} for {1} in {2}", | ||
266 | // url, data.itemID, data.hostID); | ||
263 | 267 | ||
264 | RemoveUrl(data); | 268 | RemoveUrl(data); |
265 | m_UrlMap.Remove(url); | 269 | m_UrlMap.Remove(url); |
@@ -268,32 +272,42 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp | |||
268 | 272 | ||
269 | public void HttpResponse(UUID request, int status, string body) | 273 | public void HttpResponse(UUID request, int status, string body) |
270 | { | 274 | { |
271 | if (m_RequestMap.ContainsKey(request)) | 275 | lock (m_RequestMap) |
272 | { | ||
273 | UrlData urlData = m_RequestMap[request]; | ||
274 | urlData.requests[request].responseCode = status; | ||
275 | urlData.requests[request].responseBody = body; | ||
276 | //urlData.requests[request].ev.Set(); | ||
277 | urlData.requests[request].requestDone =true; | ||
278 | } | ||
279 | else | ||
280 | { | 276 | { |
281 | m_log.Info("[HttpRequestHandler] There is no http-in request with id " + request.ToString()); | 277 | if (m_RequestMap.ContainsKey(request)) |
278 | { | ||
279 | UrlData urlData = m_RequestMap[request]; | ||
280 | if (!urlData.requests[request].responseSent) | ||
281 | { | ||
282 | urlData.requests[request].responseCode = status; | ||
283 | urlData.requests[request].responseBody = body; | ||
284 | //urlData.requests[request].ev.Set(); | ||
285 | urlData.requests[request].requestDone = true; | ||
286 | urlData.requests[request].responseSent = true; | ||
287 | } | ||
288 | } | ||
289 | else | ||
290 | { | ||
291 | m_log.Info("[HttpRequestHandler] There is no http-in request with id " + request.ToString()); | ||
292 | } | ||
282 | } | 293 | } |
283 | } | 294 | } |
284 | 295 | ||
285 | public string GetHttpHeader(UUID requestId, string header) | 296 | public string GetHttpHeader(UUID requestId, string header) |
286 | { | 297 | { |
287 | if (m_RequestMap.ContainsKey(requestId)) | 298 | lock (m_RequestMap) |
288 | { | ||
289 | UrlData urlData=m_RequestMap[requestId]; | ||
290 | string value; | ||
291 | if (urlData.requests[requestId].headers.TryGetValue(header,out value)) | ||
292 | return value; | ||
293 | } | ||
294 | else | ||
295 | { | 299 | { |
296 | m_log.Warn("[HttpRequestHandler] There was no http-in request with id " + requestId); | 300 | if (m_RequestMap.ContainsKey(requestId)) |
301 | { | ||
302 | UrlData urlData = m_RequestMap[requestId]; | ||
303 | string value; | ||
304 | if (urlData.requests[requestId].headers.TryGetValue(header, out value)) | ||
305 | return value; | ||
306 | } | ||
307 | else | ||
308 | { | ||
309 | m_log.Warn("[HttpRequestHandler] There was no http-in request with id " + requestId); | ||
310 | } | ||
297 | } | 311 | } |
298 | return String.Empty; | 312 | return String.Empty; |
299 | } | 313 | } |
@@ -317,8 +331,11 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp | |||
317 | { | 331 | { |
318 | RemoveUrl(url.Value); | 332 | RemoveUrl(url.Value); |
319 | removeURLs.Add(url.Key); | 333 | removeURLs.Add(url.Key); |
320 | foreach (UUID req in url.Value.requests.Keys) | 334 | lock (m_RequestMap) |
321 | m_RequestMap.Remove(req); | 335 | { |
336 | foreach (UUID req in url.Value.requests.Keys) | ||
337 | m_RequestMap.Remove(req); | ||
338 | } | ||
322 | } | 339 | } |
323 | } | 340 | } |
324 | 341 | ||
@@ -339,8 +356,11 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp | |||
339 | { | 356 | { |
340 | RemoveUrl(url.Value); | 357 | RemoveUrl(url.Value); |
341 | removeURLs.Add(url.Key); | 358 | removeURLs.Add(url.Key); |
342 | foreach (UUID req in url.Value.requests.Keys) | 359 | lock (m_RequestMap) |
343 | m_RequestMap.Remove(req); | 360 | { |
361 | foreach (UUID req in url.Value.requests.Keys) | ||
362 | m_RequestMap.Remove(req); | ||
363 | } | ||
344 | } | 364 | } |
345 | } | 365 | } |
346 | 366 | ||
@@ -359,14 +379,16 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp | |||
359 | { | 379 | { |
360 | Hashtable response = new Hashtable(); | 380 | Hashtable response = new Hashtable(); |
361 | UrlData url; | 381 | UrlData url; |
382 | int startTime = 0; | ||
362 | lock (m_RequestMap) | 383 | lock (m_RequestMap) |
363 | { | 384 | { |
364 | if (!m_RequestMap.ContainsKey(requestID)) | 385 | if (!m_RequestMap.ContainsKey(requestID)) |
365 | return response; | 386 | return response; |
366 | url = m_RequestMap[requestID]; | 387 | url = m_RequestMap[requestID]; |
388 | startTime = url.requests[requestID].startTime; | ||
367 | } | 389 | } |
368 | 390 | ||
369 | if (System.Environment.TickCount - url.requests[requestID].startTime > 25000) | 391 | if (System.Environment.TickCount - startTime > 25000) |
370 | { | 392 | { |
371 | response["int_response_code"] = 500; | 393 | response["int_response_code"] = 500; |
372 | response["str_response_string"] = "Script timeout"; | 394 | response["str_response_string"] = "Script timeout"; |
@@ -375,9 +397,12 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp | |||
375 | response["reusecontext"] = false; | 397 | response["reusecontext"] = false; |
376 | 398 | ||
377 | //remove from map | 399 | //remove from map |
378 | lock (url) | 400 | lock (url.requests) |
379 | { | 401 | { |
380 | url.requests.Remove(requestID); | 402 | url.requests.Remove(requestID); |
403 | } | ||
404 | lock (m_RequestMap) | ||
405 | { | ||
381 | m_RequestMap.Remove(requestID); | 406 | m_RequestMap.Remove(requestID); |
382 | } | 407 | } |
383 | 408 | ||
@@ -399,22 +424,25 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp | |||
399 | return false; | 424 | return false; |
400 | } | 425 | } |
401 | url = m_RequestMap[requestID]; | 426 | url = m_RequestMap[requestID]; |
427 | } | ||
428 | lock (url.requests) | ||
429 | { | ||
402 | if (!url.requests.ContainsKey(requestID)) | 430 | if (!url.requests.ContainsKey(requestID)) |
403 | { | 431 | { |
404 | return false; | 432 | return false; |
405 | } | 433 | } |
434 | else | ||
435 | { | ||
436 | if (System.Environment.TickCount - url.requests[requestID].startTime > 25000) | ||
437 | { | ||
438 | return true; | ||
439 | } | ||
440 | if (url.requests[requestID].requestDone) | ||
441 | return true; | ||
442 | else | ||
443 | return false; | ||
444 | } | ||
406 | } | 445 | } |
407 | |||
408 | if (System.Environment.TickCount-url.requests[requestID].startTime>25000) | ||
409 | { | ||
410 | return true; | ||
411 | } | ||
412 | |||
413 | if (url.requests[requestID].requestDone) | ||
414 | return true; | ||
415 | else | ||
416 | return false; | ||
417 | |||
418 | } | 446 | } |
419 | private Hashtable GetEvents(UUID requestID, UUID sessionID, string request) | 447 | private Hashtable GetEvents(UUID requestID, UUID sessionID, string request) |
420 | { | 448 | { |
@@ -426,9 +454,12 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp | |||
426 | if (!m_RequestMap.ContainsKey(requestID)) | 454 | if (!m_RequestMap.ContainsKey(requestID)) |
427 | return NoEvents(requestID,sessionID); | 455 | return NoEvents(requestID,sessionID); |
428 | url = m_RequestMap[requestID]; | 456 | url = m_RequestMap[requestID]; |
457 | } | ||
458 | lock (url.requests) | ||
459 | { | ||
429 | requestData = url.requests[requestID]; | 460 | requestData = url.requests[requestID]; |
430 | } | 461 | } |
431 | 462 | ||
432 | if (!requestData.requestDone) | 463 | if (!requestData.requestDone) |
433 | return NoEvents(requestID,sessionID); | 464 | return NoEvents(requestID,sessionID); |
434 | 465 | ||
@@ -451,14 +482,18 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp | |||
451 | response["reusecontext"] = false; | 482 | response["reusecontext"] = false; |
452 | 483 | ||
453 | //remove from map | 484 | //remove from map |
454 | lock (url) | 485 | lock (url.requests) |
455 | { | 486 | { |
456 | url.requests.Remove(requestID); | 487 | url.requests.Remove(requestID); |
488 | } | ||
489 | lock (m_RequestMap) | ||
490 | { | ||
457 | m_RequestMap.Remove(requestID); | 491 | m_RequestMap.Remove(requestID); |
458 | } | 492 | } |
459 | 493 | ||
460 | return response; | 494 | return response; |
461 | } | 495 | } |
496 | |||
462 | public void HttpRequestHandler(UUID requestID, Hashtable request) | 497 | public void HttpRequestHandler(UUID requestID, Hashtable request) |
463 | { | 498 | { |
464 | lock (request) | 499 | lock (request) |
@@ -474,8 +509,8 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp | |||
474 | 509 | ||
475 | int pos1 = uri.IndexOf("/");// /lslhttp | 510 | int pos1 = uri.IndexOf("/");// /lslhttp |
476 | int pos2 = uri.IndexOf("/", pos1 + 1);// /lslhttp/ | 511 | int pos2 = uri.IndexOf("/", pos1 + 1);// /lslhttp/ |
477 | int pos3 = uri.IndexOf("/", pos2 + 1);// /lslhttp/<UUID>/ | 512 | int pos3 = pos2 + 37; // /lslhttp/urlcode |
478 | string uri_tmp = uri.Substring(0, pos3 + 1); | 513 | string uri_tmp = uri.Substring(0, pos3); |
479 | //HTTP server code doesn't provide us with QueryStrings | 514 | //HTTP server code doesn't provide us with QueryStrings |
480 | string pathInfo; | 515 | string pathInfo; |
481 | string queryString; | 516 | string queryString; |
@@ -484,10 +519,21 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp | |||
484 | pathInfo = uri.Substring(pos3); | 519 | pathInfo = uri.Substring(pos3); |
485 | 520 | ||
486 | UrlData url = null; | 521 | UrlData url = null; |
522 | string urlkey; | ||
487 | if (!is_ssl) | 523 | if (!is_ssl) |
488 | url = m_UrlMap["http://" + m_ExternalHostNameForLSL + ":" + m_HttpServer.Port.ToString() + uri_tmp]; | 524 | urlkey = "http://" + m_ExternalHostNameForLSL + ":" + m_HttpServer.Port.ToString() + uri_tmp; |
525 | //m_UrlMap[]; | ||
489 | else | 526 | else |
490 | url = m_UrlMap["https://" + m_ExternalHostNameForLSL + ":" + m_HttpsServer.Port.ToString() + uri_tmp]; | 527 | urlkey = "https://" + m_ExternalHostNameForLSL + ":" + m_HttpsServer.Port.ToString() + uri_tmp; |
528 | |||
529 | if (m_UrlMap.ContainsKey(urlkey)) | ||
530 | { | ||
531 | url = m_UrlMap[urlkey]; | ||
532 | } | ||
533 | else | ||
534 | { | ||
535 | m_log.Warn("[HttpRequestHandler]: http-in request failed; no such url: "+urlkey.ToString()); | ||
536 | } | ||
491 | 537 | ||
492 | //for llGetHttpHeader support we need to store original URI here | 538 | //for llGetHttpHeader support we need to store original URI here |
493 | //to make x-path-info / x-query-string / x-script-url / x-remote-ip headers | 539 | //to make x-path-info / x-query-string / x-script-url / x-remote-ip headers |
@@ -517,7 +563,14 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp | |||
517 | if (request.ContainsKey(key)) | 563 | if (request.ContainsKey(key)) |
518 | { | 564 | { |
519 | string val = (String)request[key]; | 565 | string val = (String)request[key]; |
520 | queryString = queryString + key + "=" + val + "&"; | 566 | if (key != "") |
567 | { | ||
568 | queryString = queryString + key + "=" + val + "&"; | ||
569 | } | ||
570 | else | ||
571 | { | ||
572 | queryString = queryString + val + "&"; | ||
573 | } | ||
521 | } | 574 | } |
522 | } | 575 | } |
523 | if (queryString.Length > 1) | 576 | if (queryString.Length > 1) |