diff options
Diffstat (limited to 'src/server/headers.nim')
-rw-r--r-- | src/server/headers.nim | 66 |
1 files changed, 45 insertions, 21 deletions
diff --git a/src/server/headers.nim b/src/server/headers.nim index 2ed49e04..25102486 100644 --- a/src/server/headers.nim +++ b/src/server/headers.nim @@ -18,7 +18,7 @@ type hgResponse = "response" Headers* = ref object - table*: Table[string, seq[string]] + table: Table[string, seq[string]] guard*: HeaderGuard HeadersInitType = enum @@ -33,6 +33,20 @@ type jsDestructor(Headers) +func isForbiddenResponseHeaderName*(name: string): bool + +iterator pairs*(this: Headers): (string, string) = + for k, vs in this.table: + if this.guard == hgResponse and k.isForbiddenResponseHeaderName(): + continue + for v in vs: + yield (k, v) + +iterator allPairs*(headers: Headers): (string, string) = + for k, vs in headers.table: + for v in vs: + yield (k, v) + const HTTPWhitespace = {'\n', '\r', '\t', ' '} proc fromJS(ctx: JSContext; val: JSValueConst; res: var HeadersInit): @@ -219,17 +233,12 @@ proc fill*(headers: Headers; init: HeadersInit): JSResult[void] = of hitSequence: return headers.fill(init.s) of hitTable: return headers.fill(init.tab) -func newHeaders*(guard = hgNone): Headers = +func newHeaders*(guard: HeaderGuard): Headers = return Headers(guard: guard) -func newHeaders(obj = none(HeadersInit)): JSResult[Headers] {.jsctor.} = - let headers = Headers(guard: hgNone) - if obj.isSome: - ?headers.fill(obj.get) - return ok(headers) - -func newHeaders*(table: openArray[(string, string)]): Headers = - let headers = Headers() +func newHeaders*(guard: HeaderGuard; table: openArray[(string, string)]): + Headers = + let headers = newHeaders(guard) for (k, v) in table: let k = k.toHeaderCase() headers.table.withValue(k, vs): @@ -238,8 +247,8 @@ func newHeaders*(table: openArray[(string, string)]): Headers = headers.table[k] = @[v] return headers -func newHeaders*(table: Table[string, string]): Headers = - let headers = Headers() +func newHeaders*(guard: HeaderGuard; table: Table[string, string]): Headers = + let headers = newHeaders(guard) for k, v in table: let k = k.toHeaderCase() headers.table.withValue(k, vs): @@ -248,6 +257,12 @@ func newHeaders*(table: Table[string, string]): Headers = headers.table[k] = @[v] return headers +func newHeaders(obj = none(HeadersInit)): JSResult[Headers] {.jsctor.} = + let headers = Headers(guard: hgNone) + if obj.isSome: + ?headers.fill(obj.get) + return ok(headers) + func clone*(headers: Headers): Headers = return Headers(table: headers.table) @@ -258,24 +273,33 @@ proc add*(headers: Headers; k: string; v: sink string) = do: headers.table[k] = @[v] -proc `[]=`*(headers: Headers; k: static string; v: string) = - const k = k.toHeaderCase() +proc `[]=`*(headers: Headers; k: string; v: sink string) = + let k = k.toHeaderCase() headers.table[k] = @[v] -func `[]`*(headers: Headers; k: static string): var string = - const k = k.toHeaderCase() +func `[]`*(headers: Headers; k: string): var string = + let k = k.toHeaderCase() return headers.table[k][0] -func contains*(headers: Headers; k: static string): bool = - const k = k.toHeaderCase() - return k in headers.table +func contains*(headers: Headers; k: string): bool = + return k.toHeaderCase() in headers.table -func getOrDefault*(headers: Headers; k: static string; default = ""): string = - const k = k.toHeaderCase() +func getOrDefault*(headers: Headers; k: string; default = ""): string = + let k = k.toHeaderCase() headers.table.withValue(k, p): return p[][0] do: return default +func getAllCommaSplit*(headers: Headers; k: string): seq[string] = + headers.table.withValue(k, p): + return p[].join(",").split(',') + return @[] + +func getAllNoComma*(headers: Headers; k: string): seq[string] = + headers.table.withValue(k, p): + return p[] + return @[] + proc addHeadersModule*(ctx: JSContext) = ctx.registerType(Headers) |