LSL http server/examples

From Second Life Wiki

LSL http server/examples
Jump to: navigation, search

Hello World!

Classic example, the smallest http_request script possible.

 
default
{
    state_entry()
    {
        llRequestURL();
    }
 
    http_request(key id, string method, string body)
    {
        if (method == URL_REQUEST_GRANTED)
        {
            llSay(0,"URL: " + body);
        }
        else if (method == "GET")
        {
            llHTTPResponse(id,200,"Hello World!");
        }
    }
}
 

A slightly more robust version:

 
default
{
    state_entry()
    {
        llRequestURL();
    }
 
    http_request(key id, string method, string body)
    {
        if (method == URL_REQUEST_GRANTED)
        {
            llSay(0,"URL: " + body);
        }
        else if (method == URL_REQUEST_DENIED)
        {
            llSay(0, "Something went wrong, no url. " + body);
        }
        else if (method == "GET")
        {
            llHTTPResponse(id,200,"Hello World!");
        }
        else
        {
            llHTTPResponse(id,405,"Unsupported Method");
        }
    }
}
 

Visitor List

A list of residents within sensor range of the server.
Notes:

  • This includes a method for handling multiple requests while waiting for asynchronous data requests to come back.

integer scanning = FALSE;
 
list requests;
 
send_response(string body)
{
    integer j;
    for (j = 0; j < llGetListLength(requests); ++j)
    {
        llHTTPResponse(llList2Key(requests,j), 200, body);
    }
    requests = [];
}
 
default
{
    state_entry()
    {
        llRequestURL();
    }
 
    http_request(key id, string method, string body)
    {
        if (method == URL_REQUEST_GRANTED)
        {
            llSay(0,"URL: " + body);
        }
        else if (method == URL_REQUEST_DENIED)
        {
            llSay(0, "Something went wrong, no url. " + body);
        }
        else if (method == "GET")
        {
            if (!scanning)
            {
                llSensor("",NULL_KEY,AGENT,96,PI);
                scanning = TRUE;
            }
 
            requests += [id];
        }
        else
        {
            llHTTPResponse(id,405,"Unsupported method.");
        }
    }
 
    no_sensor()
    {
        send_response("There is no one here.");
        scanning = FALSE;
    }
 
    sensor(integer n)
    {
        string output;
        if (n < 16) output = "There are " + (string)n + " avatars nearby:";
        else output = "There are at least 16 avatars nearby:";
 
        integer i;
        for (i = 0;i<n;++i)
        {
            output += "\n\t" + llDetectedName(i);
        }
 
        send_response(output);
 
        scanning = FALSE;
    }
}
 

Url Persistence / Visitor Counter

A more complete 'hello world', always has an url and keeps a visitor counter.

 
string url;
integer hits;
 
setup()
{
    llSetObjectName("HTTP Server");
    url = "";
    llRequestURL();
    hits = (integer)llGetObjectDesc();
    llSetText((string)hits + " visitors.",<1,1,0>,1);
}
 
default
{
    state_entry() { setup(); }
    on_rez(integer n) { setup(); }
 
    changed(integer c)
    {
        if (c & (CHANGED_REGION | CHANGED_REGION_RESTART | CHANGED_TELEPORT) )
        {
            setup();
        }
    }
 
    touch_start(integer n)
    {
        llSay(0,"My url is: " + url);
    }
 
    http_request(key id, string method, string body)
    {
        if (method == URL_REQUEST_GRANTED)
        {
            url = body;
        }
        else if (method == URL_REQUEST_DENIED)
        {
            llSay(0, "Something went wrong, no url. " + body);
        }
        else if (method == "GET")
        {
            ++hits;
            llSetObjectDesc((string)hits);
            llSetText((string)hits + " visitors.",<1,1,0>,1);
            llHTTPResponse(id,200,"Hello!  You are visitor " + (string)hits + ".");
        }
        else
        {
            llHTTPResponse(id,405,"Method unsupported");
        }
    }
}
 
Personal tools