LSL HTTP server/examples/kurais stupid web status updater
What
- Based on Kellys stupid web status updater.
- Isn't so stupid as Kellys, i hope. *lol*
- Kills me not, this is my first try with python xD
- Uses html forms, python and LSL.
- Fixed the cgi error bug with empty messages
- Add status reports for write to file error und success URL update
index.html
A simple webform that sends the input to our cgi. <html4strict><html>
<body>
<form ACTION="cgi-bin/post.cgi" METHOD="GET"> <textarea name="Message" rows="5" cols="40" onfocus="this.value=; this.onfocus=null;">Enter your status update here.</textarea>
<INPUT TYPE="submit" title="FOO"> </form>
<body>
</html></html4strict>
post.cgi
- That file needs to be readable and writable by your cgi. Depending on your setup something like this might work:
- touch my_url
- chmod 600 my_url
<python>
- !/usr/bin/python
- Orginal written by Kelly Linden #
- Modified by Kuraiko Yoshikawa (2009/07/28) #
import cgi, urllib2, urllib import cgitb cgitb.enable()
- This file needs to be readable and writable from this cgi
file_name = "my_url"
form = cgi.FieldStorage()
- Set the URL of your form
url = "enter your form url"
- If we haven't a Message or URL let the user know it and redirect to the form
if not form.has_key("Message") and not form.has_key("URL"):
print "Content-Type: text/html" print print "<html><head><meta http-equiv=\"refresh\" content=\"5; URL=%s\"></head>" %url print "<body style=\"text-align: center; margin-top: 20px;\">" print "Please fill in the message field.
<a href=\"%s\">Redirection to the form in 5 seconds</a>" %url print "</body></html>"
- If we have URL param then this is an URL update
elif form.has_key("URL"):
# Intercept errors try: # Write the url to the file, overwriting the existing file. f = open(file_name,'w') f.write(form["URL"].value) # Let the caller know it worked. print "Content-Type: text/html" print print "OK" except: # it has an error. print "Content-Type: text/html" print print "ERROR|%s" %file_name
- We have Message then this is a status update.
else:
# Redirect back to the form print "Status: 302 Moved" print "Location: %s" %url print # Read in the url from the file f = open(file_name,'r') base_url = f.read() # Build the complete url with query args. message = form["Message"].value args = "?Message=%s" % urllib.quote(message) # Make the request, giving the status to the script. response = urllib2.urlopen(base_url + args)
</python>
status.lsl
<lsl>
//////////////////////////////////////////////// // Orginal written by Kelly Linden // // Modified by Kuraiko Yoshikawa (2009/07/28) // ////////////////////////////////////////////////
// Set this to whatever text you want above your status string header = "My Status:\n"; // This is the url to the post.cgi from above string updater_url = "http://kuraiko.zeitenwerk.de/test/test.py";
// The magic changed flags to know when to re-request an url // CHANGED_REGION | CHANGED_REGION_START | CHANGED_TELEPORT integer CHANGED_URL = 1792;
key request; // Setup run anytime we think our url has been lost. setup() {
llSetObjectName("HTTP Server: Status Updates"); llRequestURL();
}
// Debug incoming requests to see all header information. debug(key id, string method, string body) {
llOwnerSay(method + ": " + body); list headers = ["x-script-url","x-path-info","x-query-string","x-remote-ip","user-agent"]; integer i; for (i=0;i<5;++i) { llOwnerSay(llList2String(headers,i) + ": " + llGetHTTPHeader(id,llList2String(headers,i))); }
}
default {
// These events mean we have lost any urls we had and need to run setup() state_entry() { setup(); } on_rez(integer n) { setup(); } changed(integer c) { if (c & (CHANGED_URL) ) setup(); } http_request(key id, string method, string body) { //debug(id, method, body); if (method == URL_REQUEST_GRANTED) { // Register our url for new status updates. request = llHTTPRequest(updater_url + "?URL=" + body + "/",[],""); } else if (method == URL_REQUEST_DENIED) { // Might be good to have this email. llSay(0,"Something went wrong, no url. " + body); } else if (method == "GET") { // Process a status update by parsing the query string string t = llGetHTTPHeader(id,"x-query-string"); list l = llParseString2List(t,["?","=","&"],[]); // We want the value after Message integer i = llListFindList(l,["Message"]) + 1; // If there was no Message argument then i = (-1) + 1 => 0. // As long as i > 0 we found Message so put up whatever came next as the status. if (i > 0) { llSetText(header + llUnescapeURL(llList2String(l,i)),<1,1,0>,1); llHTTPResponse(id,200,"OK"); } else { llHTTPResponse(id,400,"Must Specify a message!"); } } else { llHTTPResponse(id,405,"Method unsupported"); } } http_response(key request_id, integer status, list meta, string body) { if(request_id == request) { list t = llParseString2List(body, ["|"], [""]); string t0 = llStringTrim(llList2String(t, 0), STRING_TRIM); string t1 = llStringTrim(llList2String(t, 1), STRING_TRIM); if(t0 == "OK") { llSay(0, "URL successfully updated."); } else if (t0 == "ERROR") { llSay(0, "Can't write the URL to the file '" + t1 + "'. Please check if the file exists and the script has write permissions."); } else { llSay(0, "Something went wrong.\n" + body); } } }
}
</lsl>