Skip to content

Commit 01309f7

Browse files
committed
Remove special case and log any request whose response is unmarshallable
The special case assertion only caught one unmarshallable value (``None``) but others are possible (e.g. ``{'x': None}``).
1 parent a037b43 commit 01309f7

File tree

3 files changed

+37
-13
lines changed

3 files changed

+37
-13
lines changed

supervisor/tests/base.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -919,6 +919,9 @@ def clearAllProcessLogs(self):
919919
def raiseError(self):
920920
raise ValueError('error')
921921

922+
def getXmlRpcUnmarshallable(self):
923+
return {'stdout_logfile': None} # None is unmarshallable
924+
922925
def getSupervisorVersion(self):
923926
return '3000'
924927

supervisor/tests/test_xmlrpc.py

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ def test_continue_request_400_if_method_name_is_empty(self):
180180
self.assertEqual(len(request.producers), 0)
181181
self.assertEqual(request._error, 400)
182182

183-
def test_continue_request_500(self):
183+
def test_continue_request_500_if_rpcinterface_method_call_raises(self):
184184
supervisor = DummySupervisor()
185185
subinterfaces = [('supervisor', DummySupervisorRPCNamespace())]
186186
handler = self._makeOne(supervisor, subinterfaces)
@@ -197,11 +197,38 @@ def test_continue_request_500(self):
197197
self.assertEqual(len(logdata), expected)
198198
self.assertEqual(logdata[-2],
199199
u'XML-RPC method called: supervisor.raiseError()')
200-
self.assertTrue(logdata[-1].startswith('Traceback'))
201-
self.assertTrue(logdata[-1].endswith('ValueError: error\n'))
200+
self.assertTrue("unexpected exception" in logdata[1])
201+
self.assertTrue(repr(data) in logdata[-1])
202+
self.assertTrue("Traceback" in logdata[-1])
203+
self.assertTrue("ValueError: error" in logdata[-1])
202204
self.assertEqual(len(request.producers), 0)
203205
self.assertEqual(request._error, 500)
204206

207+
def test_continue_request_500_if_xmlrpc_dumps_raises(self):
208+
supervisor = DummySupervisor()
209+
subinterfaces = [('supervisor', DummySupervisorRPCNamespace())]
210+
handler = self._makeOne(supervisor, subinterfaces)
211+
import xmlrpclib
212+
data = xmlrpclib.dumps((), 'supervisor.getXmlRpcUnmarshallable')
213+
request = DummyRequest('/what/ever', None, None, None)
214+
handler.continue_request(data, request)
215+
logdata = supervisor.options.logger.data
216+
from supervisor.xmlrpc import loads
217+
if loads:
218+
expected = 3
219+
else:
220+
expected = 4
221+
self.assertEqual(len(logdata), expected)
222+
self.assertEqual(logdata[-3],
223+
'XML-RPC method called: supervisor.getXmlRpcUnmarshallable()')
224+
self.assertEqual(logdata[-2],
225+
'XML-RPC method supervisor.getXmlRpcUnmarshallable() '
226+
'returned successfully')
227+
self.assertTrue("unexpected exception" in logdata[-1])
228+
self.assertTrue(repr(data) in logdata[-1])
229+
self.assertTrue("Traceback" in logdata[-1])
230+
self.assertTrue("TypeError: cannot marshal" in logdata[-1])
231+
205232
class TraverseTests(unittest.TestCase):
206233
def test_underscore(self):
207234
from supervisor import xmlrpc

supervisor/xmlrpc.py

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -363,7 +363,6 @@ def continue_request (self, data, request):
363363
logger = self.supervisord.options.logger
364364

365365
try:
366-
367366
params, method = self.loads(data)
368367

369368
# no <methodName> in the request or name is an empty string
@@ -380,14 +379,6 @@ def continue_request (self, data, request):
380379
try:
381380
logger.trace('XML-RPC method called: %s()' % method)
382381
value = self.call(method, params)
383-
# application-specific: we never want to marshal None (even
384-
# though we could by saying allow_none=True in dumps within
385-
# xmlrpc_marshall), this is meant as a debugging fixture, see:
386-
# http://www.plope.com/software/collector/223
387-
assert value is not None, (
388-
'return value from method %r with params %r is None' %
389-
(method, params)
390-
)
391382
logger.trace('XML-RPC method %s() returned successfully' %
392383
method)
393384
except RPCError, err:
@@ -415,7 +406,10 @@ def continue_request (self, data, request):
415406

416407
except:
417408
tb = traceback.format_exc()
418-
logger.critical(tb)
409+
logger.critical(
410+
"Handling XML-RPC request with data %r raised an unexpected "
411+
"exception: %s" % (data, tb)
412+
)
419413
# internal error, report as HTTP server error
420414
request.error(500)
421415

0 commit comments

Comments
 (0)