From 02d3b53a6465a9942169cead607e3128fee17d2f Mon Sep 17 00:00:00 2001 From: Jon Shallow Date: Tue, 27 Apr 2021 21:36:17 +0100 Subject: [PATCH] Observe: Make sure Observe option is not in non 2.xx response https://tools.ietf.org/html/rfc7641#section-4.2 last paragraph. Remove option if present in non 2.xx response. --- src/net.c | 5 +++++ src/resource.c | 3 +++ 2 files changed, 8 insertions(+) diff --git a/src/net.c b/src/net.c index c3c4ae15..8ec73f39 100644 --- a/src/net.c +++ b/src/net.c @@ -2830,6 +2830,11 @@ skip_handler: respond = no_response(pdu, response, session); if (respond != RESPONSE_DROP) { coap_mid_t mid = pdu->mid; + if (COAP_RESPONSE_CLASS(response->code) != 2) { + if (observe) { + coap_remove_option(response, COAP_OPTION_OBSERVE); + } + } if (COAP_RESPONSE_CLASS(response->code) > 2) { if (observe) coap_delete_observer(resource, session, &token); diff --git a/src/resource.c b/src/resource.c index 9ea29088..044828e0 100644 --- a/src/resource.c +++ b/src/resource.c @@ -931,6 +931,9 @@ coap_notify_observers(coap_context_t *context, coap_resource_t *r, h(r, obs->session, NULL, obs->query, response); /* Check if lg_xmit generated and update PDU code if so */ coap_check_code_lg_xmit(obs->session, response, r, obs->query); + if (COAP_RESPONSE_CLASS(response->code) != 2) { + coap_remove_option(response, COAP_OPTION_OBSERVE); + } if (COAP_RESPONSE_CLASS(response->code) > 2) { coap_delete_observer(r, obs->session, &token); }