summaryrefslogtreecommitdiff
path: root/repoze/bfg/request.py
diff options
context:
space:
mode:
authorChris McDonough <chrism@agendaless.com>2009-09-06 03:36:59 +0000
committerChris McDonough <chrism@agendaless.com>2009-09-06 03:36:59 +0000
commitd66bfb5d1f1aef5cce4941b49740dbd136c95605 (patch)
tree0204e233befdb8ad99332e498308468015f3558e /repoze/bfg/request.py
parent50df953770409dc9c9558c77bd5c0bbb17ac54f6 (diff)
downloadpyramid-d66bfb5d1f1aef5cce4941b49740dbd136c95605.tar.gz
pyramid-d66bfb5d1f1aef5cce4941b49740dbd136c95605.tar.bz2
pyramid-d66bfb5d1f1aef5cce4941b49740dbd136c95605.zip
Merge multiview2 branch to HEAD.
Diffstat (limited to 'repoze/bfg/request.py')
-rw-r--r--repoze/bfg/request.py113
1 files changed, 21 insertions, 92 deletions
diff --git a/repoze/bfg/request.py b/repoze/bfg/request.py
index 932789e0a..9b29d3e1f 100644
--- a/repoze/bfg/request.py
+++ b/repoze/bfg/request.py
@@ -1,36 +1,14 @@
-from zope.component import getUtility
from zope.interface import implements
-from webob import Request as WebobRequest
-
-from zope.deprecation import deprecated
from zope.interface.interface import InterfaceClass
-from repoze.bfg.interfaces import IRequest
-from repoze.bfg.interfaces import IGETRequest
-from repoze.bfg.interfaces import IPOSTRequest
-from repoze.bfg.interfaces import IPUTRequest
-from repoze.bfg.interfaces import IDELETERequest
-from repoze.bfg.interfaces import IHEADRequest
-from repoze.bfg.interfaces import IRequestFactories
+from zope.component import queryUtility
-def request_factory(environ):
- try:
- method = environ['REQUEST_METHOD']
- except KeyError:
- method = None
-
- if 'bfg.routes.route' in environ:
- route = environ['bfg.routes.route']
- request_factories = getUtility(IRequestFactories, name=route.name or '')
- else:
- request_factories = DEFAULT_REQUEST_FACTORIES
+from webob import Request as WebobRequest
- try:
- request_factory = request_factories[method]['factory']
- except KeyError:
- request_factory = request_factories[None]['factory']
+from zope.deprecation import deprecated
- return request_factory(environ)
+from repoze.bfg.interfaces import IRequest
+from repoze.bfg.interfaces import IRouteRequest
def make_request_ascii(event):
""" An event handler that causes the request charset to be ASCII;
@@ -39,75 +17,26 @@ def make_request_ascii(event):
request = event.request
request.charset = None
-def named_request_factories(name=None):
- # We use 'precooked' Request subclasses that correspond to HTTP
- # request methods when returning a request object from
- # ``request_factory`` rather than using ``alsoProvides`` to attach
- # the proper interface to an unsubclassed webob.Request. This
- # pattern is purely an optimization (e.g. preventing calls to
- # ``alsoProvides`` means the difference between 590 r/s and 690
- # r/s on a MacBook 2GHz). This method should be never imported
- # directly by user code; it is *not* an API.
- if name is None:
- default_iface = IRequest
- get_iface = IGETRequest
- post_iface = IPOSTRequest
- put_iface = IPUTRequest
- delete_iface = IDELETERequest
- head_iface = IHEADRequest
- else:
- IC = InterfaceClass
- default_iface = IC('%s_IRequest' % name, (IRequest,))
- get_iface = IC('%s_IGETRequest' % name, (default_iface, IGETRequest))
- post_iface = IC('%s_IPOSTRequest' % name, (default_iface, IPOSTRequest))
- put_iface = IC('%s_IPUTRequest' % name, (default_iface, IPUTRequest))
- delete_iface = IC('%s_IDELETERequest' % name, (default_iface,
- IDELETERequest))
- head_iface = IC('%s_IHEADRequest' % name, (default_iface,
- IHEADRequest,))
-
- class Request(WebobRequest):
- implements(default_iface)
- charset = 'utf-8'
+class Request(WebobRequest):
+ implements(IRequest)
+ charset = 'utf-8'
- class GETRequest(WebobRequest):
- implements(get_iface)
- charset = 'utf-8'
-
- class POSTRequest(WebobRequest):
- implements(post_iface)
- charset = 'utf-8'
-
- class PUTRequest(WebobRequest):
- implements(put_iface)
- charset = 'utf-8'
-
- class DELETERequest(WebobRequest):
- implements(delete_iface)
- charset = 'utf-8'
+def request_factory(environ):
+ if 'bfg.routes.route' in environ:
+ route = environ['bfg.routes.route']
+ factory = queryUtility(IRouteRequest, name=route.name)
+ if factory is not None:
+ return factory(environ)
+ return Request(environ)
- class HEADRequest(WebobRequest):
- implements(head_iface)
+def create_route_request_factory(name):
+ iface = InterfaceClass('%s_IRequest' % name, (IRouteRequest,))
+
+ class RouteRequest(WebobRequest):
+ implements(iface)
charset = 'utf-8'
- factories = {
- IRequest:{'interface':default_iface, 'factory':Request},
- IGETRequest:{'interface':get_iface, 'factory':GETRequest},
- IPOSTRequest:{'interface':post_iface, 'factory':POSTRequest},
- IPUTRequest:{'interface':put_iface, 'factory':PUTRequest},
- IDELETERequest:{'interface':delete_iface, 'factory':DELETERequest},
- IHEADRequest:{'interface':head_iface, 'factory':HEADRequest},
- None:{'interface':default_iface, 'factory':Request},
- 'GET':{'interface':get_iface, 'factory':GETRequest},
- 'POST':{'interface':post_iface, 'factory':POSTRequest},
- 'PUT':{'interface':put_iface, 'factory':PUTRequest},
- 'DELETE':{'interface':delete_iface, 'factory':DELETERequest},
- 'HEAD':{'interface':head_iface, 'factory':HEADRequest},
- }
-
- return factories
-
-DEFAULT_REQUEST_FACTORIES = named_request_factories()
+ return RouteRequest
from repoze.bfg.threadlocal import get_current_request as get_request # b/c