This is an automated email from the ASF dual-hosted git repository. astitcher pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/qpid-proton.git
The following commit(s) were added to refs/heads/main by this push: new 581a433fe PROTON-2883/PROTON-2884: Modified dispositions should default to failed = true 581a433fe is described below commit 581a433fe3edffef0a724cec424bdffbf7072738 Author: Andrew Stitcher <astitc...@apache.org> AuthorDate: Tue Apr 8 22:06:04 2025 -0400 PROTON-2883/PROTON-2884: Modified dispositions should default to failed = true --- cpp/src/delivery.cpp | 2 +- python/proton/_delivery.py | 2 +- python/proton/_handlers.py | 7 ++++--- python/tests/proton_tests/engine.py | 22 ++++++++++++++++++++++ 4 files changed, 28 insertions(+), 5 deletions(-) diff --git a/cpp/src/delivery.cpp b/cpp/src/delivery.cpp index 8dc050e25..9f03eaf73 100644 --- a/cpp/src/delivery.cpp +++ b/cpp/src/delivery.cpp @@ -49,6 +49,6 @@ delivery::~delivery() = default; void delivery::accept() { settle_delivery(pn_object(), ACCEPTED); } void delivery::reject() { settle_delivery(pn_object(), REJECTED); } void delivery::release() { settle_delivery(pn_object(), RELEASED); } -void delivery::modify() { settle_delivery(pn_object(), MODIFIED); } +void delivery::modify() { pn_disposition_set_failed(pn_delivery_local(pn_object()), true); settle_delivery(pn_object(), MODIFIED); } } diff --git a/python/proton/_delivery.py b/python/proton/_delivery.py index 7fbf425e5..90bf3689f 100644 --- a/python/proton/_delivery.py +++ b/python/proton/_delivery.py @@ -425,7 +425,7 @@ class RejectedDisposition(LocalDisposition): class ModifiedDisposition(LocalDisposition): - def __init__(self, failed: bool = None, undeliverable: bool = None, + def __init__(self, failed: bool = True, undeliverable: bool = None, annotations: Optional[dict['symbol', 'PythonAMQPData']] = None): self._failed = failed self._undeliverable = undeliverable diff --git a/python/proton/_handlers.py b/python/proton/_handlers.py index 08096c775..819f8431c 100644 --- a/python/proton/_handlers.py +++ b/python/proton/_handlers.py @@ -24,7 +24,7 @@ import time import weakref from ._condition import Condition -from ._delivery import Delivery +from ._delivery import Delivery, ModifiedDisposition from ._endpoints import Endpoint from ._events import Event, _dispatch from ._exceptions import ProtonException @@ -187,7 +187,7 @@ class Acking(object): """ self.settle(delivery, Delivery.REJECTED) - def release(self, delivery: Delivery, delivered: bool = True) -> None: + def release(self, delivery: Delivery, delivered: bool = True, failed: bool = True, undeliverable: bool = False) -> None: """ Releases a received message, making it available at the source for any (other) interested receiver. The ``delivered`` @@ -206,7 +206,8 @@ class Acking(object): delivery flag :const:`proton.Delivery.RELEASED` """ if delivered: - self.settle(delivery, Delivery.MODIFIED) + delivery.local = ModifiedDisposition(failed=failed, undeliverable=undeliverable) + self.settle(delivery) else: self.settle(delivery, Delivery.RELEASED) diff --git a/python/tests/proton_tests/engine.py b/python/tests/proton_tests/engine.py index 5289db059..8b99539d3 100644 --- a/python/tests/proton_tests/engine.py +++ b/python/tests/proton_tests/engine.py @@ -2380,6 +2380,25 @@ class NewModifiedTester(DispositionTester): assert dlv.remote.annotations == self._annotations, (dlv.remote.annotations, self._annotations) +class NewDefaultModifiedTester(DispositionTester): + def __init__(self): + self._failed = True + self._undeliverable = False + self._annotations = None + super().__init__(Disposition.MODIFIED) + + def apply(self, dlv: Delivery): + dlv.local = ModifiedDisposition() + dlv.update() + + def check(self, dlv: Delivery): + assert dlv.remote_state == self._type + assert dlv.remote.type == self._type + assert dlv.remote.failed == self._failed, (dlv.remote.failed, self._failed) + assert dlv.remote.undeliverable == self._undeliverable, (dlv.remote.undeliverable, self._undeliverable) + assert dlv.remote.annotations == self._annotations, (dlv.remote.annotations, self._annotations) + + class CustomTester(DispositionTester): def __init__(self, type, data): self._data = data @@ -2505,6 +2524,9 @@ class DeliveryTest(Test): self._testDisposition(NewModifiedTester(failed=True, undeliverable=True, annotations={"key": "value"})) + def testNewDefaultModified(self): + self._testDisposition(NewDefaultModifiedTester()) + def testTransactional(self): self._testDisposition(TransactionalTester(id=b'1324xxx', outcome_type=Disposition.ACCEPTED)) --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@qpid.apache.org For additional commands, e-mail: commits-h...@qpid.apache.org