Difference between revisions of "LSL HTTP server/examples"
Line 190: | Line 190: | ||
=== Perl/Python Examples Using POST === | === Perl/Python Examples Using POST === | ||
Here are a | 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 LWP; | use LWP; | ||
require HTTP::Request; | require HTTP::Request; | ||
use URI::Escape; | |||
use strict; | use strict; | ||
# ################################################# | # ################################################# | ||
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'} | |||
# | # Pass the information along to the prim | ||
info = submitInformation(url,parameters); | |||
print(info); | |||
</lsl> | </lsl> |
Revision as of 05:05, 26 May 2009
LSL Portal | Functions | Events | Types | Operators | Constants | Flow Control | Script Library | Categorized Library | Tutorials |
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>
- !/usr/bin/perl
- Routine to contact a script on the SL Grid using http server
use LWP; require HTTP::Request; use URI::Escape; use strict;
- #################################################
- Routine to send the information to the prim
- 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);
}
- 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>
- !/usr/bin/python
import urllib
- #################################################
- 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'}
# Pass the information along to the prim info = submitInformation(url,parameters); print(info);
</lsl>