From 5fcb12fd6145acc5ce69898e6fc22acae271d155 Mon Sep 17 00:00:00 2001 From: NZSmartie Date: Sun, 3 Dec 2017 20:04:27 +1300 Subject: [PATCH] Only attempt to restart smaller Block0Wise transfer on first block --- src/CoAPNet/CoapBlockStream.cs | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/CoAPNet/CoapBlockStream.cs b/src/CoAPNet/CoapBlockStream.cs index 413b498..c6da290 100644 --- a/src/CoAPNet/CoapBlockStream.cs +++ b/src/CoAPNet/CoapBlockStream.cs @@ -76,7 +76,7 @@ private async Task WriteBlocksAsync() // Reset the message Id so it's set by CoapClient message.Id = 0; - message.Options.Add(new Options.Block1(_writeBlockNumber++, _blockSize, _writer.Length > _blockSize)); + message.Options.Add(new Options.Block1(_writeBlockNumber, _blockSize, _writer.Length > _blockSize)); message.Payload = new byte[_writer.Length < _blockSize ? _writer.Length : _blockSize]; _writer.Peek(message.Payload, 0, _blockSize); @@ -86,6 +86,9 @@ private async Task WriteBlocksAsync() if (result.Code.IsSuccess()) { + _writer.AdvanceQueue(message.Payload.Length); + _writeBlockNumber++; + var block = result.Options.Get(); var blockDelta = block.BlockSize - _blockSize; @@ -98,16 +101,19 @@ private async Task WriteBlocksAsync() else if (blockDelta > 0) throw new CoapBlockException($"Remote endpoint requested to increase blocksize from {_blockSize} to {_blockSize + blockDelta}"); - _writer.AdvanceQueue(message.Payload.Length); } else if (result.Code.IsClientError() || result.Code.IsServerError()) { - // Try again and attempt at sending a smaller block size. - _writeBlockNumber = 0; - _blockSize /= 2; + if (_writeBlockNumber == 0 && result.Code == CoapMessageCode.RequestEntityTooLarge && _blockSize > 16) + { + // Try again and attempt at sending a smaller block size. + _writeBlockNumber = 0; + _blockSize /= 2; + + continue; + } - if(_blockSize < 16) - throw new CoapBlockException($"Failed to send block ({_writeBlockNumber}) to remote endpoint", CoapException.FromCoapMessage(result), result.Code); + throw new CoapBlockException($"Failed to send block ({_writeBlockNumber}) to remote endpoint", CoapException.FromCoapMessage(result), result.Code); } }