Difference between revisions of "LSL HTTP server/examples"
Jump to navigation
Jump to search
Kelly Linden (talk | contribs) |
Kelly Linden (talk | contribs) |
||
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: | ||
* | * This includes a method for handling multiple requests while waiting for asynchronous data requests to come back. | ||
<lsl> | <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 | default | ||
{ | { | ||
Line 79: | Line 91: | ||
else if (method == "GET") | else if (method == "GET") | ||
{ | { | ||
if ( | if (!scanning) | ||
{ | { | ||
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() | ||
{ | { | ||
send_response("There is no one here."); | |||
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); | ||
} | } | ||
send_response(output); | |||
scanning = FALSE; | |||
} | } | ||
} | } |
Revision as of 09: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>