LlRequestSecureURL: Difference between revisions

From Second Life Wiki
Jump to navigation Jump to search
Strife Onizuka (talk | contribs)
m New page: {{LSL_Function |func_id=346|func_sleep=0.0|func_energy=10.0 |func=llGetFreeURLs|return_type=integer |func_footnote |func_desc=Requests one HTTPS:// (SSL) url for use by this object. The [[...
 
Gwyneth Llewelyn (talk | contribs)
m Removed the warning & information regarding the self-signed certificate, since LL already replaced it with a bona-fide one
 
(18 intermediate revisions by 9 users not shown)
Line 1: Line 1:
{{LSL_Function
{{LSL_Function
|func_id=346|func_sleep=0.0|func_energy=10.0
|func_id=346|func_sleep=0.0|func_energy=10.0
|func=llGetFreeURLs|return_type=integer
|func=llRequestSecureURL
|return_type=key|return_subtype=handle
|func_footnote
|func_footnote
|func_desc=Requests one HTTPS:// (SSL) url for use by this object. The [[http_server]] event is tigger with results.
|func_desc=Requests one {{mono|HTTPS://}} ({{Wikipedia|SSL}}) {{Wikipedia|URL}} for use by this [[object]]. The [[http_request]] [[event]] is triggered with result of the request. [[LSL_HTTP_server#Introduction|HTTPS-in]] uses port {{mono|12043}}.
|return_text=that is the handle used for identifying the request in the [[http_server]] event.
|return_text=used for identifying the result of the request in the [[http_request]] [[event]].
|spec
|spec
|caveats
|caveats=*HTTPS-in uses port {{mono|12043}} (that port is in the URL returned by this method).
*When a [[region]] is (re)started all [[http_request|HTTP server]] URLs are automatically released and invalidated.
**Use [[CHANGED_REGION_START]] to detect this so a new URL can be requested.
|constants
|constants
|examples=
|examples=
{{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 [[Private Region|region owner]] and/or [[Estate Manager|estate managers]].}}
Requesting a secure URL:
<syntaxhighlight lang="lsl2">
string secureUrl;
key urlRequestId;
key selfCheckRequestId;
request_secure_url()
{
    llReleaseURL(secureUrl);
    secureUrl = "";
    urlRequestId = llRequestSecureURL();
}
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 | CHANGED_INVENTORY))
        {
            llReleaseURL(secureUrl);
            secureUrl = "";
            llResetScript();
        }
        if (change & (CHANGED_REGION | CHANGED_REGION_START | CHANGED_TELEPORT))
            request_secure_url();
    }
    state_entry()
    {
        request_secure_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)
        {
            secureUrl = body;
            key owner = llGetOwner();
            llLoadURL(owner, "Click to visit my URL!", secureUrl);
            // 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_secure_url();
        }
        else if (id == NULL_KEY)
            throw_exception("Too many HTTP requests too fast!");
    }
    timer()
    {
        selfCheckRequestId = llHTTPRequest(secureUrl,
                                [HTTP_METHOD, "GET",
                                    HTTP_VERBOSE_THROTTLE, FALSE,
                                    HTTP_BODY_MAXLENGTH, 16384],
                                "");
    }
}
</syntaxhighlight>
|helpers
|helpers
|mode=
|also_functions=
|also_functions=
{{LSL DefineRow||[[llRequestURL]]}}
{{LSL DefineRow||[[llRequestURL]]}}
Line 25: Line 136:
*{{SVN|1836|rev=112899 |trunk=*|anchor=file22|ver=|ser=}}
*{{SVN|1836|rev=112899 |trunk=*|anchor=file22|ver=|ser=}}
|cat1=HTTP
|cat1=HTTP
|cat2
|cat2=HTTP/Server
|cat3
|cat3
|cat4
|cat4
}}
}}

Latest revision as of 12:53, 20 May 2025

Summary

Function: key llRequestSecureURL( );
0.0 Forced Delay
10.0 Energy

Requests one HTTPS:// ("Wikipedia logo"SSL) "Wikipedia logo"URL for use by this object. The http_request event is triggered with result of the request. HTTPS-in uses port 12043.
Returns a handle (a key) used for identifying the result of the request in the http_request event.

Caveats

  • HTTPS-in uses port 12043 (that port is in the URL returned by this method).
  • When a region is (re)started all HTTP server URLs are automatically released and invalidated.

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 region owner and/or estate managers.

Requesting a secure URL:

string secureUrl;
key urlRequestId;
key selfCheckRequestId;
 
request_secure_url()
{
    llReleaseURL(secureUrl);
    secureUrl = "";
 
    urlRequestId = llRequestSecureURL();
}
 
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 | CHANGED_INVENTORY))
        {
            llReleaseURL(secureUrl);
            secureUrl = "";
 
            llResetScript();
        }
 
        if (change & (CHANGED_REGION | CHANGED_REGION_START | CHANGED_TELEPORT))
            request_secure_url();
    }
 
    state_entry()
    {
        request_secure_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)
        {
            secureUrl = body;
            key owner = llGetOwner();
            llLoadURL(owner, "Click to visit my URL!", secureUrl);
 
            // 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_secure_url();
        }
 
        else if (id == NULL_KEY)
            throw_exception("Too many HTTP requests too fast!");
    }
 
    timer()
    {
        selfCheckRequestId = llHTTPRequest(secureUrl,
                                [HTTP_METHOD, "GET",
                                    HTTP_VERBOSE_THROTTLE, FALSE,
                                    HTTP_BODY_MAXLENGTH, 16384],
                                "");
    }
}

See Also

Functions

•  llRequestURL
•  llGetFreeURLs
•  llReleaseURL
•  llHTTPResponse
•  llGetHTTPHeader

Articles

•  LSL http server

Deep Notes

History

Signature

function key llRequestSecureURL();