aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs')
-rw-r--r--OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs483
1 files changed, 241 insertions, 242 deletions
diff --git a/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs b/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs
index 2d81e4c..b885420 100644
--- a/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs
+++ b/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs
@@ -54,12 +54,12 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
54 { 54 {
55 public UUID requestID; 55 public UUID requestID;
56 public Dictionary<string, string> headers; 56 public Dictionary<string, string> headers;
57 public string body; 57 public string body;
58 public int responseCode; 58 public int responseCode;
59 public string responseBody; 59 public string responseBody;
60 public ManualResetEvent ev; 60 public ManualResetEvent ev;
61 public bool requestDone; 61 public bool requestDone;
62 public int startTime; 62 public int startTime;
63 public string uri; 63 public string uri;
64 } 64 }
65 65
@@ -73,23 +73,23 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
73 new Dictionary<UUID, UrlData>(); 73 new Dictionary<UUID, UrlData>();
74 74
75 private Dictionary<string, UrlData> m_UrlMap = 75 private Dictionary<string, UrlData> m_UrlMap =
76 new Dictionary<string, UrlData>(); 76 new Dictionary<string, UrlData>();
77 77
78 78
79 private int m_TotalUrls = 100; 79 private int m_TotalUrls = 100;
80 80
81 private IHttpServer m_HttpServer = null; 81 private IHttpServer m_HttpServer = null;
82 82
83 private string m_ExternalHostNameForLSL = ""; 83 private string m_ExternalHostNameForLSL = "";
84 84
85 public Type ReplaceableInterface 85 public Type ReplaceableInterface
86 { 86 {
87 get { return null; } 87 get { return null; }
88 } 88 }
89 89
90 private Hashtable HandleHttpPoll(Hashtable request) 90 private Hashtable HandleHttpPoll(Hashtable request)
91 { 91 {
92 return new Hashtable(); 92 return new Hashtable();
93 } 93 }
94 94
95 public string Name 95 public string Name
@@ -98,7 +98,7 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
98 } 98 }
99 99
100 public void Initialise(IConfigSource config) 100 public void Initialise(IConfigSource config)
101 { 101 {
102 m_ExternalHostNameForLSL = config.Configs["Network"].GetString("ExternalHostNameForLSL", System.Environment.MachineName); 102 m_ExternalHostNameForLSL = config.Configs["Network"].GetString("ExternalHostNameForLSL", System.Environment.MachineName);
103 } 103 }
104 104
@@ -130,7 +130,7 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
130 130
131 public void Close() 131 public void Close()
132 { 132 {
133 } 133 }
134 public UUID RequestURL(IScriptModule engine, SceneObjectPart host, UUID itemID) 134 public UUID RequestURL(IScriptModule engine, SceneObjectPart host, UUID itemID)
135 { 135 {
136 UUID urlcode = UUID.Random(); 136 UUID urlcode = UUID.Random();
@@ -141,8 +141,8 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
141 { 141 {
142 engine.PostScriptEvent(itemID, "http_request", new Object[] { urlcode.ToString(), "URL_REQUEST_DENIED", "" }); 142 engine.PostScriptEvent(itemID, "http_request", new Object[] { urlcode.ToString(), "URL_REQUEST_DENIED", "" });
143 return urlcode; 143 return urlcode;
144 } 144 }
145 string url = "http://" + m_ExternalHostNameForLSL + ":" + m_HttpServer.Port.ToString() + "/lslhttp/" + urlcode.ToString() + "/"; 145 string url = "http://" + m_ExternalHostNameForLSL + ":" + m_HttpServer.Port.ToString() + "/lslhttp/" + urlcode.ToString() + "/";
146 146
147 UrlData urlData = new UrlData(); 147 UrlData urlData = new UrlData();
148 urlData.hostID = host.UUID; 148 urlData.hostID = host.UUID;
@@ -152,14 +152,14 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
152 urlData.urlcode = urlcode; 152 urlData.urlcode = urlcode;
153 urlData.requests = new Dictionary<UUID, RequestData>(); 153 urlData.requests = new Dictionary<UUID, RequestData>();
154 154
155 155
156 m_UrlMap[url] = urlData; 156 m_UrlMap[url] = urlData;
157 157
158 string uri = "/lslhttp/" + urlcode.ToString() + "/"; 158 string uri = "/lslhttp/" + urlcode.ToString() + "/";
159 159
160 m_HttpServer.AddPollServiceHTTPHandler(uri,HandleHttpPoll, 160 m_HttpServer.AddPollServiceHTTPHandler(uri,HandleHttpPoll,
161 new PollServiceEventArgs(HttpRequestHandler,HasEvents, GetEvents, NoEvents, 161 new PollServiceEventArgs(HttpRequestHandler,HasEvents, GetEvents, NoEvents,
162 urlcode)); 162 urlcode));
163 163
164 engine.PostScriptEvent(itemID, "http_request", new Object[] { urlcode.ToString(), "URL_REQUEST_GRANTED", url }); 164 engine.PostScriptEvent(itemID, "http_request", new Object[] { urlcode.ToString(), "URL_REQUEST_GRANTED", url });
165 } 165 }
@@ -180,11 +180,11 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
180 { 180 {
181 lock (m_UrlMap) 181 lock (m_UrlMap)
182 { 182 {
183 UrlData data; 183 UrlData data;
184 184
185 if (!m_UrlMap.TryGetValue(url, out data)) 185 if (!m_UrlMap.TryGetValue(url, out data))
186 { 186 {
187 return; 187 return;
188 } 188 }
189 189
190 foreach (UUID req in data.requests.Keys) 190 foreach (UUID req in data.requests.Keys)
@@ -196,36 +196,35 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
196 } 196 }
197 197
198 public void HttpResponse(UUID request, int status, string body) 198 public void HttpResponse(UUID request, int status, string body)
199 { 199 {
200 if (m_RequestMap.ContainsKey(request)) 200 if (m_RequestMap.ContainsKey(request))
201 { 201 {
202 UrlData urlData = m_RequestMap[request]; 202 UrlData urlData = m_RequestMap[request];
203 RequestData requestData=urlData.requests[request]; 203 urlData.requests[request].responseCode = status;
204 urlData.requests[request].responseCode = status; 204 urlData.requests[request].responseBody = body;
205 urlData.requests[request].responseBody = body; 205 //urlData.requests[request].ev.Set();
206 //urlData.requests[request].ev.Set(); 206 urlData.requests[request].requestDone =true;
207 urlData.requests[request].requestDone=true; 207 }
208 } 208 else
209 else 209 {
210 { 210 m_log.Info("[HttpRequestHandler] There is no http-in request with id " + request.ToString());
211 m_log.Info("[HttpRequestHandler] There is no http-in request with id " + request.ToString());
212 } 211 }
213 } 212 }
214 213
215 public string GetHttpHeader(UUID requestId, string header) 214 public string GetHttpHeader(UUID requestId, string header)
216 { 215 {
217 if (m_RequestMap.ContainsKey(requestId)) 216 if (m_RequestMap.ContainsKey(requestId))
218 { 217 {
219 UrlData urlData=m_RequestMap[requestId]; 218 UrlData urlData=m_RequestMap[requestId];
220 string value; 219 string value;
221 if (urlData.requests[requestId].headers.TryGetValue(header,out value)) 220 if (urlData.requests[requestId].headers.TryGetValue(header,out value))
222 return value; 221 return value;
223 } 222 }
224 else 223 else
225 { 224 {
226 m_log.Warn("[HttpRequestHandler] There was no http-in request with id " + requestId); 225 m_log.Warn("[HttpRequestHandler] There was no http-in request with id " + requestId);
227 } 226 }
228 return String.Empty; 227 return String.Empty;
229 } 228 }
230 229
231 public int GetFreeUrls() 230 public int GetFreeUrls()
@@ -275,63 +274,63 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
275 foreach (string urlname in removeURLs) 274 foreach (string urlname in removeURLs)
276 m_UrlMap.Remove(urlname); 275 m_UrlMap.Remove(urlname);
277 } 276 }
278 } 277 }
279 278
280 279
281 private void RemoveUrl(UrlData data) 280 private void RemoveUrl(UrlData data)
282 { 281 {
283 m_HttpServer.RemoveHTTPHandler("", "/lslhttp/"+data.urlcode.ToString()+"/"); 282 m_HttpServer.RemoveHTTPHandler("", "/lslhttp/"+data.urlcode.ToString()+"/");
284 } 283 }
285 284
286 private Hashtable NoEvents(UUID requestID, UUID sessionID) 285 private Hashtable NoEvents(UUID requestID, UUID sessionID)
287 { 286 {
288 Hashtable response = new Hashtable(); 287 Hashtable response = new Hashtable();
289 UrlData url; 288 UrlData url;
290 lock (m_RequestMap) 289 lock (m_RequestMap)
291 { 290 {
292 if (!m_RequestMap.ContainsKey(requestID)) 291 if (!m_RequestMap.ContainsKey(requestID))
293 return response; 292 return response;
294 url = m_RequestMap[requestID]; 293 url = m_RequestMap[requestID];
295 } 294 }
296 295
297 if (System.Environment.TickCount - url.requests[requestID].startTime > 25000) 296 if (System.Environment.TickCount - url.requests[requestID].startTime > 25000)
298 { 297 {
299 response["int_response_code"] = 500; 298 response["int_response_code"] = 500;
300 response["str_response_string"] = "Script timeout"; 299 response["str_response_string"] = "Script timeout";
301 response["content_type"] = "text/plain"; 300 response["content_type"] = "text/plain";
302 response["keepalive"] = false; 301 response["keepalive"] = false;
303 response["reusecontext"] = false; 302 response["reusecontext"] = false;
304 303
305 //remove from map 304 //remove from map
306 lock (url) 305 lock (url)
307 { 306 {
308 url.requests.Remove(requestID); 307 url.requests.Remove(requestID);
309 m_RequestMap.Remove(requestID); 308 m_RequestMap.Remove(requestID);
310 } 309 }
311 310
312 return response; 311 return response;
313 } 312 }
314 313
315 314
316 return response; 315 return response;
317 } 316 }
318 317
319 private bool HasEvents(UUID requestID, UUID sessionID) 318 private bool HasEvents(UUID requestID, UUID sessionID)
320 { 319 {
321 UrlData url=null; 320 UrlData url=null;
322 321
323 lock (m_RequestMap) 322 lock (m_RequestMap)
324 { 323 {
325 if (!m_RequestMap.ContainsKey(requestID)) 324 if (!m_RequestMap.ContainsKey(requestID))
326 { 325 {
327 return false; 326 return false;
328 }
329 url = m_RequestMap[requestID];
330 if (!url.requests.ContainsKey(requestID))
331 {
332 return false;
333 } 327 }
334 } 328 url = m_RequestMap[requestID];
329 if (!url.requests.ContainsKey(requestID))
330 {
331 return false;
332 }
333 }
335 334
336 if (System.Environment.TickCount-url.requests[requestID].startTime>25000) 335 if (System.Environment.TickCount-url.requests[requestID].startTime>25000)
337 { 336 {
@@ -343,146 +342,146 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
343 else 342 else
344 return false; 343 return false;
345 344
346 } 345 }
347 private Hashtable GetEvents(UUID requestID, UUID sessionID, string request) 346 private Hashtable GetEvents(UUID requestID, UUID sessionID, string request)
348 { 347 {
349 UrlData url = null; 348 UrlData url = null;
350 RequestData requestData = null; 349 RequestData requestData = null;
351 350
352 lock (m_RequestMap) 351 lock (m_RequestMap)
353 { 352 {
354 if (!m_RequestMap.ContainsKey(requestID)) 353 if (!m_RequestMap.ContainsKey(requestID))
355 return NoEvents(requestID,sessionID); 354 return NoEvents(requestID,sessionID);
356 url = m_RequestMap[requestID]; 355 url = m_RequestMap[requestID];
357 requestData = url.requests[requestID]; 356 requestData = url.requests[requestID];
358 } 357 }
359 358
360 if (!requestData.requestDone) 359 if (!requestData.requestDone)
361 return NoEvents(requestID,sessionID); 360 return NoEvents(requestID,sessionID);
362 361
363 Hashtable response = new Hashtable(); 362 Hashtable response = new Hashtable();
364 363
365 if (System.Environment.TickCount - requestData.startTime > 25000) 364 if (System.Environment.TickCount - requestData.startTime > 25000)
366 { 365 {
367 response["int_response_code"] = 500; 366 response["int_response_code"] = 500;
368 response["str_response_string"] = "Script timeout"; 367 response["str_response_string"] = "Script timeout";
369 response["content_type"] = "text/plain"; 368 response["content_type"] = "text/plain";
370 response["keepalive"] = false; 369 response["keepalive"] = false;
371 response["reusecontext"] = false; 370 response["reusecontext"] = false;
372 return response; 371 return response;
373 } 372 }
374 //put response 373 //put response
375 response["int_response_code"] = requestData.responseCode; 374 response["int_response_code"] = requestData.responseCode;
376 response["str_response_string"] = requestData.responseBody; 375 response["str_response_string"] = requestData.responseBody;
377 response["content_type"] = "text/plain"; 376 response["content_type"] = "text/plain";
378 response["keepalive"] = false; 377 response["keepalive"] = false;
379 response["reusecontext"] = false; 378 response["reusecontext"] = false;
380 379
381 //remove from map 380 //remove from map
382 lock (url) 381 lock (url)
383 { 382 {
384 url.requests.Remove(requestID); 383 url.requests.Remove(requestID);
385 m_RequestMap.Remove(requestID); 384 m_RequestMap.Remove(requestID);
386 } 385 }
387 386
388 return response; 387 return response;
389 } 388 }
390 public void HttpRequestHandler(UUID requestID, Hashtable request) 389 public void HttpRequestHandler(UUID requestID, Hashtable request)
391 { 390 {
392 lock (request) 391 lock (request)
393 { 392 {
394 string uri = request["uri"].ToString(); 393 string uri = request["uri"].ToString();
395 394
396 try 395 try
397 { 396 {
398 Hashtable headers = (Hashtable)request["headers"]; 397 Hashtable headers = (Hashtable)request["headers"];
399 398
400 string uri_full = "http://" + m_ExternalHostNameForLSL + ":" + m_HttpServer.Port.ToString() + uri;// "/lslhttp/" + urlcode.ToString() + "/"; 399// string uri_full = "http://" + m_ExternalHostNameForLSL + ":" + m_HttpServer.Port.ToString() + uri;// "/lslhttp/" + urlcode.ToString() + "/";
401 400
402 int pos1 = uri.IndexOf("/");// /lslhttp 401 int pos1 = uri.IndexOf("/");// /lslhttp
403 int pos2 = uri.IndexOf("/", pos1 + 1);// /lslhttp/ 402 int pos2 = uri.IndexOf("/", pos1 + 1);// /lslhttp/
404 int pos3 = uri.IndexOf("/", pos2 + 1);// /lslhttp/<UUID>/ 403 int pos3 = uri.IndexOf("/", pos2 + 1);// /lslhttp/<UUID>/
405 string uri_tmp = uri.Substring(0, pos3 + 1); 404 string uri_tmp = uri.Substring(0, pos3 + 1);
406 //HTTP server code doesn't provide us with QueryStrings 405 //HTTP server code doesn't provide us with QueryStrings
407 string pathInfo; 406 string pathInfo;
408 string queryString; 407 string queryString;
409 queryString = ""; 408 queryString = "";
410 409
411 pathInfo = uri.Substring(pos3); 410 pathInfo = uri.Substring(pos3);
412 411
413 UrlData url = m_UrlMap["http://" + m_ExternalHostNameForLSL + ":" + m_HttpServer.Port.ToString() + uri_tmp]; 412 UrlData url = m_UrlMap["http://" + m_ExternalHostNameForLSL + ":" + m_HttpServer.Port.ToString() + uri_tmp];
414 413
415 //for llGetHttpHeader support we need to store original URI here 414 //for llGetHttpHeader support we need to store original URI here
416 //to make x-path-info / x-query-string / x-script-url / x-remote-ip headers 415 //to make x-path-info / x-query-string / x-script-url / x-remote-ip headers
417 //as per http://wiki.secondlife.com/wiki/LlGetHTTPHeader 416 //as per http://wiki.secondlife.com/wiki/LlGetHTTPHeader
418 417
419 RequestData requestData = new RequestData(); 418 RequestData requestData = new RequestData();
420 requestData.requestID = requestID; 419 requestData.requestID = requestID;
421 requestData.requestDone = false; 420 requestData.requestDone = false;
422 requestData.startTime = System.Environment.TickCount; 421 requestData.startTime = System.Environment.TickCount;
423 requestData.uri = uri; 422 requestData.uri = uri;
424 if (requestData.headers == null) 423 if (requestData.headers == null)
425 requestData.headers = new Dictionary<string, string>(); 424 requestData.headers = new Dictionary<string, string>();
426 425
427 foreach (DictionaryEntry header in headers) 426 foreach (DictionaryEntry header in headers)
428 { 427 {
429 string key = (string)header.Key; 428 string key = (string)header.Key;
430 string value = (string)header.Value; 429 string value = (string)header.Value;
431 requestData.headers.Add(key, value); 430 requestData.headers.Add(key, value);
432 } 431 }
433 foreach (DictionaryEntry de in request) 432 foreach (DictionaryEntry de in request)
434 { 433 {
435 if (de.Key.ToString() == "querystringkeys") 434 if (de.Key.ToString() == "querystringkeys")
436 { 435 {
437 System.String[] keys = (System.String[])de.Value; 436 System.String[] keys = (System.String[])de.Value;
438 foreach (String key in keys) 437 foreach (String key in keys)
439 { 438 {
440 if (request.ContainsKey(key)) 439 if (request.ContainsKey(key))
441 { 440 {
442 string val = (String)request[key]; 441 string val = (String)request[key];
443 queryString = queryString + key + "=" + val + "&"; 442 queryString = queryString + key + "=" + val + "&";
444 } 443 }
445 } 444 }
446 if (queryString.Length > 1) 445 if (queryString.Length > 1)
447 queryString = queryString.Substring(0, queryString.Length - 1); 446 queryString = queryString.Substring(0, queryString.Length - 1);
448 447
449 } 448 }
450 449
451 } 450 }
452 451
453 //if this machine is behind DNAT/port forwarding, currently this is being 452 //if this machine is behind DNAT/port forwarding, currently this is being
454 //set to address of port forwarding router 453 //set to address of port forwarding router
455 requestData.headers["x-remote-ip"] = requestData.headers["remote_addr"]; 454 requestData.headers["x-remote-ip"] = requestData.headers["remote_addr"];
456 requestData.headers["x-path-info"] = pathInfo; 455 requestData.headers["x-path-info"] = pathInfo;
457 requestData.headers["x-query-string"] = queryString; 456 requestData.headers["x-query-string"] = queryString;
458 requestData.headers["x-script-url"] = url.url; 457 requestData.headers["x-script-url"] = url.url;
459 458
460 requestData.ev = new ManualResetEvent(false); 459 requestData.ev = new ManualResetEvent(false);
461 lock (url.requests) 460 lock (url.requests)
462 { 461 {
463 url.requests.Add(requestID, requestData); 462 url.requests.Add(requestID, requestData);
464 } 463 }
465 lock (m_RequestMap) 464 lock (m_RequestMap)
466 { 465 {
467 //add to request map 466 //add to request map
468 m_RequestMap.Add(requestID, url); 467 m_RequestMap.Add(requestID, url);
469 } 468 }
470 469
471 url.engine.PostScriptEvent(url.itemID, "http_request", new Object[] { requestID.ToString(), request["http-method"].ToString(), request["body"].ToString() }); 470 url.engine.PostScriptEvent(url.itemID, "http_request", new Object[] { requestID.ToString(), request["http-method"].ToString(), request["body"].ToString() });
472 471
473 //send initial response? 472 //send initial response?
474 Hashtable response = new Hashtable(); 473// Hashtable response = new Hashtable();
475 474
476 return; 475 return;
477 476
478 } 477 }
479 catch (Exception we) 478 catch (Exception we)
480 { 479 {
481 //Hashtable response = new Hashtable(); 480 //Hashtable response = new Hashtable();
482 m_log.Warn("[HttpRequestHandler]: http-in request failed"); 481 m_log.Warn("[HttpRequestHandler]: http-in request failed");
483 m_log.Warn(we.Message); 482 m_log.Warn(we.Message);
484 m_log.Warn(we.StackTrace); 483 m_log.Warn(we.StackTrace);
485 } 484 }
486 } 485 }
487 } 486 }
488 487