From 4d466801917705aec7cd97b6b53c7502d4c1f7c5 Mon Sep 17 00:00:00 2001 From: Kegan Dougal Date: Thu, 18 Feb 2021 18:10:00 +0000 Subject: [PATCH] Fix an issue which prevents blockwise xfer working with observe If you observe a resource and the state change is too big for a single packet, it will be sent blockwise. However, only the first block is sent with the observe token, it is expected that clients will request subsequent blocks by issuing a new request. Returning a response to this new request would fail on the client due to ETags not matching, despite no ETags being used. The failure error was: received message doesn't contains ETAG but cached received message contains it([]) This patch ensures that the received message actually contains an ETag, which fixes this issue. --- net/blockwise/blockwise.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/net/blockwise/blockwise.go b/net/blockwise/blockwise.go index 714e117c..2d6f5295 100644 --- a/net/blockwise/blockwise.go +++ b/net/blockwise/blockwise.go @@ -736,9 +736,13 @@ func (b *BlockWise) processReceivedMessage(w ResponseWriter, r Message, maxSzx S cachedReceivedMessageETAG, errCachedReceivedMessageETAG := cachedReceivedMessage.GetOptionBytes(message.ETag) switch { case errETAG == nil && errCachedReceivedMessageETAG != nil: - return fmt.Errorf("received message doesn't contains ETAG but cached received message contains it(%v)", cachedReceivedMessageETAG) + if len(cachedReceivedMessageETAG) > 0 { // make sure there is an etag there + return fmt.Errorf("received message doesn't contains ETAG but cached received message contains it(%v)", cachedReceivedMessageETAG) + } case errETAG != nil && errCachedReceivedMessageETAG == nil: - return fmt.Errorf("received message contains ETAG(%v) but cached received message doesn't", rETAG) + if len(rETAG) > 0 { // make sure there is an etag there + return fmt.Errorf("received message contains ETAG(%v) but cached received message doesn't", rETAG) + } case !bytes.Equal(rETAG, cachedReceivedMessageETAG): return fmt.Errorf("received message ETAG(%v) is not equal to cached received message ETAG(%v)", rETAG, cachedReceivedMessageETAG) }