summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris McDonough <chrism@agendaless.com>2009-01-24 10:54:55 +0000
committerChris McDonough <chrism@agendaless.com>2009-01-24 10:54:55 +0000
commita1ccfe3a7671874551f319a857980076a06f0110 (patch)
tree9abd1a372012bef2139d7580a2601adea8f58d8c
parent7292d4d6a7d63c55a718dc50943bc9cbf90ae6fe (diff)
downloadpyramid-a1ccfe3a7671874551f319a857980076a06f0110.tar.gz
pyramid-a1ccfe3a7671874551f319a857980076a06f0110.tar.bz2
pyramid-a1ccfe3a7671874551f319a857980076a06f0110.zip
- Use a homegrown NotFound error instead of ``webob.HTTPNotFound``
(the latter is slow).
-rw-r--r--CHANGES.txt3
-rw-r--r--repoze/bfg/router.py22
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 = """<body>
+ <html><title>404 Not Found</title><body><h1>404 Not Found</h1>
+ <code>%s</code>
+ """ % 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