# $Id: CGIHandler.py 2028 2006-01-16 23:39:04Z zzzeek $ # CGIHandler.py - handles cgi requests for Myghty # Copyright (C) 2004, 2005 Michael Bayer mike_mp@zzzcomputing.com # # This module is part of Myghty and is released under # the MIT License: http://www.opensource.org/licenses/mit-license.php # # import myghty.interp import myghty.request import myghty.resolver import myghty.session as session import myghty.exception as exception import myghty.http.HTTPHandler as HTTPHandler from myghty.util import * import os, sys, cgi def handle(*args, **params): return HTTPHandler.handle_http(CGIHandler, *args, **params) def get_handler(interpreter_name = None, **params): return HTTPHandler.get_handler(CGIHandler, interpreter_name = interpreter_name, **params) class CGIHandler(HTTPHandler.HTTPHandler): def __init__(self, **params): HTTPHandler.HTTPHandler.__init__(self, None, sys.stderr, **params) def do_get_init_params(self, httpreq, **params): return params def do_get_resolver(self, **params): return CGIResolver(**params) def do_make_request_impl(self, httpreq, **params): return CGIRequestImpl(httpreq, **params) def do_get_component(self, httpreq, **params): return httpreq.path_info def do_handle_result(self, httpreq, status_code, reason): httpreq.send_http_header() if status_code != HTTPHandler.HTTP_OK: sys.stdout.write(""" Response code %d (%s)
Page: "%s" """ % (status_code, reason or "no message", httpreq.path_info)) def handle(self, httpreq = None, interp = None, request_impl = None, component = None, **params): if httpreq is None: httpreq = CGIHTTPRequest() HTTPHandler.HTTPHandler.handle(self, httpreq, interp, request_impl, component, **params) class CGIHTTPRequest(HTTPHandler.HTTPRequest): """simulates a mod_python request for use in non-mod-python applications. only a minimal featureset is here currently. """ def __init__(self): HTTPHandler.HTTPRequest.__init__(self) self.fieldstorage = cgi.FieldStorage(keep_blank_values = True) env = os.environ for key in env.keys(): if key[0:4] == 'HTTP': self.headers_in.add(key[5:], env[key]) self.content_type = 'text/html' self.method = env['REQUEST_METHOD'] self.filename = env['PATH_TRANSLATED'] self.args = env.get('QUERY_STRING', None) self.path_info = env.get('PATH_INFO', '/') self.out_buffer = sys.stdout def do_send_headers(self): headers = self.get_response_headers() headers.get_output(self.out_buffer) self.out_buffer.write("\n") class CGIResolver(HTTPHandler.HTTPResolver):pass class CGIWriter(HTTPHandler.HTTPWriter):pass class CGIRequestImpl(HTTPHandler.HTTPRequestImpl): def __init__(self, httpreq, **params): HTTPHandler.HTTPRequestImpl.__init__(self, httpreq, sys.stderr, sys.stderr, **params) def do_get_out_buffer(self, httpreq, out_buffer = None, **params): if out_buffer is not None: return CGIWriter(httpreq, out_buffer) else: return CGIWriter(httpreq, httpreq.out_buffer) def do_make_request_args(self, httpreq, **params): return self.request_args_from_fieldstorage(httpreq.fieldstorage)