Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions Lib/test/test_xmlrpc.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import base64
import datetime
import decimal
import pickle
import sys
import time
import unittest
Expand Down Expand Up @@ -480,6 +481,29 @@ def test_dump_fault(self):
s = xmlrpclib.Marshaller().dumps(f)
self.assertRaises(xmlrpclib.Fault, xmlrpclib.loads, s)

def test_pickle(self):
# gh-71468
f = xmlrpclib.Fault(42, 'Test Fault')
for proto in range(pickle.HIGHEST_PROTOCOL + 1):
with self.subTest(proto=proto):
newf = pickle.loads(pickle.dumps(f, proto))
self.assertIs(type(newf), xmlrpclib.Fault)
self.assertEqual(newf.faultCode, 42)
self.assertEqual(newf.faultString, 'Test Fault')

def test_protocol_error_pickle(self):
# gh-71468
e = xmlrpclib.ProtocolError('localhost/RPC2', 500,
'Internal Server Error', {'X-Test': '1'})
for proto in range(pickle.HIGHEST_PROTOCOL + 1):
with self.subTest(proto=proto):
newe = pickle.loads(pickle.dumps(e, proto))
self.assertIs(type(newe), xmlrpclib.ProtocolError)
self.assertEqual(newe.url, 'localhost/RPC2')
self.assertEqual(newe.errcode, 500)
self.assertEqual(newe.errmsg, 'Internal Server Error')
self.assertEqual(newe.headers, {'X-Test': '1'})

def test_dotted_attribute(self):
# this will raise AttributeError because code don't want us to use
# private methods
Expand Down
4 changes: 2 additions & 2 deletions Lib/xmlrpc/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -201,7 +201,7 @@ class Error(Exception):
class ProtocolError(Error):
"""Indicates an HTTP protocol error."""
def __init__(self, url, errcode, errmsg, headers):
Error.__init__(self)
Error.__init__(self, url, errcode, errmsg, headers)
self.url = url
self.errcode = errcode
self.errmsg = errmsg
Expand Down Expand Up @@ -233,7 +233,7 @@ class ResponseError(Error):
class Fault(Error):
"""Indicates an XML-RPC fault package."""
def __init__(self, faultCode, faultString, **extra):
Error.__init__(self)
Error.__init__(self, faultCode, faultString)
self.faultCode = faultCode
self.faultString = faultString
def __repr__(self):
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
:class:`xmlrpc.client.Fault` and :class:`xmlrpc.client.ProtocolError`
exceptions can now be unpickled. Previously, unpickling them raised
:exc:`TypeError`.
Loading