""" This is a simple HTTP daemon for the web interface. Steals generously from CGIHTTPServer.py """ # $Header: /cvsroot/dbagg2/lib/dbagg2/httpd.py,v 1.4 2004/03/25 20:41:24 deusx Exp $ import os, sys, cgi, time, logging, urllib, traceback from BaseHTTPServer import HTTPServer from CGIHTTPServer import CGIHTTPRequestHandler from dbagg2.config import * import dbagg2.web global log log = logging.getLogger("%s"%__name__) class RequestHandler(CGIHTTPRequestHandler): def translate_path(self, path): # TODO: Why doesn't os.path.join work here? #new_path = os.path.join('htdocs', path) new_path = 'htdocs%s' % path return CGIHTTPRequestHandler.translate_path(self, new_path) def is_cgi(self): qpos = self.path.find('?') if qpos == -1: qpos = len(self.path) path, query = self.path[:qpos], self.path[qpos+1:] if path == '/' or '.cgi' in path: self.cgi_info = ['/', 'app.cgi?%s' % query] return True else: return False def run_cgi(self): """Execute a method in the web module.""" self.buildCGIEnv() self.send_response(200, "Script output follows") save_stdin, save_stdout, save_stderr = sys.stdin, sys.stdout, sys.stderr try: try: sys.stdout, sys.stdin = self.wfile, self.rfile form = cgi.FieldStorage() dbagg2.web.dispatch(form) finally: sys.stdin, sys.stdout, sys.stderr = save_stdin, save_stdout, save_stderr except: raise #exc, e, tb = sys.exc_info() #self.log_error("Unexpected error while processing request: %s / %s / %s", # (exc, e, "".join(traceback.format_tb(tb)))) def log_error(self, format, *args): CGIHTTPRequestHandler.log_error(self, format, *args) log.error(format % args) def log_message(self, format, *args): CGIHTTPRequestHandler.log_message(self, format, *args) log.info(format % args) def log_debug(self, format, *args): CGIHTTPRequestHandler.log_message(self, format, *args) log.debug(format % args) def buildCGIEnv(self): dir, rest = self.cgi_info i = rest.rfind('?') if i >= 0: rest, query = rest[:i], rest[i+1:] else: query = '' i = rest.find('/') if i >= 0: script, rest = rest[:i], rest[i:] else: script, rest = rest, '' if dir != '/': scriptname = dir + '/' + script else: scriptname = '/' + script scriptfile = self.translate_path(scriptname) # Reference: http://hoohoo.ncsa.uiuc.edu/cgi/env.html # XXX Much of the following could be prepared ahead of time! env = {} env['SERVER_SOFTWARE'] = self.version_string() env['SERVER_NAME'] = self.server.server_name env['GATEWAY_INTERFACE'] = 'CGI/1.1' env['SERVER_PROTOCOL'] = self.protocol_version env['SERVER_PORT'] = str(self.server.server_port) env['REQUEST_METHOD'] = self.command uqrest = urllib.unquote(rest) env['PATH_INFO'] = uqrest env['PATH_TRANSLATED'] = self.translate_path(uqrest) env['SCRIPT_NAME'] = scriptname env['QUERY_STRING'] = query host = self.address_string() if host != self.client_address[0]: env['REMOTE_HOST'] = host env['REMOTE_ADDR'] = self.client_address[0] # XXX AUTH_TYPE # XXX REMOTE_USER # XXX REMOTE_IDENT if self.headers.typeheader is None: env['CONTENT_TYPE'] = self.headers.type else: env['CONTENT_TYPE'] = self.headers.typeheader length = self.headers.getheader('content-length') if length: env['CONTENT_LENGTH'] = length accept = [] for line in self.headers.getallmatchingheaders('accept'): if line[:1] in "\t\n\r ": accept.append(line.strip()) else: accept = accept + line[7:].split(',') env['HTTP_ACCEPT'] = ','.join(accept) ua = self.headers.getheader('user-agent') if ua: env['HTTP_USER_AGENT'] = ua co = filter(None, self.headers.getheaders('cookie')) if co: env['HTTP_COOKIE'] = ', '.join(co) os.environ.update(env) if __name__ == '__main__': srvobj = HTTPServer(('',conf.getint('httpd', 'port')), RequestHandler) srvobj.serve_forever()