Skip to content

Commit

Permalink
wip
Browse files Browse the repository at this point in the history
  • Loading branch information
nitely committed Feb 21, 2024
1 parent 87c0727 commit 0be693f
Show file tree
Hide file tree
Showing 4 changed files with 20 additions and 11 deletions.
2 changes: 1 addition & 1 deletion hyperx.nimble
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ skipDirs = @["tests"]

requires "nim >= 2.0.0"
#requires "hpack >= 0.2.0"
requires "https://github.com/nitely/nim-hpack#update_size"
requires "https://github.com/nitely/nim-hpack#head"

task test, "Test":
exec "nim c -r src/hyperx/utils.nim"
Expand Down
13 changes: 6 additions & 7 deletions src/hyperx/client.nim
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,7 @@ type
MsgData = object
frm: Frame
Stream = object
# XXX: add body stream, if set stream data through it
id: StreamId
state: StreamState
msgs: QueueAsync[MsgData]
Expand Down Expand Up @@ -341,6 +342,8 @@ proc read(client: ClientContext, frm: Frame) {.async.} =
payloadLen -= paddingLen
check isValidSize(frm, payloadLen), newConnError(errFrameSizeError)
if payloadLen > 0:
# XXX recv into Stream.bodyStream if typ is frmtData
# XXX recv in chunks and discard if stream does not exists
frm.grow payloadLen
let payloadRln = await client.sock.recvInto(
frm.rawPayloadBytesPtr, payloadLen
Expand Down Expand Up @@ -378,12 +381,9 @@ proc handshake(client: ClientContext) {.async.} =
# XXX: allow sending some params
let sid = client.openMainStream()
doAssert sid == frmSidMain.StreamId
var frm = newFrame()
frm.setTyp frmtSettings
frm.setSid frmSidMain
var frm = newSettingsFrame()
frm.addSetting frmsEnablePush, stgDisablePush
frm.addSetting frmsInitialWindowSize, stgMaxWindowSize
frm.setPayloadLen frm.payload.len.FrmPayloadLen
var blob = newSeqOfCap[byte](preface.len+frm.len)
blob.add preface
blob.add frm.s
Expand Down Expand Up @@ -433,7 +433,6 @@ const connFrmAllowed = {
}

proc consumeMainStream(client: ClientContext, frm: Frame) {.async.} =
# XXX process settings, window updates, etc
case frm.typ
of frmtWindowUpdate:
check frm.payload.len > 0, newConnError(errProtocolError)
Expand Down Expand Up @@ -462,8 +461,8 @@ proc consumeMainStream(client: ClientContext, frm: Frame) {.async.} =
discard
else:
# ignore unknown setting
debugInfo "unknown setting recived"
# XXX send ack
debugInfo "unknown setting received"
await client.write newSettingsFrame()
of frmtPing: discard
of frmtGoAway: discard
else:
Expand Down
9 changes: 9 additions & 0 deletions src/hyperx/frame.nim
Original file line number Diff line number Diff line change
Expand Up @@ -238,11 +238,20 @@ func newWindowUpdateFrame*(
result.setPayloadLen frmWindowUpdateSize.FrmPayloadLen
result.s.assignAt(frmHeaderSize, increment.uint32)

func newSettingsFrame*(ack = false): Frame {.inline, raises: [].} =
result = newFrame()
result.setTyp frmtSettings
result.setSid frmSidMain
if ack:
result.flags.incl frmfAck

func addSetting*(
frm: Frame,
id: FrmSetting,
value: uint32
) {.inline, raises: [].} =
doAssert frm.typ == frmtSettings
doAssert frmfAck notin frm.flags
let i = frm.len
frm.grow frmSettingsSize
frm.setPayloadLen frm.payload.len.FrmPayloadLen
Expand Down
7 changes: 4 additions & 3 deletions tests/testclient.nim
Original file line number Diff line number Diff line change
Expand Up @@ -289,9 +289,10 @@ testAsync "header table size setting is applied":
":path: /foo\r\L" &
":authority: foo.bar\r\L"
# XXX reqs[2] window size update
doAssert reqs[3].frm.sid.int == 3
doAssert reqs[3].frm.typ == frmtHeaders
doAssert reqs[3].payload ==
# XXX reqs[3] ack window size update
doAssert reqs[4].frm.sid.int == 3
doAssert reqs[4].frm.typ == frmtHeaders
doAssert reqs[4].payload ==
":method: GET\r\L" &
":scheme: https\r\L" &
":path: /bar\r\L" &
Expand Down

0 comments on commit 0be693f

Please sign in to comment.