#!python import cgi, sys, urllib htmlReturn = '''Content-type: text/html jsrsPayload:
''' htmlError = ''' %s ''' def jsrsDispatch (validFuncs): jsrsQuery = cgi.FieldStorage () func, args = jsrsBuildFunc (validFuncs, jsrsQuery) if func: retval = apply (func, args) print htmlReturn % (jsrsQuery['C'].value, jsrsEscape(retval)) else: jsrsReturnError("function builds as empty string",jsrsQuery['C'].value) def jsrsEscape (str): str = str.replace ('&', '&') str = str.replace ('/', r'\/') return str # ************************************************************** # * user functions # ************************************************************** def jsrsReturnError (str, code): cleanStr = str.replace ("'", r"\'") cleanStr = cleanStr.replace ("\'","\\'") print htmlError % (code, urllib.quote(str), cleanStr) sys.exit() def jsrsBuildFunc (validFuncs, jsrsQuery): func = None if jsrsQuery.has_key('F'): func = jsrsQuery['F'].value params = [] # make sure func is in the dispatch list for vf in validFuncs: if vf.__name__ == func: func = vf break if not func: jsrsReturnError ('%s is not a valid function' % func, jsrsQuery['C'].value) i = 0 while jsrsQuery.has_key('P%s' % i): parm = jsrsQuery['P%s' % i].value params.append (parm [1:-1]) i += 1 return func, params ############################## ## OO version ############################## class JSRS: def __init__(self): self._funcs = [] self._query = None def addFunction (self, f): self._funcs.append (f) def dispatch (self): self._query = cgi.FieldStorage () func, args = self._buildFunc () if func: retval = apply (func, args) print htmlReturn % (self._query['C'].value, self._escape(retval)) else: self._returnError("function builds as empty string") def _escape (self, str): str = str.replace ('&', '&') str = str.replace ('/', r'\/') return str def _returnError (self, err): cleanStr = err.replace ("'", r"\'") cleanStr = cleanStr.replace ("\'","\\'") print htmlError % (self._query['C'].value, urllib.quote(err), cleanStr) sys.exit() def _buildFunc (self): func = None params = [] if self._query.has_key('F'): func = self._query['F'].value # make sure func is in the dispatch list for vf in self._funcs: if vf.__name__ == func: func = vf break if not func: self._returnError ('%s is not a valid function' % func) i = 0 while self._query.has_key('P%s' % i): parm = self._query['P%s' % i].value params.append (parm [1:-1]) i += 1 return func, params