diff --git a/src/modernnet/io.nim b/src/modernnet/io.nim index 8b621c7..630b6d5 100644 --- a/src/modernnet/io.nim +++ b/src/modernnet/io.nim @@ -78,24 +78,19 @@ func readVar*[R: int32 | int64](data: openArray[byte]): Result[tuple[num: R, byt func readRawPacket*(data: openArray[byte]): Result[tuple[packet: RawPacket, bytesRead: int], int] = - var pos = 0 let id = data.readVar[:int32]() if not id.isOk: - return typeof(result)(isOk: false, err: id.err - data.len) + return typeof(result)(isOk: false, err: id.err) - pos += id.ok.bytesRead - - let - idPos = pos - length = data.readVar[:int32]() + let length = data[id.ok.bytesRead..^1].readVar[:int32]() if not length.isOk: - return typeof(result)(isOk: false, err: length.err - data.len) + return typeof(result)(isOk: false, err: length.err) - pos += length.ok.bytesRead + let lenPos = id.ok.bytesRead + length.ok.bytesRead - if data.len < (pos + length.ok.num): - return typeof(result)(isOk: false, err: (pos + length.ok.num) - data.len) + if data.len - lenPos < length.ok.num: + return typeof(result)(isOk: false, err: lenPos + length.ok.num - data.len) - return typeof(result)(isOk: true, ok: (RawPacket(id: id.ok.num, buf: newBuffer(data[idPos..<(pos + length.ok.num)])), pos + length.ok.num)) \ No newline at end of file + return typeof(result)(isOk: true, ok: (RawPacket(id: id.ok.num, buf: newBuffer(data[lenPos..<(lenPos + length.ok.num)])), lenPos + length.ok.num)) \ No newline at end of file diff --git a/tests/test1.nim b/tests/test1.nim index 44c35f5..99d0bae 100644 --- a/tests/test1.nim +++ b/tests/test1.nim @@ -115,25 +115,32 @@ test "IO read/write test": # Commence tests~ var b: seq[byte] # Pretend this is a buffered socket - var res = readRawPacket(b) - - var i = 0 + var + res = readRawPacket(b) + counter = 0 while not res.isOk: - i += 1 + for i in 0..