aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/CoreModules/Scripting/LSLHttp
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/CoreModules/Scripting/LSLHttp')
-rw-r--r--OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs159
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)