summaryrefslogtreecommitdiff
path: root/repoze/bfg/request.py
diff options
context:
space:
mode:
authorChris McDonough <chrism@agendaless.com>2009-06-11 03:15:15 +0000
committerChris McDonough <chrism@agendaless.com>2009-06-11 03:15:15 +0000
commitdfc2b65c1b6d2f938f68b7868a14d8f9a4faab9e (patch)
treef3241401b7175a401e00286b11e3efe3c21f5093 /repoze/bfg/request.py
parentf8b0065b6ede54424d7a7b49f9f113e87634b5ab (diff)
downloadpyramid-dfc2b65c1b6d2f938f68b7868a14d8f9a4faab9e.tar.gz
pyramid-dfc2b65c1b6d2f938f68b7868a14d8f9a4faab9e.tar.bz2
pyramid-dfc2b65c1b6d2f938f68b7868a14d8f9a4faab9e.zip
Merge unifyroutesandtraversal branch into trunk
Diffstat (limited to 'repoze/bfg/request.py')
-rw-r--r--repoze/bfg/request.py144
1 files changed, 94 insertions, 50 deletions
diff --git a/repoze/bfg/request.py b/repoze/bfg/request.py
index 71f639626..e5482848b 100644
--- a/repoze/bfg/request.py
+++ b/repoze/bfg/request.py
@@ -1,7 +1,14 @@
from zope.interface import implements
from webob import Request as WebobRequest
-import repoze.bfg.interfaces
+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.threadlocal import manager
@@ -73,6 +80,25 @@ def current_request():
"""
return manager.get()['request']
+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 = route.request_factories
+ else:
+ request_factories = DEFAULT_REQUEST_FACTORIES
+
+ try:
+ request_factory = request_factories[method]['factory']
+ except KeyError:
+ request_factory = request_factories[None]['factory']
+
+ return request_factory(environ)
+
def make_request_ascii(event):
""" An event handler that causes the request charset to be ASCII;
used as an INewRequest subscriber so code written before 0.7.0 can
@@ -80,53 +106,71 @@ def make_request_ascii(event):
request = event.request
request.charset = None
-class Request(WebobRequest):
- implements(repoze.bfg.interfaces.IRequest)
- charset = 'utf-8'
-
-# We use 'precooked' Request subclasses that correspond to HTTP
-# request methods within ``router.py`` when constructing a request
-# object 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). These
-# classes are *not* APIs. None of these classes, nor the
-# ``HTTP_METHOD_FACTORIES`` or ``HTTP_METHOD_INTERFACES`` lookup dicts
-# should be imported directly by user code.
-
-class GETRequest(WebobRequest):
- implements(repoze.bfg.interfaces.IGETRequest)
- charset = 'utf-8'
-
-class POSTRequest(WebobRequest):
- implements(repoze.bfg.interfaces.IPOSTRequest)
- charset = 'utf-8'
-
-class PUTRequest(WebobRequest):
- implements(repoze.bfg.interfaces.IPUTRequest)
- charset = 'utf-8'
-
-class DELETERequest(WebobRequest):
- implements(repoze.bfg.interfaces.IDELETERequest)
- charset = 'utf-8'
-
-class HEADRequest(WebobRequest):
- implements(repoze.bfg.interfaces.IHEADRequest)
- charset = 'utf-8'
-
-HTTP_METHOD_FACTORIES = {
- 'GET':GETRequest,
- 'POST':POSTRequest,
- 'PUT':PUTRequest,
- 'DELETE':DELETERequest,
- 'HEAD':HEADRequest,
- }
-
-HTTP_METHOD_INTERFACES = {
- 'GET':repoze.bfg.interfaces.IGETRequest,
- 'POST':repoze.bfg.interfaces.IPOSTRequest,
- 'PUT':repoze.bfg.interfaces.IPUTRequest,
- 'DELETE':repoze.bfg.interfaces.IDELETERequest,
- 'HEAD':repoze.bfg.interfaces.IHEADRequest,
- }
+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:
+ default_iface = InterfaceClass('%s_IRequest' % name)
+ get_iface = InterfaceClass('%s_IGETRequest' % name, (default_iface,))
+ post_iface = InterfaceClass('%s_IPOSTRequest' % name, (default_iface,))
+ put_iface = InterfaceClass('%s_IPUTRequest' % name, (default_iface,))
+ delete_iface = InterfaceClass('%s_IDELETERequest' % name,
+ (default_iface,))
+ head_iface = InterfaceClass('%s_IHEADRequest' % name, (default_iface))
+
+ class Request(WebobRequest):
+ implements(default_iface)
+ 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'
+
+ class HEADRequest(WebobRequest):
+ implements(head_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()
+