From 75c30dfe18b26ca04efae2acbe35052fa0d93ed6 Mon Sep 17 00:00:00 2001
From: Michael Merickel <michael@merickel.org>
Date: Sun, 18 Jun 2017 08:46:27 +0200
Subject: [PATCH] Merge branch 'master' into pr/3034

---
 pyramid/router.py |   43 +++++++++++++++++++++++++++++++------------
 1 files changed, 31 insertions(+), 12 deletions(-)

diff --git a/pyramid/router.py b/pyramid/router.py
index 8b7b7b6..a02ff17 100644
--- a/pyramid/router.py
+++ b/pyramid/router.py
@@ -1,3 +1,4 @@
+import sys
 from zope.interface import (
     implementer,
     providedBy,
@@ -24,6 +25,7 @@
     BeforeTraversal,
     )
 
+from pyramid.compat import reraise
 from pyramid.httpexceptions import HTTPNotFound
 from pyramid.request import Request
 from pyramid.view import _call_view
@@ -190,13 +192,21 @@
         """
         request.registry = self.registry
         request.invoke_subrequest = self.invoke_subrequest
-        return self.invoke_request(
-            request,
-            _use_tweens=use_tweens,
-            _apply_extensions=True,
-        )
+        extensions = self.request_extensions
+        if extensions is not None:
+            apply_request_extensions(request, extensions=extensions)
+        return self.invoke_request(request, _use_tweens=use_tweens)
 
     def make_request(self, environ):
+        """
+        Configure a request object for use by the router.
+
+        The request is created using the configured
+        :class:`pyramid.interfaces.IRequestFactory` and will have any
+        configured request methods / properties added that were set by
+        :meth:`pyramid.config.Configurator.add_request_method`.
+
+        """
         request = self.request_factory(environ)
         request.registry = self.registry
         request.invoke_subrequest = self.invoke_subrequest
@@ -205,8 +215,12 @@
             apply_request_extensions(request, extensions=extensions)
         return request
 
-    def invoke_request(self, request,
-                       _use_tweens=True, _apply_extensions=False):
+    def invoke_request(self, request, _use_tweens=True):
+        """
+        Execute a request through the request processing pipeline and
+        return the generated response.
+
+        """
         registry = self.registry
         has_listeners = self.registry.has_listeners
         notify = self.registry.notify
@@ -222,9 +236,6 @@
         try:
 
             try:
-                extensions = self.request_extensions
-                if _apply_extensions and extensions is not None:
-                    apply_request_extensions(request, extensions=extensions)
                 response = handle_request(request)
 
                 if request.response_callbacks:
@@ -252,7 +263,15 @@
         response = self.execution_policy(environ, self)
         return response(environ, start_response)
 
-
 def default_execution_policy(environ, router):
     request = router.make_request(environ)
-    return router.invoke_request(request)
+    try:
+        return router.invoke_request(request)
+    except Exception:
+        exc_info = sys.exc_info()
+        try:
+            return request.invoke_exception_view(exc_info)
+        except HTTPNotFound:
+            reraise(*exc_info)
+        finally:
+            del exc_info  # avoid local ref cycle

--
Gitblit v1.9.3