summary refs log tree commit diff stats
path: root/lib/pure/cookies.nim
blob: 8090cd49dfab33b37ccec4cc1ad1a14208e9b09b (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
60
61
62
63
64
65
66
67
#
#
#            Nim'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): StringTableRef =
  ## 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,
                secure = false, httpOnly = 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)
  if secure: result.add("; secure")
  if httpOnly: result.add("; HttpOnly")

proc setCookie*(key, value: string, expires: TimeInfo,
                domain = "", path = "", noName = false,
                secure = false, httpOnly = 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, secure, httpOnly)

when isMainModule:
  var tim = Time(int(getTime()) + 76 * (60 * 60 * 24))

  let cookie = setCookie("test", "value", tim.getGMTime())
  when not defined(testing):
    echo cookie
  let start = "Set-Cookie: test=value; Expires="
  assert cookie[0..start.high] == start

  let table = parseCookies("uid=1; kp=2")
  assert table["uid"] == "1"
  assert table["kp"] == "2"
n> class="muRecipe">def</span> to-text-line x:_elem<span class="muRecipe"> -&gt; </span>y:text [ <span id="L10" class="LineNr">10 </span> <span class="Constant">local-scope</span> <span id="L11" class="LineNr">11 </span> <span class="Constant">load-inputs</span> <span id="L12" class="LineNr">12 </span> y <span class="Special">&lt;-</span> to-text x <span id="L13" class="LineNr">13 </span>] <span id="L14" class="LineNr">14 </span> <span id="L15" class="LineNr">15 </span><span class="Comment"># variant for arrays (since we can't pass them around otherwise)</span> <span id="L16" class="LineNr">16 </span><span class="muRecipe">def</span> <a href='059to_text.mu.html#L16'>array-to-text-line</a> x:&amp;:@:_elem<span class="muRecipe"> -&gt; </span>y:text [ <span id="L17" class="LineNr">17 </span> <span class="Constant">local-scope</span> <span id="L18" class="LineNr">18 </span> <span class="Constant">load-inputs</span> <span id="L19" class="LineNr">19 </span> y <span class="Special">&lt;-</span> to-text *x <span id="L20" class="LineNr">20 </span>] <span id="L21" class="LineNr">21 </span> <span id="L22" class="LineNr">22 </span><span class="muScenario">scenario</span> to-text-line-early-warning-for-static-dispatch [ <span id="L23" class="LineNr">23 </span> x:text <span class="Special">&lt;-</span> to-text-line<span class="Constant"> 34</span> <span id="L24" class="LineNr">24 </span> <span class="Comment"># just ensure there were no errors</span> <span id="L25" class="LineNr">25 </span>] <span id="L26" class="LineNr">26 </span> <span id="L27" class="LineNr">27 </span><span class="muScenario">scenario</span> array-to-text-line-early-warning-for-static-dispatch [ <span id="L28" class="LineNr">28 </span> n:&amp;:@:num <span class="Special">&lt;-</span> new <span class="Constant">number:type</span>,<span class="Constant"> 3</span> <span id="L29" class="LineNr">29 </span> x:text <span class="Special">&lt;-</span> <a href='059to_text.mu.html#L16'>array-to-text-line</a> n <span id="L30" class="LineNr">30 </span> <span class="Comment"># just ensure there were no errors</span> <span id="L31" class="LineNr">31 </span>] <span id="L32" class="LineNr">32 </span> <span id="L33" class="LineNr">33 </span><span class="Comment"># finally, a specialization for single characters</span> <span id="L34" class="LineNr">34 </span><span class="muRecipe">def</span> to-text c:char<span class="muRecipe"> -&gt; </span>y:text [ <span id="L35" class="LineNr">35 </span> <span class="Constant">local-scope</span> <span id="L36" class="LineNr">36 </span> <span class="Constant">load-inputs</span> <span id="L37" class="LineNr">37 </span> y <span class="Special">&lt;-</span> new <span class="Constant">character:type</span>, <span class="Constant">1/capacity</span> <span id="L38" class="LineNr">38 </span> *y <span class="Special">&lt;-</span> put-index *y,<span class="Constant"> 0</span>, c <span id="L39" class="LineNr">39 </span>] <span id="L40" class="LineNr">40 </span> <span id="L41" class="LineNr">41 </span><span class="muScenario">scenario</span> character-to-text [ <span id="L42" class="LineNr">42 </span> 1:char <span class="Special">&lt;-</span> copy <span class="Constant">111/o</span> <span id="L43" class="LineNr">43 </span> 2:text <span class="Special">&lt;-</span> to-text 1:char <span id="L44" class="LineNr">44 </span> 3:@:char <span class="Special">&lt;-</span> copy *2:text <span id="L45" class="LineNr">45 </span> memory-should-contain [ <span id="L46" class="LineNr">46 </span> 3:array:character <span class="Special">&lt;-</span> <span class="Constant">[o]</span> <span id="L47" class="LineNr">47 </span> ] <span id="L48" class="LineNr">48 </span>] </pre> </body> </html> <!-- vim: set foldmethod=manual : -->