Beispiel #1
0
def generate_response(instance_path):

    profiler = None

    # capture stdout
    real_stdout = sys.stdout
    sys.stdout = StringIO.StringIO()
    try:
        try:
            system.setup(instance_path)
            session.load_session()
            user.setup()
            manager.setup()

            system.subject = get_subject()

            visited(system.subject, session.sid)

            csrf_token = data.pop('csrf_token',None)
            if request.method == 'POST' and system.csrf_validation:
                if csrf_token == session.csrf_token:
                    del session.csrf_token
                else:
                    raise CrossSiteRequestForgeryAttempt('expected:%s got:%s' % (session.csrf_token, csrf_token))

            requested_app_name = manager.requested_app_name()
            default_app_name   = manager.default_app_name()

            os.chdir(system.config.sites_path)

            if not request.route:
                request.route.append(default_app_name)

            if manager.can_run(requested_app_name):
                system.app = manager.get_app(requested_app_name)

                profiler = system.profile and cProfile.Profile()
                if profiler:
                    profiler.enable()

                response = system.app.run()

                if profiler:
                    profiler.disable()

            elif not requested_app_name:
                system.app = manager.get_app(default_app_name)
                response = system.app.run()
            elif manager.can_run(default_app_name):
                response = redirect_to('/')
            else:
                response = Page('<H1>Page Missing</H1>Page not found').render()
                response.status = '404'

            session.save_session(response)

        except CrossSiteRequestForgeryAttempt:
            logger.security('cross site forgery attempt')
            if not (system.config.get('error','users','0')=='1' or user.is_developer or user.is_administrator):
                raise
            else:
                response = redirect_to('/')

        except SessionExpiredException:
            response = Page(load_template('system_application_session_expired', SESSION_EXPIRED_MESSAGE)).render()

        except:
            t = traceback.format_exc()
            logger.error(t)
            if system.show_errors or user.is_developer or user.is_administrator:
                msg = load_template('system_application_error_developer', STANDARD_ERROR_MESSAGE)
                response = Page(msg % dict(message=t)).render()
            else:
                msg = load_template('system_application_error_user', FRIENDLY_ERROR_MESSAGE)
                response = Page(msg).render()

        if profiler:
            stats_s = StringIO.StringIO()
            sortby = 'cumulative'
            ps = pstats.Stats(profiler, stream=stats_s)
            ps.sort_stats(sortby)
            ps.print_stats(.1)
            t = stats_s.getvalue()
            t = t.replace(system.lib_path, '~zoom'
                    ).replace('/usr/lib/python2.7/dist-packages/','~'
                            ).replace('/usr/local/lib/python2.7/dist-packages/','~')
            print t
    finally:
        printed_output = sys.stdout.getvalue()
        sys.stdout.close()
        sys.stdout = real_stdout
        if system.logging:
            logger.complete()

    if hasattr(response,'printed_output'):
        response.printed_output = printed_output.replace('<','&lt;').replace('>','&gt;')

    return response