LlRequestURL
From Second Life Wiki
| LSL Portal | Functions | Events | Types | Operators | Constants | Flow Control | Script Library | Categorized Library | Tutorials |
Contents |
Summary
Function: key llRequestURL( );| 345 | Function ID |
| 0.0 | Forced Delay |
| 10.0 | Energy |
Requests one HTTP:// url for use by this script. The http_request event is triggered with the result of the request.
Returns a key that is the handle used for identifying the result in the http_request event.
Caveats
- When a region is (re)started all HTTP server URLs are automatically released and invalidated.
- Use CHANGED_REGION_START to detect this so new URL can be requested.
- The number of available URLs is a limited resource, that is to say, a script can only have so many open URLs. See LSL http_server#Resource Limitations for details.
- When abandoning a URL, always release it with llReleaseURL, otherwise it will leak.
Examples
| Important: Never ever forget to release a URL again which you have requested! URLs are region resources just like prims. If you take them all you can get into big trouble with the sim owner and/or estate managers. |
This script requests a new URL after region restart:
string url; key urlRequestId; key selfCheckRequestId; request_url() { llReleaseURL(url); url = ""; urlRequestId = llRequestURL(); } throw_exception(string inputString) { key owner = llGetOwner(); llInstantMessage(owner, inputString); // yeah, bad way to handle exceptions by restarting. // However this is just a demo script... llResetScript(); } default { on_rez(integer start_param) { llResetScript(); } changed(integer change) { if (change & (CHANGED_OWNER)) { llReleaseURL(url); llResetScript(); } if (change & (CHANGED_REGION | CHANGED_REGION_START | CHANGED_TELEPORT)) request_url(); } state_entry() { request_url(); } http_request(key id, string method, string body) { integer responseStatus = 400; string responseBody = "Unsupported method"; if (method == URL_REQUEST_DENIED) throw_exception("The following error occurred while attempting to get a free URL for this device:\n \n" + body); else if (method == URL_REQUEST_GRANTED) { url = body; key owner = llGetOwner(); llLoadURL(owner, "Click to visit my URL!", url); // check every 5 mins for dropped URL llSetTimerEvent(300.0); } else if (method == "GET") { responseStatus = 200; responseBody = "Hello world!"; } // else if (method == "POST") ...; // else if (method == "PUT") ...; // else if (method == "DELETE") { responseStatus = 403; responseBody = "forbidden"; } llHTTPResponse(id, responseStatus, responseBody); } http_response(key id, integer status, list metaData, string body) { if (id == selfCheckRequestId) { // If you're not usually doing this, // now is a good time to get used to doing it! selfCheckRequestId = NULL_KEY; if (status != 200) request_url(); } else if (id == NULL_KEY) throw_exception("Too many HTTP requests too fast!"); } timer() { selfCheckRequestId = llHTTPRequest(url, [HTTP_METHOD, "GET", HTTP_VERBOSE_THROTTLE, FALSE, HTTP_BODY_MAXLENGTH, 16384], ""); } }
It's important to keep in mind that if you request another URL, that the old one will not be released, it will remain active. The following script drives home this point.
Try the following code ONLY if you can use all your URLs on your land. Removing the prim/script will release all URLs previous assigned.
// WARNING: // // This script is only for proof-of-concept (demo purposes). // DO NOT use it if you don't have the sim owners and/or // estate managers OK to test this script. // This script can possibly block HTTP communication from and to the sim. // ...bringing down all networked vendors and/or similar machines. // // This script allocates all available URLs. // Deleting the script and/or derezzing the object containing the script, // will release all previously taken URLs. default { state_entry() { llRequestURL(); } http_request(key id, string method, string body) { if (method == URL_REQUEST_DENIED) llSetText("No free URLs!", <1.0, 0.0, 0.0>, 1.0); else if (method == URL_REQUEST_GRANTED) { llSetText( (string)llGetFreeURLs() + " URLs left\n" + body, <1.0, 1.0, 1.0>, 1.0); llRequestURL(); } else if (method == "GET") llHTTPResponse(id, 200, "Hello there!"); } }
This script will, as you can see, use all URLs available on your land because it does not remove the old URLs before requesting a new one.
Just store the old URL in a global variable and release it with llReleaseURL.See Also
Functions
| • | llRequestSecureURL | |||
| • | llGetFreeURLs | |||
| • | llReleaseURL | |||
| • | llHTTPResponse | |||
| • | llGetHTTPHeader |
Articles
| • | LSL http server |
This article wasn't helpful for you? Maybe the related article at the LSL Wiki is able to bring enlightenment.

