[Checkins] SVN: zope.testbrowser/trunk/ Tweak WSGI handleErrors implementation

Brian Sutherland jinty at web.de
Fri Sep 9 02:17:35 EST 2011


Log message for revision 122757:
  Tweak WSGI handleErrors implementation
  
  - When ``Browser.handleErrors`` is False, also add ``x-wsgiorg.throw_errors``
    to the environment. http://wsgi.org/wsgi/Specifications/throw_errors 
  
  - Prevent WebTest from always sending ``paste.throw_errors=True`` in the
    environment by setting it to ``None`` when ``Browser.handleErrors`` is
    ``True``.  This makes it easier to test error pages.
  

Changed:
  U   zope.testbrowser/trunk/CHANGES.txt
  U   zope.testbrowser/trunk/src/zope/testbrowser/tests/test_wsgi.py
  U   zope.testbrowser/trunk/src/zope/testbrowser/wsgi.py

-=-
Modified: zope.testbrowser/trunk/CHANGES.txt
===================================================================
--- zope.testbrowser/trunk/CHANGES.txt	2011-09-09 04:56:16 UTC (rev 122756)
+++ zope.testbrowser/trunk/CHANGES.txt	2011-09-09 07:17:34 UTC (rev 122757)
@@ -5,8 +5,13 @@
 4.0.3 (unreleased)
 ------------------
 
-- None yet.
+- When ``Browser.handleErrors`` is False, also add ``x-wsgiorg.throw_errors``
+  to the environment. http://wsgi.org/wsgi/Specifications/throw_errors 
 
+- Prevent WebTest from always sending ``paste.throw_errors=True`` in the
+  environment by setting it to ``None`` when ``Browser.handleErrors`` is
+  ``True``.  This makes it easier to test error pages.
+
 4.0.2 (2011-05-25)
 ------------------
 

Modified: zope.testbrowser/trunk/src/zope/testbrowser/tests/test_wsgi.py
===================================================================
--- zope.testbrowser/trunk/src/zope/testbrowser/tests/test_wsgi.py	2011-09-09 04:56:16 UTC (rev 122756)
+++ zope.testbrowser/trunk/src/zope/testbrowser/tests/test_wsgi.py	2011-09-09 07:17:34 UTC (rev 122757)
@@ -77,6 +77,23 @@
         browser.open('http://bar.example.net')
         self.assertTrue(browser.contents.startswith('Hello world!\n'))
 
+    def test_handle_errors(self):
+        # http://wsgi.org/wsgi/Specifications/throw_errors
+        app = WSGITestApplication()
+        browser = zope.testbrowser.wsgi.Browser(wsgi_app=app)
+        browser.open('http://localhost/echo_one.html?var=x-wsgiorg.throw_errors')
+        self.assertEquals(browser.contents, 'None')
+        browser.open('http://localhost/echo_one.html?var=paste.throw_errors')
+        self.assertEquals(browser.contents, 'None')
+        browser.open('http://localhost/echo_one.html?var=wsgi.handleErrors')
+        self.assertEquals(browser.contents, 'None')
+        browser.handleErrors = False
+        browser.open('http://localhost/echo_one.html?var=x-wsgiorg.throw_errors')
+        self.assertEquals(browser.contents, 'True')
+        browser.open('http://localhost/echo_one.html?var=paste.throw_errors')
+        self.assertEquals(browser.contents, 'True')
+        browser.open('http://localhost/echo_one.html?var=wsgi.handleErrors')
+        self.assertEquals(browser.contents, 'False')
 
 class TestWSGILayer(unittest.TestCase):
 

Modified: zope.testbrowser/trunk/src/zope/testbrowser/wsgi.py
===================================================================
--- zope.testbrowser/trunk/src/zope/testbrowser/wsgi.py	2011-09-09 04:56:16 UTC (rev 122756)
+++ zope.testbrowser/trunk/src/zope/testbrowser/wsgi.py	2011-09-09 07:17:34 UTC (rev 122757)
@@ -75,11 +75,16 @@
 
         # Translate string to boolean.
         handle_errors = {'False': False}.get(handle_errors_header, True)
-        extra_environ = {}
+
+        # WebTest always sets 'paste.throw_errors' to True. Setting it to None
+        # here overrides that, but is UGLY. sigh.
+        extra_environ = {'paste.throw_errors': None}
+
         if not handle_errors:
             # There doesn't seem to be a "Right Way" to do this
             extra_environ['wsgi.handleErrors'] = False # zope.app.wsgi does this
             extra_environ['paste.throw_errors'] = True # the paste way of doing this
+            extra_environ['x-wsgiorg.throw_errors'] = True # http://wsgi.org/wsgi/Specifications/throw_errors
 
         scheme_key = 'X-Zope-Scheme'
         extra_environ['wsgi.url_scheme'] = headers.get(scheme_key, 'http')



More information about the checkins mailing list