From d66bfb5d1f1aef5cce4941b49740dbd136c95605 Mon Sep 17 00:00:00 2001 From: Chris McDonough Date: Sun, 6 Sep 2009 03:36:59 +0000 Subject: Merge multiview2 branch to HEAD. --- repoze/bfg/request.py | 113 ++++++++++---------------------------------------- 1 file changed, 21 insertions(+), 92 deletions(-) (limited to 'repoze/bfg/request.py') 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 -- cgit v1.2.3