Subversion Repositories cryptochat

Rev

Blame | Last modification | View Log | RSS feed

  1. #!/usr/bin/env python
  2. import cgi
  3. import cgitb; cgitb.enable()
  4. import os
  5. import sys
  6. import datetime
  7. import urllib
  8.  
  9. print "Content-type: text/html"
  10.  
  11. sajax_debug_mode = False
  12. sajax_export_list = {}
  13. sajax_js_has_been_shown = False
  14.  
  15. form = cgi.FieldStorage()
  16.  
  17. def sajax_init():
  18.    pass
  19.    
  20. def sajax_handle_client_request():
  21.    func_name = form.getfirst('rs')
  22.    if func_name is None:
  23.       return
  24.      
  25.    # Bust cache in the head
  26.    print "Expires: Mon, 26 Jul 1997 05:00:00 GMT"  
  27.    print "Last-Modified: %s GMT" % datetime.datetime.utcnow().strftime(
  28.                                                       "%a, %d %m %H:%M:%S")
  29.    # always modified
  30.    print "Cache-Control: no-cache, must-revalidate" # HTTP/1.1
  31.    print "Pragma: no-cache"                         # HTTP/1.0
  32.    print
  33.    
  34.    if not func_name in sajax_export_list:
  35.       print "-:%s not callable" % func_name
  36.    else:
  37.       print "+:",
  38.       rsargs = form.getlist('rsargs[]')
  39.       result = sajax_export_list[func_name](*rsargs)
  40.       print result
  41.    sys.exit()
  42.      
  43. def sajax_get_common_js():
  44.    sajax_debug_modeJS = str(sajax_debug_mode).lower()
  45.    return """\
  46.                // remote scripting library
  47.                 // (c) copyright 2005 modernmethod, inc
  48.                 var sajax_debug_mode = %(sajax_debug_modeJS)s;
  49.                
  50.                 function sajax_debug(text) {
  51.                         if (sajax_debug_mode)
  52.                                 alert("RSD: " + text)
  53.                 }
  54.                
  55.                 function sajax_init_object() {
  56.                         sajax_debug("sajax_init_object() called..")
  57.                        
  58.                         var A;
  59.                         try {
  60.                                 A=new ActiveXObject("Msxml2.XMLHTTP");
  61.                         } catch (e) {
  62.                                 try {
  63.                                         A=new ActiveXObject("Microsoft.XMLHTTP");
  64.                                 } catch (oc) {
  65.                                         A=null;
  66.                                 }
  67.                         }
  68.                         if(!A && typeof XMLHttpRequest != "undefined")
  69.                                 A = new XMLHttpRequest();
  70.                         if (!A)
  71.                                 sajax_debug("Could not create connection object.");
  72.                         return A;
  73.                 }
  74.                 function sajax_do_call(func_name, url, args) {
  75.                         var i, x, n;
  76.                         for (i = 0; i < args.length-1; i++)
  77.                                 url = url + "&rsargs[]=" + escape(args[i]);
  78.                         url = url + "&rsrnd=" + new Date().getTime();
  79.                         x = sajax_init_object();
  80.                         x.open("GET", url, true);
  81.                         x.onreadystatechange = function() {
  82.                                 if (x.readyState != 4)
  83.                                         return;
  84.                                 sajax_debug("received " + x.responseText);
  85.                                
  86.                                 var status;
  87.                                 var data;
  88.                                 status = x.responseText.charAt(0);
  89.                                 data = x.responseText.substring(2);
  90.                                 if (status == "-")
  91.                                         alert("Error: " + data);
  92.                                 else  
  93.                                         args[args.length-1](data);
  94.                         }
  95.                         x.send(null);
  96.                         sajax_debug(func_name + " url = " + url);
  97.                         sajax_debug(func_name + " waiting..");
  98.                         delete x;
  99.                 }                
  100.   """ % locals()
  101.  
  102. def sajax_show_common_js():
  103.    print sajax_get_common_js()
  104.  
  105. def sajax_esc(val):
  106.    return val.replace('"', '\\\\"')    
  107.  
  108. def sajax_get_one_stub(func_name):
  109.    uri = os.environ['SCRIPT_NAME']
  110.    if os.environ.has_key('QUERY_STRING'):
  111.       uri += "?" + os.environ['QUERY_STRING'] + "&rs=%s" % urllib.quote_plus(func_name)
  112.    else:
  113.       uri += "?rs=%s" % urllib.quote_plus(func_name)
  114.      
  115.    escapeduri = sajax_esc(uri)
  116.    return """
  117.   // wrapper for %(func_name)s
  118.   function x_%(func_name)s(){
  119.      // count args; build URL
  120.      
  121.      sajax_do_call("%(func_name)s",
  122.                    "%(escapeduri)s",
  123.                    x_%(func_name)s.arguments);
  124.      }
  125.      
  126.      """ % locals()
  127.  
  128. def sajax_show_one_stub(func_name):
  129.    print sajax_get_one_stub(func_name)
  130.  
  131. def sajax_export(*args):
  132.    decorated = [(f.func_name, f) for f in args]
  133.    sajax_export_list.update(dict(decorated))
  134.      
  135. def sajax_get_javascript():
  136.    global sajax_js_has_been_shown
  137.  
  138.    html = ''
  139.    if not sajax_js_has_been_shown:
  140.       html += sajax_get_common_js()
  141.       sajax_js_has_been_shown = True
  142.    
  143.    for func_name in sajax_export_list.iterkeys():
  144.       html += sajax_get_one_stub(func_name)
  145.  
  146.    return html
  147.  
  148. def sajax_show_javascript():
  149.    print sajax_get_javascript()
  150.