LSL HTTP server/examples/kurais stupid web status updater

From Second Life Wiki
< LSL HTTP server‎ | examples
Revision as of 16:39, 24 January 2015 by ObviousAltIsObvious Resident (talk | contribs) (language tags to <source>)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

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.

<html>
   <body>
      <div align="center">
         <br><br><br>
         <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>
            <P>
            <INPUT TYPE="submit" title="FOO">
         </form>
      </div>
   <body>
</html>

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
#!/usr/bin/python

##############################################
# Original 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 "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.<br><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 "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
 
# 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)

status.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);
            }
        }
    }
}