Difference between revisions of "LSL HTTP server/examples"

From Second Life Wiki
Jump to navigation Jump to search
Line 190: Line 190:


=== Perl/Python Examples Using POST ===
=== Perl/Python Examples Using POST ===
Here are a pair of scripts to provide another example. The first script is the LSL code to receive the information on the grid.
Here are a set of scripts to provide another example. The first script is the LSL code to receive the information on the grid. The second script is a PERL script that is used on the outside server to contact the code on the grid. The third script is a Python script that is used on the outside server to contact the code on the grid.
The second script is a PERL script that is used on the outside server to contact the code on the grid.
<lsl>
<lsl>


Line 238: Line 237:


</lsl>
</lsl>
Here is the PERL script to contact the prim on the grid.


<lsl>
<lsl>
#!/usr/bin/perl
#!/usr/bin/perl
# Routine to contact a script on the SL Grid using http server
# Routine to contact a script on the SL Grid using http server


use URI;
use LWP;
use LWP;
require HTTP::Request;
require HTTP::Request;
use URI::Escape;
use strict;
use strict;


# Set the URL manually....
my $url = 'http://sim3015.aditi.lindenlab.com:12046/cap/2e83b2ce-65aa-9c44-5d1c-e64f48a222e2';


# #################################################
# #################################################
Line 269: Line 266:
     # Set the encoding method and specify the information to be sent.
     # Set the encoding method and specify the information to be sent.
     $request->content_type('application/x-www-form-urlencoded');
     $request->content_type('application/x-www-form-urlencoded');
     $request->content($information);
     $request->content(uri_escape($information));


     # Send the request.
     # Send the request.
Line 279: Line 276:




 
# Set the URL manually....
my $url = 'http://sim3015.aditi.lindenlab.com:12046/cap/d57a7c8b-3ace-3186-730a-f22fde870d48';


my $info = submitInformation
my $info = submitInformation
Line 285: Line 283:


print $info,"\n";
print $info,"\n";




Line 299: Line 296:




# Set the URL manually
# #################################################
url = 'http://sim3015.aditi.lindenlab.com:12046/cap/d57a7c8b-3ace-3186-730a-f22fde870d48';
# Routine to send the information to the prim
#    submitInformation(url,information)
#
def submitInformation(url,parameters) :
    # Set the parameters to be sent.
    encodedParams =  urllib.urlencode(parameters);
 
    # Post the data.
    net = urllib.urlopen(url,encodedParams);
 
    # return the result.
    return(net.read());
 
 
 
if __name__ == "__main__":
 
    # Set the URL manually
    url = 'http://sim3015.aditi.lindenlab.com:12046/cap/d57a7c8b-3ace-3186-730a-f22fde870d48';
 
    # Define the parameters
    parameters = {'id':'244195d6-c9b7-4fd6-9229-c3a8b2e60e81',
                  'name':'M Linden'}


# Set the parameters to be sent.
    # Pass the information along to the prim
param = urllib.urlencode({'id':'244195d6-c9b7-4fd6-9229-c3a8b2e60e81',
    info = submitInformation(url,parameters);
                          'name':'M Linden'});
    print(info);


# Post the data.
net = urllib.urlopen(url,param);


# Print it out
print(net.read());


</lsl>
</lsl>

Revision as of 06:05, 26 May 2009

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_START | 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>


Perl/Python Examples Using POST

Here are a set of scripts to provide another example. The first script is the LSL code to receive the information on the grid. The second script is a PERL script that is used on the outside server to contact the code on the grid. The third script is a Python script that is used on the outside server to contact the code on the grid. <lsl>

key requestURL;

default {

   state_entry() {
       requestURL = llRequestURL();     // Request that an URL be assigned to me.
   }
   
   
    http_request(key id, string method, string body) {
       
       if ((method == URL_REQUEST_GRANTED) && (id == requestURL) ){
           // An URL has been assigned to me.
           llOwnerSay("Obtained URL: " + body);
           requestURL = NULL_KEY;
       }
       
       
       else if ((method == URL_REQUEST_DENIED) && (id == requestURL)) {
           // I could not obtain a URL
           llOwnerSay("There was a problem, and an URL was not assigned: " + body);
           requestURL = NULL_KEY;
       }
       else if (method == "POST") {
           // An incoming message was received.
           llOwnerSay("Received information from the outside: " + body);
           llHTTPResponse(id,200,"Thank you for calling. All of our operators are busy.");
       }


       else {
           // An incoming message has come in using a method that has not been anticipated.
           llHTTPResponse(id,405,"Unsupported Method");
       }


   }


}

</lsl>

Here is the PERL script to contact the prim on the grid.

<lsl>

  1. !/usr/bin/perl
  2. Routine to contact a script on the SL Grid using http server

use LWP; require HTTP::Request; use URI::Escape; use strict;


  1. #################################################
  2. Routine to send the information to the prim
  3. submitInformation($url,$information)

sub submitInformation{

   # First get the arguments.
   my $url = shift;
   my $information = shift;
   # Create the objects to be used to send out the HTTP request
   my $browser = LWP::UserAgent->new;
   my $request = HTTP::Request->new(POST => $url);
   # Set the encoding method and specify the information to be sent.
   $request->content_type('application/x-www-form-urlencoded');
   $request->content(uri_escape($information));
   # Send the request.
   my $response = $browser->request($request);
   # Return the information sent back
   return($response->content);

}


  1. Set the URL manually....

my $url = 'http://sim3015.aditi.lindenlab.com:12046/cap/d57a7c8b-3ace-3186-730a-f22fde870d48';

my $info = submitInformation

   ($url,'id=244195d6-c9b7-4fd6-9229-c3a8b2e60e81&name=M Linden');

print $info,"\n";


</lsl>

Here is the Python code that does the same thing as the PERL code above.

<lsl>

  1. !/usr/bin/python

import urllib


  1. #################################################
  2. Routine to send the information to the prim
  3. submitInformation(url,information)

def submitInformation(url,parameters) :

   # Set the parameters to be sent.
   encodedParams =  urllib.urlencode(parameters);
   # Post the data.
   net = urllib.urlopen(url,encodedParams);
   # return the result.
   return(net.read());


if __name__ == "__main__":

   # Set the URL manually
   url = 'http://sim3015.aditi.lindenlab.com:12046/cap/d57a7c8b-3ace-3186-730a-f22fde870d48';
   # Define the parameters
   parameters = {'id':'244195d6-c9b7-4fd6-9229-c3a8b2e60e81',
                 'name':'M Linden'}
   # Pass the information along to the prim
   info = submitInformation(url,parameters);
   print(info);


</lsl>