Difference between revisions of "LlReleaseURL"

From Second Life Wiki
Jump to navigation Jump to search
m (added example)
(Added information about URL auto release in certain circumstances)
 
(5 intermediate revisions by 4 users not shown)
Line 7: Line 7:
|return_text
|return_text
|spec
|spec
|caveats
|caveats=*URLs are automatically released and invalidated in certain situations. In the following situations, there is no need to call llReleaseURL. But you will have to request a new one afterwards
**When the region is restarted or goes offline
**When the script holding the URLs is reset, or recompiled
**When the object containing the script is deleted, or taken to inventory
|constants
|constants
|examples=
|examples=
<lsl>
{{LSL Tip|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.}}
<source lang="lsl2">
string url;
string url;
key urlRequestId;
key urlRequestId;
Line 19: Line 23:
     llReleaseURL(url);
     llReleaseURL(url);
     url = "";
     url = "";
    llSetTimerEvent(0.0);
     urlRequestId = llRequestURL();
     urlRequestId = llRequestURL();
}
}
Line 25: Line 29:
throw_exception(string inputString)
throw_exception(string inputString)
{
{
     key owner = llGetOwner();
     llInstantMessage(llGetOwner(), inputString);
    llInstantMessage(owner, inputString);
   
   
     // yeah, bad way to handle exceptions by restarting.
     // yeah, bad way to handle exceptions by restarting.
Line 43: Line 46:
     changed(integer change)
     changed(integer change)
     {
     {
         if (change & (CHANGED_OWNER | CHANGED_INVENTORY))
         if (change & CHANGED_OWNER | CHANGED_REGION | CHANGED_REGION_START)
        {
            llReleaseURL(url);
            url = "";
             llResetScript();
             llResetScript();
        }
        if (change & (CHANGED_REGION | CHANGED_REGION_START | CHANGED_TELEPORT))
            request_url();
     }
     }
   
   
Line 67: Line 62:
         if (method == URL_REQUEST_DENIED)
         if (method == URL_REQUEST_DENIED)
             throw_exception("The following error occurred while attempting to get a free URL for this device:\n \n" + body);
             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)
         else if (method == URL_REQUEST_GRANTED)
         {
         {
             key owner = llGetOwner();
             url = body;
             llLoadURL(owner, "Click to visit my URL!", body);
             llLoadURL(llGetOwner(), "Click to visit my URL!", url);
   
   
             // check every 5 mins for dropped URL
             // check every 5 mins for dropped URL
Line 99: Line 93:
                 request_url();
                 request_url();
         }
         }
         else if (id == NULL_KEY)
         else if (id == NULL_KEY)
             throw_exception("Too many HTTP requests too fast!");
             throw_exception("Too many HTTP requests too fast!");
Line 113: Line 106:
     }
     }
}
}
</lsl>
</source>
|helpers
|helpers
|mode=
|mode=

Latest revision as of 15:14, 9 September 2015

Summary

Function: llReleaseURL( string url );

Releases the specified URL, it will no longer be usable.

• string url URL to release

Caveats

  • URLs are automatically released and invalidated in certain situations. In the following situations, there is no need to call llReleaseURL. But you will have to request a new one afterwards
    • When the region is restarted or goes offline
    • When the script holding the URLs is reset, or recompiled
    • When the object containing the script is deleted, or taken to inventory
All Issues ~ Search JIRA for related Bugs

Examples

KBcaution.png 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.
string url;
key urlRequestId;
key selfCheckRequestId;
 
request_url()
{
    llReleaseURL(url);
    url = "";
    llSetTimerEvent(0.0);
    urlRequestId = llRequestURL();
}
 
throw_exception(string inputString)
{
    llInstantMessage(llGetOwner(), 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 | CHANGED_REGION | CHANGED_REGION_START)
            llResetScript();
    }
 
    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;
            llLoadURL(llGetOwner(), "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],
                                "");
    }
}

See Also

Functions

•  llRequestURL
•  llRequestSecureURL
•  llGetFreeURLs
•  llHTTPResponse
•  llGetHTTPHeader

Articles

•  LSL http server

Deep Notes

History

Search JIRA for related Issues

Signature

function void llReleaseURL( string url );