Index: trac/core.py
===================================================================
--- trac/core.py	(revision 7773)
+++ trac/core.py	(working copy)
@@ -33,13 +33,13 @@
         error message.
         """
         Exception.__init__(self, message)
-        self.message = message
+        self.msg = message
         if title:
             self.title = title
         self.show_traceback = show_traceback
 
     def __unicode__(self):
-        return unicode(self.message)
+        return unicode(self.msg)
 
 class Interface(object):
     """Marker base class for extension point interfaces."""
Index: trac/web/api.py
===================================================================
--- trac/web/api.py	(revision 7773)
+++ trac/web/api.py	(working copy)
@@ -467,8 +467,14 @@
         if ctype not in ('application/x-www-form-urlencoded',
                          'multipart/form-data'):
             fp = StringIO('')
-
+        # Python 2.6 introduced a backwards incompatible change for
+        # FieldStorage where QUERY_STRING is no longer ignored for POST
+        # requests. We'll keep the pre 2.6 behaviour for now...
+        if self.method == 'POST':
+            qs_on_post = self.environ.pop('QUERY_STRING')
         fs = cgi.FieldStorage(fp, environ=self.environ, keep_blank_values=True)
+        if self.method == 'POST':
+            self.environ['QUERY_STRING'] = qs_on_post
         if fs.list:
             for name in fs.keys():
                 values = fs[name]
Index: trac/web/tests/api.py
===================================================================
--- trac/web/tests/api.py	(revision 7773)
+++ trac/web/tests/api.py	(working copy)
@@ -113,7 +113,23 @@
         req = Request(environ, None)
         self.assertEqual('test', req.read(size=4))
 
+    def test_qs_on_post(self):
+        """Make sure req.args parsing is consistent even after the backwards
+        incompatible change introduced in Python 2.6.
+        """
+        environ = self._make_environ(method='GET',
+                                     **{'QUERY_STRING': 'action=foo'})
+        req = Request(environ, None)
+        self.assertEqual('foo', req.args['action'])
+        environ = self._make_environ(method='POST',
+                                     **{'wsgi.input': StringIO('action=bar'),
+                                        'CONTENT_LENGTH': '10',
+                                        'CONTENT_TYPE': 'application/x-www-form-urlencoded',
+                                        'QUERY_STRING': 'action=foo'})
+        req = Request(environ, None)
+        self.assertEqual('bar', req.args['action'])
 
+
 def suite():
     suite = unittest.TestSuite()
     suite.addTest(unittest.makeSuite(RequestTestCase, 'test'))
Index: trac/util/tests/text.py
===================================================================
--- trac/util/tests/text.py	(revision 7773)
+++ trac/util/tests/text.py	(working copy)
@@ -36,14 +36,6 @@
         except ValueError, e:
             self.assertEquals(u, to_unicode(e))
 
-    def test_from_exception_using_str(self):
-        class PermissionError(StandardError):
-            def __str__(self):
-                return u'acc\xe8s interdit'
-        try:
-            raise PermissionError()
-        except PermissionError, e:
-            self.assertEquals(u'acc\xe8s interdit', to_unicode(e))
 
 class ExpandtabsTestCase(unittest.TestCase):
     def test_empty(self):

