* First work on better timezones * Update tests to new api. Removed tests for checking that `isDst` was included when formatting, since `isDst` no longer affects utc offset (the entire utc offset is stored directly in `utcOffset` instead). * Deprecate getLocaltime & getGmTime * Add `now()` as a shorthand for GetTIme().inZone(Local) * Add FedericoCeratto's timezone tests (#6548) * Run more tests in all timezones * Make month enum start at 1 instead of 0 * Deprecate getDayOfWeekJulian * Fix issues with gc safety * Rename TimeInfo => DateTime * Fixes #6465 * Improve isLeapYear * FIx handling negative adjTime * Cleanup: - deprecated toSeconds and fromSeconds, added fromUnix and toUnix instead (that returns int64 instead of float) - added missing doc comments - removed some unnecessary JS specific implementations * Fix misstake in JS `-` for Time * Update usage of TimeEffect * Removed unecessary use of `difftime` * JS fix for local tz * Fix subtraction of months * Fix `days` field in `toTimeInterval` * Style and docs * Fix getDayOfYear for real this time... * Fix handling of adding/subtracting time across dst transitions * Fix some bad usage of the times module in the stdlib * Revert to use proper time resoultion for seeding in random.nim * Move deprecated procs to bottom of file * Always use `epochTime` in `randomize` * Remove TimeInterval normalization * Fixes #6905 * Fix getDayOfWeek for year < 1 * Export toEpochDay/fromEpochDay and change year/month/monthday order * Add asserts for checking that the monthday is valid * Fix some remaining ambiguous references to `Time` * Fix ambiguous reference to Time
76 lines
2.4 KiB
Nim
76 lines
2.4 KiB
Nim
#
|
|
#
|
|
# 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.
|
|
##
|
|
## The proc is meant to parse the Cookie header set by a client, not the
|
|
## "Set-Cookie" header set by servers.
|
|
##
|
|
## Example:
|
|
##
|
|
## .. code-block::Nim
|
|
## doAssert parseCookies("a=1; foo=bar") == {"a": 1, "foo": "bar"}.newStringTable
|
|
|
|
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: DateTime,
|
|
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 'GMT'"),
|
|
noname, secure, httpOnly)
|
|
|
|
when isMainModule:
|
|
var tim = fromUnix(getTime().toUnix + 76 * (60 * 60 * 24))
|
|
|
|
let cookie = setCookie("test", "value", tim.utc)
|
|
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"
|