From a1ccfe3a7671874551f319a857980076a06f0110 Mon Sep 17 00:00:00 2001 From: Chris McDonough Date: Sat, 24 Jan 2009 10:54:55 +0000 Subject: - Use a homegrown NotFound error instead of ``webob.HTTPNotFound`` (the latter is slow). --- CHANGES.txt | 3 +++ repoze/bfg/router.py | 22 +++++++++++++++++----- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index ab8b6febe..abd884923 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -19,6 +19,9 @@ Behavior Changes Implementation Changes ---------------------- +- Use a homegrown NotFound error instead of ``webob.HTTPNotFound`` + (the latter is slow). + - Various speed micro-tweaks. Bug Fixes diff --git a/repoze/bfg/router.py b/repoze/bfg/router.py index c9366477c..84f267791 100644 --- a/repoze/bfg/router.py +++ b/repoze/bfg/router.py @@ -5,7 +5,6 @@ from zope.component.event import dispatch from zope.interface import implements -from webob.exc import HTTPNotFound from webob.exc import HTTPUnauthorized from repoze.bfg.events import NewRequest @@ -40,8 +39,6 @@ from repoze.bfg.view import _view_execution_permitted _marker = object() -# 95090 function calls (95087 primitive calls) in 0.277 CPU seconds - class Router(object): """ The main repoze.bfg WSGI application. """ implements(IRouter) @@ -135,8 +132,9 @@ class Router(object): logger and logger.debug(msg) else: msg = request.url - app = HTTPNotFound(escape(msg)) - return app(environ, start_response) + notfound = NotFound(msg) + start_response(notfound.status, notfound.headerlist) + return notfound.app_iter registry.has_listeners and registry.notify(NewResponse(response)) @@ -150,6 +148,20 @@ class Router(object): finally: registry_manager.pop() +class NotFound(object): + """ Avoid using WebOb's NotFound WSGI response app; it's slow. """ + def __init__(self, msg=''): + html = """ + 404 Not Found

404 Not Found

+ %s + """ % msg + self.headerlist = [ + ('Content-Length', len(html) ), + ('Content-Type', 'text/html') + ] + self.app_iter = [html] + self.status = '404 Not Found' + def make_app(root_factory, package=None, filename='configure.zcml', options=None): """ Return a Router object, representing a ``repoze.bfg`` WSGI -- cgit v1.2.3