summary refs log tree commit diff stats
path: root/lib/pure/cookies.nim
blob: d1cf36a871fe3b7c846aea7ded09f56366dfae61 (plain) (blame)
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
#
#
#            Nimrod's Runtime Library
#        (c) Copyright 2012 Andreas Rumpf
#
#    See the file "copying.txt", included in this
#    distribution, for details about the copyright.
#

## This module implements helper procs for parsing Cookies.

import strtabs, times

proc parseCookies*(s: string): PStringTable = 
  ## parses cookies into a string table.
  result = newStringTable(modeCaseInsensitive)
  var i = 0
  while true:
    while s[i] == ' ' or s[i] == '\t': inc(i)
    var keystart = i
    while s[i] != '=' and s[i] != '\0': inc(i)
    var keyend = i-1
    if s[i] == '\0': break
    inc(i) # skip '='
    var valstart = i
    while s[i] != ';' and s[i] != '\0': inc(i)
    result[substr(s, keystart, keyend)] = substr(s, valstart, i-1)
    if s[i] == '\0': break
    inc(i) # skip ';'

proc setCookie*(key, value: string, domain = "", path = "", 
                expires = "", noName = false): string =
  ## Creates a command in the format of 
  ## ``Set-Cookie: key=value; Domain=...; ...``
  result = ""
  if not noName: result.add("Set-Cookie: ")
  result.add key & "=" & value
  if domain != "": result.add("; Domain=" & domain)
  if path != "": result.add("; Path=" & path)
  if expires != "": result.add("; Expires=" & expires)

proc setCookie*(key, value: string, expires: TTimeInfo,
                domain = "", path = "", noName = false): string =
  ## Creates a command in the format of 
  ## ``Set-Cookie: key=value; Domain=...; ...``
  ##
  ## **Note:** UTC is assumed as the timezone for ``expires``.
  
  return setCookie(key, value, domain, path,
            format(expires, "ddd',' dd MMM yyyy HH:mm:ss 'UTC'"), noname)
  
when isMainModule:
  var tim = TTime(int(getTime()) + 76 * (60 * 60 * 24))

  echo(setCookie("test", "value", tim.getGMTime()))
  
  echo parseCookies("uid=1; kp=2")