1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
import tables
import js/javascript
import utils/twtstr
type Headers* = ref object
table* {.jsget.}: Table[string, seq[string]]
jsDestructor(Headers)
proc fill*(headers: Headers, ctx: JSContext, val: JSValue) =
if isSequence(ctx, val):
let x = fromJS[seq[(string, string)]](ctx, val)
if x.isSome:
for (k, v) in x.get:
if k in headers.table:
headers.table[k].add(v)
else:
headers.table[k] = @[v]
else:
let x = fromJS[Table[string, string]](ctx, val)
if x.isSome:
for k, v in x.get:
if k in headers.table:
headers.table[k].add(v)
else:
headers.table[k] = @[v]
func newHeaders*(): Headers =
new(result)
func newHeaders*(ctx: JSContext, obj = none(JSValue)): Headers {.jsctor.} =
new(result)
if obj.isSome:
result.fill(ctx, obj.get)
func newHeaders*(table: Table[string, string]): Headers =
new(result)
for k, v in table:
let k = k.toHeaderCase()
if k in result.table:
result.table[k].add(v)
else:
result.table[k] = @[v]
func clone*(headers: Headers): Headers =
return Headers(
table: headers.table
)
proc add*(headers: var Headers, k, v: string) =
let k = k.toHeaderCase()
if k notin headers.table:
headers.table[k] = @[v]
else:
headers.table[k].add(v)
proc `[]=`*(headers: var Headers, k, v: string) =
headers.table[k.toHeaderCase()] = @[v]
func getOrDefault*(headers: Headers, k: string, default = ""): string =
let k = k.toHeaderCase()
if k in headers.table:
headers.table[k][0]
else:
default
proc addHeadersModule*(ctx: JSContext) =
ctx.registerType(Headers)
|