diff options
author | Sean Dague | 2007-12-12 22:14:43 +0000 |
---|---|---|
committer | Sean Dague | 2007-12-12 22:14:43 +0000 |
commit | 7625438adeb2211ee9c3f6532819eea2a0673c5d (patch) | |
tree | 6ce5553fa4c9fb60cf1024f2db639b9a386153da /OpenSim/Region/ScriptEngine/DotNetEngine | |
parent | Thanks to Alondria for: (diff) | |
download | opensim-SC-7625438adeb2211ee9c3f6532819eea2a0673c5d.zip opensim-SC-7625438adeb2211ee9c3f6532819eea2a0673c5d.tar.gz opensim-SC-7625438adeb2211ee9c3f6532819eea2a0673c5d.tar.bz2 opensim-SC-7625438adeb2211ee9c3f6532819eea2a0673c5d.tar.xz |
From Michael Osias (IBM)
This patch implements the llHttpRequest function via a region module,
HttpScriptsRequest. There were bits and peices in LSLLong_cmd_handler,
which I moved into the region module, and just check for completed
requests and dispatch the http_response callback event instead.
works for me as of r2674
Diffstat (limited to 'OpenSim/Region/ScriptEngine/DotNetEngine')
3 files changed, 59 insertions, 118 deletions
diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/LSL_BaseClass.cs b/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/LSL_BaseClass.cs index deabec3..99f8d3b 100644 --- a/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/LSL_BaseClass.cs +++ b/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/LSL_BaseClass.cs | |||
@@ -1759,9 +1759,9 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL | |||
1759 | return m_LSL_Functions.llXorBase64StringsCorrect(str1, str2); | 1759 | return m_LSL_Functions.llXorBase64StringsCorrect(str1, str2); |
1760 | } | 1760 | } |
1761 | 1761 | ||
1762 | public void llHTTPRequest(string url, List<string> parameters, string body) | 1762 | public string llHTTPRequest(string url, List<string> parameters, string body) |
1763 | { | 1763 | { |
1764 | m_LSL_Functions.llHTTPRequest(url, parameters, body); | 1764 | return m_LSL_Functions.llHTTPRequest(url, parameters, body); |
1765 | } | 1765 | } |
1766 | 1766 | ||
1767 | public void llResetLandBanList() | 1767 | public void llResetLandBanList() |
diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/Server_API/LSL_BuiltIn_Commands.cs b/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/Server_API/LSL_BuiltIn_Commands.cs index 94479a0..aaac294 100644 --- a/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/Server_API/LSL_BuiltIn_Commands.cs +++ b/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/Server_API/LSL_BuiltIn_Commands.cs | |||
@@ -2451,9 +2451,18 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler | |||
2451 | return llStringToBase64(ret); | 2451 | return llStringToBase64(ret); |
2452 | } | 2452 | } |
2453 | 2453 | ||
2454 | public void llHTTPRequest(string url, List<string> parameters, string body) | 2454 | public string llHTTPRequest(string url, List<string> parameters, string body) |
2455 | { | 2455 | { |
2456 | m_ScriptEngine.m_LSLLongCmdHandler.StartHttpRequest(m_localID, m_itemID, url, parameters, body); | 2456 | IHttpRequests httpScriptMod = |
2457 | m_ScriptEngine.World.RequestModuleInterface<IHttpRequests>(); | ||
2458 | |||
2459 | LLUUID reqID = httpScriptMod. | ||
2460 | StartHttpRequest(m_localID, m_itemID, url, parameters, body); | ||
2461 | |||
2462 | if( reqID != null ) | ||
2463 | return reqID.ToString(); | ||
2464 | else | ||
2465 | return null; | ||
2457 | } | 2466 | } |
2458 | 2467 | ||
2459 | public void llResetLandBanList() | 2468 | public void llResetLandBanList() |
diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/LSLLongCmdHandler.cs b/OpenSim/Region/ScriptEngine/DotNetEngine/LSLLongCmdHandler.cs index 5061629..ddc0c62 100644 --- a/OpenSim/Region/ScriptEngine/DotNetEngine/LSLLongCmdHandler.cs +++ b/OpenSim/Region/ScriptEngine/DotNetEngine/LSLLongCmdHandler.cs | |||
@@ -110,7 +110,9 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine | |||
110 | // Remove from: Timers | 110 | // Remove from: Timers |
111 | UnSetTimerEvents(localID, itemID); | 111 | UnSetTimerEvents(localID, itemID); |
112 | // Remove from: HttpRequest | 112 | // Remove from: HttpRequest |
113 | StopHttpRequest(localID, itemID); | 113 | IHttpRequests iHttpReq = |
114 | m_ScriptEngine.World.RequestModuleInterface<IHttpRequests>(); | ||
115 | iHttpReq.StopHttpRequest(localID, itemID); | ||
114 | } | 116 | } |
115 | 117 | ||
116 | #region TIMER | 118 | #region TIMER |
@@ -198,136 +200,67 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine | |||
198 | 200 | ||
199 | #region HTTP REQUEST | 201 | #region HTTP REQUEST |
200 | 202 | ||
201 | // | 203 | public void CheckHttpRequests() |
202 | // HTTP REAQUEST | ||
203 | // | ||
204 | private class HttpClass | ||
205 | { | 204 | { |
206 | public uint localID; | 205 | IHttpRequests iHttpReq = |
207 | public LLUUID itemID; | 206 | m_ScriptEngine.World.RequestModuleInterface<IHttpRequests>(); |
208 | public string url; | ||
209 | public List<string> parameters; | ||
210 | public string body; | ||
211 | public DateTime next; | ||
212 | 207 | ||
213 | public string response_request_id; | 208 | HttpRequestClass httpInfo = null; |
214 | public int response_status; | ||
215 | public List<string> response_metadata; | ||
216 | public string response_body; | ||
217 | 209 | ||
218 | public void SendRequest() | 210 | if( iHttpReq != null ) |
219 | { | 211 | httpInfo = iHttpReq.GetNextCompletedRequest(); |
220 | // TODO: SEND REQUEST!!! | ||
221 | } | ||
222 | |||
223 | public void Stop() | ||
224 | { | ||
225 | // TODO: Cancel any ongoing request | ||
226 | } | ||
227 | 212 | ||
228 | public bool CheckResponse() | 213 | while ( httpInfo != null ) |
229 | { | 214 | { |
230 | // TODO: Check if we got a response yet, return true if so -- false if not | 215 | |
231 | return true; | 216 | Console.WriteLine("PICKED HTTP REQ:" + httpInfo.response_body + httpInfo.status); |
232 | 217 | ||
233 | // TODO: If we got a response, set the following then return true | 218 | // Deliver data to prim's remote_data handler |
234 | //response_request_id | 219 | // |
235 | //response_status | 220 | // TODO: Returning null for metadata, since the lsl function |
236 | //response_metadata | 221 | // only returns the byte for HTTP_BODY_TRUNCATED, which is not |
237 | //response_body | 222 | // implemented here yet anyway. Should be fixed if/when maxsize |
238 | } | 223 | // is supported |
239 | } | 224 | |
225 | object[] resobj = new object[] | ||
226 | { | ||
227 | httpInfo.reqID.ToString(), httpInfo.status, null, httpInfo.response_body | ||
228 | }; | ||
240 | 229 | ||
241 | private List<HttpClass> HttpRequests = new List<HttpClass>(); | 230 | m_ScriptEngine.m_EventQueueManager.AddToScriptQueue( |
242 | private object HttpListLock = new object(); | 231 | httpInfo.localID, httpInfo.itemID, "http_response", resobj |
232 | ); | ||
243 | 233 | ||
244 | public void StartHttpRequest(uint localID, LLUUID itemID, string url, List<string> parameters, string body) | 234 | httpInfo.Stop(); |
245 | { | 235 | httpInfo = null; |
246 | Console.WriteLine("StartHttpRequest"); | ||
247 | |||
248 | HttpClass htc = new HttpClass(); | ||
249 | htc.localID = localID; | ||
250 | htc.itemID = itemID; | ||
251 | htc.url = url; | ||
252 | htc.parameters = parameters; | ||
253 | htc.body = body; | ||
254 | lock (HttpListLock) | ||
255 | { | ||
256 | //ADD REQUEST | ||
257 | HttpRequests.Add(htc); | ||
258 | } | ||
259 | } | ||
260 | 236 | ||
261 | public void StopHttpRequest(uint m_localID, LLUUID m_itemID) | 237 | httpInfo = iHttpReq.GetNextCompletedRequest(); |
262 | { | ||
263 | // Remove from list | ||
264 | lock (HttpListLock) | ||
265 | { | ||
266 | List<HttpClass> NewHttpList = new List<HttpClass>(); | ||
267 | foreach (HttpClass ts in HttpRequests) | ||
268 | { | ||
269 | if (ts.localID != m_localID && ts.itemID != m_itemID) | ||
270 | { | ||
271 | // Keeping this one | ||
272 | NewHttpList.Add(ts); | ||
273 | } | ||
274 | else | ||
275 | { | ||
276 | // Shutting this one down | ||
277 | ts.Stop(); | ||
278 | } | ||
279 | } | ||
280 | HttpRequests.Clear(); | ||
281 | HttpRequests = NewHttpList; | ||
282 | } | 238 | } |
283 | } | 239 | } |
284 | 240 | ||
285 | public void CheckHttpRequests() | ||
286 | { | ||
287 | // Nothing to do here? | ||
288 | if (HttpRequests.Count == 0) | ||
289 | return; | ||
290 | |||
291 | lock (HttpListLock) | ||
292 | { | ||
293 | foreach (HttpClass ts in HttpRequests) | ||
294 | { | ||
295 | if (ts.CheckResponse() == true) | ||
296 | { | ||
297 | // Add it to event queue | ||
298 | //key request_id, integer status, list metadata, string body | ||
299 | object[] resobj = | ||
300 | new object[] | ||
301 | {ts.response_request_id, ts.response_status, ts.response_metadata, ts.response_body}; | ||
302 | m_ScriptEngine.m_EventQueueManager.AddToScriptQueue(ts.localID, ts.itemID, "http_response", | ||
303 | resobj); | ||
304 | // Now stop it | ||
305 | StopHttpRequest(ts.localID, ts.itemID); | ||
306 | } | ||
307 | } | ||
308 | } // lock | ||
309 | } | ||
310 | |||
311 | #endregion | 241 | #endregion |
312 | 242 | ||
313 | public void CheckXMLRPCRequests() | 243 | public void CheckXMLRPCRequests() |
314 | { | 244 | { |
315 | IXMLRPC xmlrpc = m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>(); | 245 | IXMLRPC xmlrpc = m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>(); |
316 | 246 | ||
317 | while (xmlrpc.hasRequests()) | 247 | if (xmlrpc != null) |
318 | { | 248 | { |
319 | RPCRequestInfo rInfo = xmlrpc.GetNextRequest(); | 249 | while (xmlrpc.hasRequests()) |
320 | Console.WriteLine("PICKED REQUEST"); | 250 | { |
321 | 251 | RPCRequestInfo rInfo = xmlrpc.GetNextRequest(); | |
322 | //Deliver data to prim's remote_data handler | 252 | Console.WriteLine("PICKED REQUEST"); |
323 | object[] resobj = new object[] | 253 | |
324 | { | 254 | //Deliver data to prim's remote_data handler |
325 | 2, rInfo.GetChannelKey().ToString(), rInfo.GetMessageID().ToString(), "", rInfo.GetIntValue(), | 255 | object[] resobj = new object[] |
326 | rInfo.GetStrVal() | 256 | { |
327 | }; | 257 | 2, rInfo.GetChannelKey().ToString(), rInfo.GetMessageID().ToString(), "", rInfo.GetIntValue(), |
328 | m_ScriptEngine.m_EventQueueManager.AddToScriptQueue( | 258 | rInfo.GetStrVal() |
329 | rInfo.GetLocalID(), rInfo.GetItemID(), "remote_data", resobj | 259 | }; |
330 | ); | 260 | m_ScriptEngine.m_EventQueueManager.AddToScriptQueue( |
261 | rInfo.GetLocalID(), rInfo.GetItemID(), "remote_data", resobj | ||
262 | ); | ||
263 | } | ||
331 | } | 264 | } |
332 | } | 265 | } |
333 | 266 | ||
@@ -338,7 +271,6 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine | |||
338 | while (comms.HasMessages()) | 271 | while (comms.HasMessages()) |
339 | { | 272 | { |
340 | ListenerInfo lInfo = comms.GetNextMessage(); | 273 | ListenerInfo lInfo = comms.GetNextMessage(); |
341 | Console.WriteLine("PICKED LISTENER"); | ||
342 | 274 | ||
343 | //Deliver data to prim's listen handler | 275 | //Deliver data to prim's listen handler |
344 | object[] resobj = new object[] | 276 | object[] resobj = new object[] |