Difference between revisions of "LlRequestURL"

From Second Life Wiki
Jump to navigation Jump to search
m
m (added some exception handling to the first example script)
Line 14: Line 14:
This script requests a new URL after region restart:
This script requests a new URL after region restart:
<LSL>
<LSL>
string url;
key urlRequestId;
key urlRequestId;
string url;
key selfCheckRequestId;


request_url()
request_url()
{
{
     if (url != "")
     llReleaseURL(url);
    {
    url = "";
        llReleaseURL(url);
        url = "";
    }


     urlRequestId = llRequestURL();
     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
default
{
{
    on_rez(integer start_param)
    {
        llResetScript();
    }
     changed(integer change)
     changed(integer change)
     {
     {
         if (change & CHANGED_REGION_START)
         if (change & (CHANGED_OWNER | CHANGED_INVENTORY))
        {
            llReleaseURL(url);
            url = "";
 
            llResetScript();
        }
 
        if (change & (CHANGED_REGION | CHANGED_REGION_START | CHANGED_TELEPORT))
             request_url();
             request_url();
     }
     }
Line 43: Line 65:
     http_request(key id, string method, string body)
     http_request(key id, string method, string body)
     {
     {
         if (id == urlRequestId)
         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)
         {
         {
             urlRequestId = NULL_KEY;
             key owner = llGetOwner();
            llLoadURL(owner, "Click to visit my URL!", body);


             if (method == URL_REQUEST_GRANTED)
             // check every 5 mins for dropped URL
            {
             llSetTimerEvent(300.0);
                url = body;
                llOwnerSay(url);
            }
             else if (method == URL_REQUEST_DENIED)
                llOwnerSay("URL request has been denied! " + body);
         }
         }
         else if (method == "GET")
         else if (method == "GET")
             llHTTPResponse(id, 200, "Hello world!");
        {
             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],
                                "");
     }
     }
}
}

Revision as of 10:02, 24 September 2012

Summary

Function: key llRequestURL( );

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.
  • 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.
All Issues ~ Search JIRA for related Bugs

Examples

This script requests a new URL after region restart: <LSL> 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

See Also

Functions

•  llRequestSecureURL
•  llGetFreeURLs
•  llReleaseURL
•  llHTTPResponse
•  llGetHTTPHeader

Articles

•  LSL http server

Deep Notes

History

Search JIRA for related Issues

Signature

function key llRequestURL();