Update http driver to latest schema

This commit is contained in:
Emery Hemingway 2024-04-19 11:44:35 +02:00
parent 6487ef65d0
commit 13d3995507
2 changed files with 24 additions and 8 deletions

View File

@ -16,8 +16,6 @@ when defined(posix):
proc echo(args: varargs[string, `$`]) {.used.} =
stderr.writeLine(args)
proc `$`(b: seq[byte]): string = cast[string](b)
proc badRequest(conn: Connection; msg: string) =
conn.send(SupportedVersion & " 400 " & msg, endOfMessage = true)
@ -33,6 +31,9 @@ proc extractQuery(s: var string): Table[Symbol, seq[QueryValue]] =
proc parseRequest(conn: Connection; text: string): (int, HttpRequest) =
## Parse an `HttpRequest` request out of a `text` from a `Connection`.
result[1].host = RequestHost(orKind: RequestHostKind.absent)
result[1].body = RequestBody(orKind: RequestBodyKind.absent)
var
token: string
off: int
@ -91,13 +92,13 @@ proc parseRequest(conn: Connection; text: string): (int, HttpRequest) =
for e in vals.mitems:
e = e.toLowerAscii
if k == Symbol"host":
result[1].host = e
result[1].host = RequestHost(orKind: RequestHostKind.`present`, present: e)
if v == "": v = move e
else:
v.add ", "
v.add e
if k == Symbol"host":
result[1].host = v
result[1].host = RequestHost(orKind: RequestHostKind.`present`, present: v)
result[1].headers[k] = v
result[0] = off
@ -140,6 +141,9 @@ proc send(ses: Session; chunk: Chunk) =
of ChunkKind.bytes:
ses.send(chunk.bytes)
func `==`(s: string; rh: RequestHost): bool =
rh.orKind == RequestHostKind.present and rh.present == s
proc match(b: HttpBinding, r: HttpRequest): bool =
## Check if `HttpBinding` `b` matches `HttpRequest` `r`.
result =
@ -241,9 +245,8 @@ proc service(turn: var Turn; exch: Exchange) =
if handler.isNone:
stop(turn)
else:
let
cap = newCap(turn, exch)
ctx = publish(turn, handler.get, HttpContext(
let cap = newCap(turn, exch)
publish(turn, handler.get, HttpContext(
req: exch.req,
res: embed cap,
))

View File

@ -47,7 +47,7 @@ type
HttpRequest* {.preservesRecord: "http-request".} = object
`sequenceNumber`*: BiggestInt
`host`*: string
`host`*: RequestHost
`port`*: BiggestInt
`method`*: Symbol
`path`*: seq[string]
@ -115,6 +115,17 @@ type
`req`*: HttpRequest
`res`* {.preservesEmbedded.}: Value
RequestHostKind* {.pure.} = enum
`present`, `absent`
`RequestHost`* {.preservesOr.} = object
case orKind*: RequestHostKind
of RequestHostKind.`present`:
`present`*: string
of RequestHostKind.`absent`:
`absent`* {.preservesLiteral: "#f".}: bool
PathPatternElementKind* {.pure.} = enum
`label`, `wildcard`, `rest`
`PathPatternElement`* {.preservesOr.} = object
@ -149,6 +160,7 @@ proc `$`*(x: HostPattern | HttpListener | MethodPattern | MimeType | QueryValue
HttpService |
HttpBinding |
HttpContext |
RequestHost |
PathPatternElement |
Chunk |
PathPattern): string =
@ -163,6 +175,7 @@ proc encode*(x: HostPattern | HttpListener | MethodPattern | MimeType |
HttpService |
HttpBinding |
HttpContext |
RequestHost |
PathPatternElement |
Chunk |
PathPattern): seq[byte] =