Difference between revisions of "LSL HTTP server/examples"

From Second Life Wiki
Jump to navigation Jump to search
Line 56: Line 56:
A list of residents within sensor range of the server.
A list of residents within sensor range of the server.
<br>Notes:
<br>Notes:
* It is cheesy and only handles one request at a time.  This was just so the script didn't fill out with list management.
* This includes a method for handling multiple requests while waiting for asynchronous data requests to come back.
<lsl>
<lsl>
key request_id = NULL_KEY;
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
default
{
{
Line 79: Line 91:
         else if (method == "GET")
         else if (method == "GET")
         {
         {
             if (request_id != NULL_KEY)
             if (!scanning)
            {
                // This is cheesy.
                // Handling multiple requests means list management though.
                llHTTPResponse(id,503,"Sorry, busy right now.\n\tTry again soon.");
            }
            else
             {
             {
                request_id = id;
                 llSensor("",NULL_KEY,AGENT,96,PI);
                 llSensor("",NULL_KEY,AGENT,96,PI);
                scanning = TRUE;
             }
             }
           
            requests += [id];
         }
         }
         else
         else
Line 99: Line 107:
     no_sensor()
     no_sensor()
     {
     {
         llHTTPResponse(request_id, 200, "There is no one here.");
         send_response("There is no one here.");
         request_id = NULL_KEY;
         scanning = FALSE;
     }
     }
   
   
     sensor(integer n)
     sensor(integer n)
     {
     {
         string output = "There are " + (string)n + " avatars nearby:";
         string output;
        if (n < 16) output = "There are " + (string)n + " avatars nearby:";
        else output = "There are at least 16 avatars nearby:";
       
         integer i;
         integer i;
         for (i = 0;i<n;++i)
         for (i = 0;i<n;++i)
Line 111: Line 122:
             output += "\n\t" + llDetectedName(i);
             output += "\n\t" + llDetectedName(i);
         }
         }
         llHTTPResponse(request_id,200,output);
          
         request_id = NULL_KEY;
        send_response(output);
 
         scanning = FALSE;
     }
     }
}
}

Revision as of 10:50, 8 October 2008

Hello World!

Classic example, the smallest http_request script possible. <lsl> 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!");
       }
   }

} </lsl> A slightly more robust version: <lsl> 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");
       }
   }

} </lsl>

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.

<lsl>

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;
   }

} </lsl>

Url Persistence / Visitor Counter

A more complete 'hello world', always has an url and keeps a visitor counter. <lsl> 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");
       }
   }

} </lsl>