def _safe_serve(params, client_ip, client_hostname, cookie_data): # Note: Only logging imports here from config import WORK_DIR from logging import basicConfig as log_basic_config # Enable logging try: from config import LOG_LEVEL log_level = _convert_log_level(LOG_LEVEL) except ImportError: from logging import WARNING as LOG_LEVEL_WARNING log_level = LOG_LEVEL_WARNING log_basic_config(filename=path_join(WORK_DIR, 'server.log'), level=log_level) # Do the necessary imports after enabling the logging, order critical try: from common import ProtocolError, ProtocolArgumentError, NoPrintJSONError from dispatch import dispatch from jsonwrap import dumps from message import Messager from session import get_session, init_session, close_session, NoSessionError, SessionStoreError except ImportError: # Note: Heisenbug trap for #612, remove after resolved from logging import critical as log_critical from sys import path as sys_path log_critical('Heisenbug trap reports: ' + str(sys_path)) raise init_session(client_ip, cookie_data=cookie_data) response_is_JSON = True try: # Unpack the arguments into something less obscure than the # Python FieldStorage object (part dictonary, part list, part FUBAR) http_args = DefaultNoneDict() for k in params: # Also take the opportunity to convert Strings into Unicode, # according to HTTP they should be UTF-8 try: http_args[k] = params.getvalue(k) except TypeError as e: # Messager.error(e) Messager.error( 'protocol argument error: expected string argument %s, got %s' % (k, type( params.getvalue(k)))) raise ProtocolArgumentError # Dispatch the request json_dic = dispatch(http_args, client_ip, client_hostname) except ProtocolError as e: # Internal error, only reported to client not to log json_dic = {} e.json(json_dic) # Add a human-readable version of the error err_str = str(e) if err_str != '': Messager.error(err_str, duration=-1) except NoPrintJSONError as e: # Terrible hack to serve other things than JSON response_data = (e.hdrs, e.data) response_is_JSON = False # Get the potential cookie headers and close the session (if any) try: cookie_hdrs = get_session().cookie.hdrs() close_session() except SessionStoreError: Messager.error( "Failed to store cookie (missing write permission to brat work directory)?", -1) except NoSessionError: cookie_hdrs = None if response_is_JSON: response_data = ((JSON_HDR, ), dumps(Messager.output_json(json_dic))) return (cookie_hdrs, response_data)
json_dic = {} e.json(json_dic) # Add a human-readable version of the error err_str = str(e) if err_str != '': Messager.error(err_str, duration=-1) except NoPrintJSONError, e: # Terrible hack to serve other things than JSON response_data = (e.hdrs, e.data) response_is_JSON = False # Get the potential cookie headers and close the session (if any) try: cookie_hdrs = get_session().cookie.hdrs() close_session() except SessionStoreError: Messager.error("Failed to store cookie (missing write permission to brat work directory)?", -1) except NoSessionError: cookie_hdrs = None if response_is_JSON: response_data = ((JSON_HDR, ), dumps(Messager.output_json(json_dic))) return (cookie_hdrs, response_data) # Programmatically access the stack-trace def _get_stack_trace(): from traceback import print_exc try: