summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rwxr-xr-xlib/pure/cookies.nim31
-rwxr-xr-xlib/pure/times.nim119
2 files changed, 149 insertions, 1 deletions
diff --git a/lib/pure/cookies.nim b/lib/pure/cookies.nim
index fa839c59b..6ae9b91c3 100755
--- a/lib/pure/cookies.nim
+++ b/lib/pure/cookies.nim
@@ -9,7 +9,7 @@
 
 ## This module implements helper procs for parsing Cookies.
 
-import strtabs
+import strtabs, times
 
 proc parseCookies*(s: string): PStringTable = 
   ## parses cookies into a string table.
@@ -28,3 +28,32 @@ proc parseCookies*(s: string): PStringTable =
     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")
+  
+                
\ No newline at end of file
diff --git a/lib/pure/times.nim b/lib/pure/times.nim
index 84af95471..47be91e09 100755
--- a/lib/pure/times.nim
+++ b/lib/pure/times.nim
@@ -390,4 +390,123 @@ proc `$`*(m: TMonth): string =
       "November", "December"]
   return lookup[m]
 
+proc format*(info: TTimeInfo, f: string): string =
+  ## This function formats `info` as specified by `f`. The following format
+  ## specifiers are available:
+  ## 
+  ## ==========  =================================================================================  ================================================
+  ## Specifier   Description                                                                        Example
+  ## ==========  =================================================================================  ================================================
+  ##    d        Numeric value of the day of the month, it will be one or two digits long.          ``1/04/2012 -> 1``, ``21/04/2012 -> 21``
+  ##    dd       Same as above, but always two digits.                                              ``1/04/2012 -> 01``, ``21/04/2012 -> 21``
+  ##    ddd      Three letter string which indicates the day of the week.                           ``Saturday -> Sat``, ``Monday -> Mon``
+  ##    dddd     Full string for the day of the week.                                               ``Saturday -> Saturday``, ``Monday -> Monday``
+  ##    h        The hours in one digit if possible. Ranging from 0-12.                             ``5pm -> 5``, ``2am -> 2``
+  ##    hh       The hours in two digits always. If the hour is one digit 0 is prepended.           ``5pm -> 05``, ``11am -> 11``
+  ##    H        The hours in one digit if possible, randing from 0-24.                             ``5pm -> 17``, ``2am -> 2``
+  ##    HH       The hours in two digits always. 0 is prepended if the hour is one digit.           ``5pm -> 17``, ``2am -> 02``
+  ##    m        The minutes in 1 digit if possible.                                                ``5:30 -> 30``, ``2:01 -> 1``
+  ##    mm       Same as above but always 2 digits, 0 is prepended if the minute is one digit.      ``5:30 -> 30``, ``2:01 -> 01``
+  ##    M
+  
+  
+  ## ==========  =================================================================================  ================================================
+
+
+  result = ""
+  var i = 0
+  var currentF = ""
+  while True:
+    case f[i]
+    of '\0':
+      break
+    of ' ', '-', '/', ':', '\'':
+      case currentF
+      of "d":
+        result.add($info.monthday)
+      of "dd":
+        if info.monthday < 10:
+          result.add("0")
+        result.add($info.monthday)
+      of "ddd":
+        result.add(($info.month)[0 .. 2])
+      of "dddd":
+        result.add($info.month)
+      of "h":
+        result.add($(0 - (info.hour - 12)))
+      of "hh":
+        let amerHour = 0 - (info.hour - 12)
+        if amerHour < 10:
+          result.add('0')
+        result.add($amerHour)
+      of "H":
+        result.add($info.hour)
+      of "HH":
+        if info.hour < 10:
+          result.add('0')
+        result.add($info.hour)
+      of "m":
+        result.add($info.minute)
+      of "mm":
+        if info.minute < 10:
+          result.add('0')
+        result.add($info.minute)
+      of "M":
+        result.add($(int(info.month)))
+      of "MM":
+        if int(info.month) < 10:
+          result.add('0')
+        result.add($(int(info.month)))
+      of "MMM":
+        result.add(($info.month)[0..2])
+      of "MMMM":
+        result.add($info.month)
+      of "s":
+        result.add($info.second)
+      of "ss":
+        if info.second < 10:
+          result.add('0')
+        result.add($info.second)
+      of "t":
+        if info.hour >= 12:
+          result.add('P')
+        else: result.add('A')
+      of "tt":
+        if info.hour >= 12:
+          result.add("PM")
+        else: result.add("AM")
+      of "y":
+        var fr = ($info.year).len()-2
+        if fr < 0: fr = 0
+        result.add(($info.year)[fr .. ($info.year).len()-1])
+      of "yy":
+        var fr = ($info.year).len()-3
+        if fr < 0: fr = 0
+        result.add(($info.year)[fr .. ($info.year).len()-1])
+      of "yyy":
+        var fr = ($info.year).len()-4
+        if fr < 0: fr = 0
+        result.add(($info.year)[fr .. ($info.year).len()-1])
+      of "yyyy":
+        result.add($info.year)
+      of "yyyyy":
+        result.add('0')
+        result.add($info.year)
+      of "":
+        nil # Do nothing.
+      else:
+        raise newException(EInvalidValue, "Invalid format string: " & currentF)
+      
+      currentF = ""
+      
+      if f[i] == '\'':
+        inc(i) # Skip '
+        while f[i] != '\'' and f.len-1 > i:
+          result.add(f[i])
+          inc(i)
+      else: result.add(f[i])
+      
+    else: currentF.add(f[i])
+    inc(i)
+
 {.pop.}