Skip to content

Commit 581a433

Browse files
committed
PROTON-2883/PROTON-2884: Modified dispositions should default to failed = true
1 parent d323082 commit 581a433

File tree

4 files changed

+28
-5
lines changed

4 files changed

+28
-5
lines changed

cpp/src/delivery.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,6 @@ delivery::~delivery() = default;
4949
void delivery::accept() { settle_delivery(pn_object(), ACCEPTED); }
5050
void delivery::reject() { settle_delivery(pn_object(), REJECTED); }
5151
void delivery::release() { settle_delivery(pn_object(), RELEASED); }
52-
void delivery::modify() { settle_delivery(pn_object(), MODIFIED); }
52+
void delivery::modify() { pn_disposition_set_failed(pn_delivery_local(pn_object()), true); settle_delivery(pn_object(), MODIFIED); }
5353

5454
}

python/proton/_delivery.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -425,7 +425,7 @@ def apply_to(self, local_disposition: LocalDisposition):
425425

426426
class ModifiedDisposition(LocalDisposition):
427427

428-
def __init__(self, failed: bool = None, undeliverable: bool = None,
428+
def __init__(self, failed: bool = True, undeliverable: bool = None,
429429
annotations: Optional[dict['symbol', 'PythonAMQPData']] = None):
430430
self._failed = failed
431431
self._undeliverable = undeliverable

python/proton/_handlers.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
import weakref
2525

2626
from ._condition import Condition
27-
from ._delivery import Delivery
27+
from ._delivery import Delivery, ModifiedDisposition
2828
from ._endpoints import Endpoint
2929
from ._events import Event, _dispatch
3030
from ._exceptions import ProtonException
@@ -187,7 +187,7 @@ def reject(self, delivery: Delivery) -> None:
187187
"""
188188
self.settle(delivery, Delivery.REJECTED)
189189

190-
def release(self, delivery: Delivery, delivered: bool = True) -> None:
190+
def release(self, delivery: Delivery, delivered: bool = True, failed: bool = True, undeliverable: bool = False) -> None:
191191
"""
192192
Releases a received message, making it available at the source
193193
for any (other) interested receiver. The ``delivered``
@@ -206,7 +206,8 @@ def release(self, delivery: Delivery, delivered: bool = True) -> None:
206206
delivery flag :const:`proton.Delivery.RELEASED`
207207
"""
208208
if delivered:
209-
self.settle(delivery, Delivery.MODIFIED)
209+
delivery.local = ModifiedDisposition(failed=failed, undeliverable=undeliverable)
210+
self.settle(delivery)
210211
else:
211212
self.settle(delivery, Delivery.RELEASED)
212213

python/tests/proton_tests/engine.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2380,6 +2380,25 @@ def check(self, dlv: Delivery):
23802380
assert dlv.remote.annotations == self._annotations, (dlv.remote.annotations, self._annotations)
23812381

23822382

2383+
class NewDefaultModifiedTester(DispositionTester):
2384+
def __init__(self):
2385+
self._failed = True
2386+
self._undeliverable = False
2387+
self._annotations = None
2388+
super().__init__(Disposition.MODIFIED)
2389+
2390+
def apply(self, dlv: Delivery):
2391+
dlv.local = ModifiedDisposition()
2392+
dlv.update()
2393+
2394+
def check(self, dlv: Delivery):
2395+
assert dlv.remote_state == self._type
2396+
assert dlv.remote.type == self._type
2397+
assert dlv.remote.failed == self._failed, (dlv.remote.failed, self._failed)
2398+
assert dlv.remote.undeliverable == self._undeliverable, (dlv.remote.undeliverable, self._undeliverable)
2399+
assert dlv.remote.annotations == self._annotations, (dlv.remote.annotations, self._annotations)
2400+
2401+
23832402
class CustomTester(DispositionTester):
23842403
def __init__(self, type, data):
23852404
self._data = data
@@ -2505,6 +2524,9 @@ def testNewModified(self):
25052524
self._testDisposition(NewModifiedTester(failed=True, undeliverable=True,
25062525
annotations={"key": "value"}))
25072526

2527+
def testNewDefaultModified(self):
2528+
self._testDisposition(NewDefaultModifiedTester())
2529+
25082530
def testTransactional(self):
25092531
self._testDisposition(TransactionalTester(id=b'1324xxx', outcome_type=Disposition.ACCEPTED))
25102532

0 commit comments

Comments
 (0)