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); }