diff --git a/djblets/webapi/errors.py b/djblets/webapi/errors.py
index e31a6385365c70b4214734fc5c67c0379be0cf05..062ac57f1db568b1effb79bf48aa8ad8f59def5b 100644
--- a/djblets/webapi/errors.py
+++ b/djblets/webapi/errors.py
@@ -35,6 +35,14 @@ class WebAPIError(object):
         self.http_status = http_status
         self.headers = headers
 
+    def with_overrides(self, msg=None, headers=None):
+        """Overrides the default message and/or headers for an error."""
+        if headers is None:
+            headers = self.headers
+
+        return WebAPIError(self.code, msg or self.msg, self.http_status,
+                           headers)
+
     def with_message(self, msg):
         """
         Overrides the default message for a WebAPIError with something
@@ -43,8 +51,8 @@ class WebAPIError(object):
         Example:
         return ENABLE_EXTENSION_FAILED.with_message('some error message')
         """
-        self.msg = msg
-        return self
+        return self.with_overrides(msg)
+
 
 WWW_AUTHENTICATE_HEADERS = {
     'WWW-Authenticate': 'Basic realm="Web API"',
diff --git a/djblets/webapi/tests.py b/djblets/webapi/tests.py
index d9f392f4a26e521ab076ce862e7c7df88f07f567..e4aa9f8cadcda3fbfcc684c836202cd7b309c73e 100644
--- a/djblets/webapi/tests.py
+++ b/djblets/webapi/tests.py
@@ -25,9 +25,55 @@
 from django.test.client import RequestFactory
 
 from djblets.util.testing import TestCase
+from djblets.webapi.errors import WebAPIError
 from djblets.webapi.resources import WebAPIResource, unregister_resource
 
 
+class WebAPIErrorTests(TestCase):
+    def test_with_message(self):
+        """Testing WebAPIError.with_message"""
+        orig_msg = 'Original message'
+        new_msg = 'New message'
+        headers = {
+            'foo': 'bar',
+        }
+
+        orig_error = WebAPIError(123, orig_msg, http_status=500,
+                                 headers=headers)
+        new_error = orig_error.with_message(new_msg)
+
+        self.assertNotEqual(orig_error, new_error)
+        self.assertEqual(new_error.msg, new_msg)
+        self.assertEqual(new_error.headers, headers)
+        self.assertEqual(new_error.code, orig_error.code)
+        self.assertEqual(new_error.http_status, orig_error.http_status)
+        self.assertEqual(orig_error.msg, orig_msg)
+        self.assertEqual(orig_error.headers, headers)
+
+    def test_with_overrides(self):
+        """Testing WebAPIError.with_overrides"""
+        orig_msg = 'Original message'
+        new_msg = 'New message'
+        orig_headers = {
+            'foo': 'bar',
+        }
+        new_headers = {
+            'abc': '123',
+        }
+
+        orig_error = WebAPIError(123, orig_msg, http_status=500,
+                                 headers=orig_headers)
+        new_error = orig_error.with_overrides(new_msg, headers=new_headers)
+
+        self.assertNotEqual(orig_error, new_error)
+        self.assertEqual(new_error.msg, new_msg)
+        self.assertEqual(new_error.headers, new_headers)
+        self.assertEqual(new_error.code, orig_error.code)
+        self.assertEqual(new_error.http_status, orig_error.http_status)
+        self.assertEqual(orig_error.msg, orig_msg)
+        self.assertEqual(orig_error.headers, orig_headers)
+
+
 class WebAPIResourceTests(TestCase):
     def setUp(self):
         self.factory = RequestFactory()
