Skip to content

Commit a46ce3b

Browse files
Allow customizing how error PDUs are handled
1 parent 0780ad2 commit a46ce3b

File tree

2 files changed

+47
-6
lines changed

2 files changed

+47
-6
lines changed

smpplib/client.py

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,10 @@ def set_query_resp_handler(self, func):
307307
"""Set new function to handle query resp event"""
308308
self.query_resp_handler = func
309309

310+
def set_error_pdu_handler(self, func):
311+
"""Set new function to handle PDUs with an error status"""
312+
self.error_pdu_handler = func
313+
310314
def message_received_handler(self, pdu, **kwargs):
311315
"""Custom handler to process received message. May be overridden"""
312316
self.logger.warning('Message received handler (Override me)')
@@ -322,6 +326,14 @@ def query_resp_handler(self, pdu, **kwargs):
322326
"""Custom handler to process response to queries. May be overridden"""
323327
self.logger.warning('Query resp handler (Override me)')
324328

329+
def error_pdu_handler(self, pdu):
330+
raise exceptions.PDUError('({}) {}: {}'.format(
331+
pdu.status,
332+
pdu.command,
333+
consts.DESCRIPTIONS.get(pdu.status, 'Unknown status')),
334+
int(pdu.status),
335+
)
336+
325337
def read_once(self, ignore_error_codes=None, auto_send_enquire_link=True):
326338
"""Read a PDU and act"""
327339
try:
@@ -336,12 +348,7 @@ def read_once(self, ignore_error_codes=None, auto_send_enquire_link=True):
336348
return
337349

338350
if pdu.is_error():
339-
raise exceptions.PDUError('({}) {}: {}'.format(
340-
pdu.status,
341-
pdu.command,
342-
consts.DESCRIPTIONS.get(pdu.status, 'Unknown status')),
343-
int(pdu.status),
344-
)
351+
self.error_pdu_handler(pdu)
345352

346353
if pdu.command == 'unbind': # unbind_res
347354
self.logger.info('Unbind command received')

tests/test_client.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
import warnings
2+
import pytest
3+
from mock import Mock, call
24

35
from smpplib.client import Client
6+
from smpplib.smpp import make_pdu
7+
from smpplib import consts
8+
from smpplib import exceptions
49

510

611
def test_client_construction_allow_unknown_opt_params_warning():
@@ -10,3 +15,32 @@ def test_client_construction_allow_unknown_opt_params_warning():
1015
assert len(w) == 1
1116
assert "optional parameters" in str(w[0].message)
1217
assert not client.allow_unknown_opt_params
18+
19+
20+
def test_client_error_pdu_default():
21+
client = Client("localhost", 5679)
22+
error_pdu = make_pdu("submit_sm_resp")
23+
error_pdu.status = consts.SMPP_ESME_RINVMSGLEN
24+
client.read_pdu = Mock(return_value=error_pdu)
25+
26+
with pytest.raises(exceptions.PDUError) as exec_info:
27+
client.read_once()
28+
29+
assert exec_info.value.args[1] == consts.SMPP_ESME_RINVMSGLEN
30+
31+
# Should not raise
32+
client.read_once(ignore_error_codes=[consts.SMPP_ESME_RINVMSGLEN])
33+
34+
35+
def test_client_error_pdu_custom_handler():
36+
client = Client("localhost", 5679)
37+
error_pdu = make_pdu("submit_sm_resp")
38+
error_pdu.status = consts.SMPP_ESME_RINVMSGLEN
39+
client.read_pdu = Mock(return_value=error_pdu)
40+
41+
mock_error_pdu_handler = Mock()
42+
client.set_error_pdu_handler(mock_error_pdu_handler)
43+
44+
client.read_once()
45+
46+
assert mock_error_pdu_handler.mock_calls == [call(error_pdu)]

0 commit comments

Comments
 (0)