Skip to content

Commit 97b715d

Browse files
authored
Merge pull request python-smpplib#116 from wavemm/wave/custom-error-pdu-handler
Add the ability to set a custom error pdu handler
2 parents 0780ad2 + b71e534 commit 97b715d

File tree

2 files changed

+55
-6
lines changed

2 files changed

+55
-6
lines changed

smpplib/client.py

Lines changed: 21 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,8 +326,24 @@ 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"""
339+
340+
if ignore_error_codes is not None:
341+
warnings.warn(
342+
"ignore_error_codes is deprecated, use set_error_pdu_handler to "
343+
"configure a custom error PDU handler instead.",
344+
DeprecationWarning,
345+
)
346+
327347
try:
328348
try:
329349
pdu = self.read_pdu()
@@ -336,12 +356,7 @@ def read_once(self, ignore_error_codes=None, auto_send_enquire_link=True):
336356
return
337357

338358
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-
)
359+
self.error_pdu_handler(pdu)
345360

346361
if pdu.command == 'unbind': # unbind_res
347362
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)