Skip to content

Commit

Permalink
Fix packet read/writing because it was completely broken before, oops...
Browse files Browse the repository at this point in the history
  • Loading branch information
Luyten-Orion committed Sep 2, 2024
1 parent 9dca9e3 commit 16a6fe9
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 24 deletions.
19 changes: 7 additions & 12 deletions src/modernnet/io.nim
Original file line number Diff line number Diff line change
Expand Up @@ -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))
return typeof(result)(isOk: true, ok: (RawPacket(id: id.ok.num, buf: newBuffer(data[lenPos..<(lenPos + length.ok.num)])), lenPos + length.ok.num))
31 changes: 19 additions & 12 deletions tests/test1.nim
Original file line number Diff line number Diff line change
Expand Up @@ -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..<res.err: b.add(buffer.readNum[:byte]())

if i in [1, 2]:
inc counter

if counter < 3:
# Check if variable length numbers are read correctly
check res.err == 1
elif i == 3:
check res.err == 8
else:
echo "[ERROR] Unimplemented test case where `i` was " & $i & '.'
fail
# Check if the length was also read correctly.
check res.err == 8

b = buffer.buf[0..<(b.len + res.err)]
res = readRawPacket(b)

# Check packet ID
check res.ok.packet.id == 0x27
check res.ok.packet.buf.readVarNum[:int32]() == 8
check res.ok.packet.buf.readNum[:int64]() == 23142

# Use parsed buffer
buffer = res.ok.packet.buf

# Length should be omitted in parsed buffer.
check buffer.readNum[:int64]() == 23142

# Check if the total bytes read was also correct
check res.ok.bytesRead == 10

0 comments on commit 16a6fe9

Please sign in to comment.