LSL HTTP server/examples/kurais stupid web status updater

From Second Life Wiki
Jump to navigation Jump to search

What

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>

  1. !/usr/bin/python
  1. Original written by Kelly Linden #
  2. Modified by Kuraiko Yoshikawa (2009/07/28) #

import cgi, urllib2, urllib import cgitb cgitb.enable()


  1. This file needs to be readable and writable from this cgi

file_name = "my_url"

form = cgi.FieldStorage()

  1. Set the URL of your form

url = "enter your form url"


  1. If we haven't a Message or URL let the user know it and redirect to the form

if "Message" not in form and "URL" not in form:

       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>"
  1. If we have URL param then this is an URL update

elif "URL" in form:

       # 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

  1. 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>

//////////////////////////////////////////////// // Original 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 = "<url to your python script>";

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