| rev | 
   line source | 
| 
jbe/bsw@16
 | 
     1 --[[--
 | 
| 
jbe/bsw@16
 | 
     2 request.set_cookie{
 | 
| 
jbe@551
 | 
     3   name     = name,     -- name of cookie
 | 
| 
jbe@551
 | 
     4   value    = value,    -- value of cookie
 | 
| 
jbe@551
 | 
     5   domain   = domain,   -- optional domain domain where cookie is transmitted
 | 
| 
jbe@551
 | 
     6   path     = path,     -- optional path where cookie is transmitted, defaults to application base
 | 
| 
jbe@551
 | 
     7   secure   = secure,   -- optional boolean, indicating if cookie should only be transmitted over HTTPS
 | 
| 
jbe@551
 | 
     8   samesite = samesite  -- SameSite policy set to "strict", "lax", or "none" (all lower-case, defaults to "lax")
 | 
| 
jbe/bsw@16
 | 
     9 }
 | 
| 
jbe/bsw@16
 | 
    10 
 | 
| 
jbe/bsw@16
 | 
    11 This function is similar to rocketwiki.set_cookie{...}, except that it automatically sets the path to the application base. It also sets secure=true, if the secure option is unset and the application base URL starts with "https://".
 | 
| 
jbe/bsw@16
 | 
    12 
 | 
| 
jbe/bsw@16
 | 
    13 --]]--
 | 
| 
jbe/bsw@16
 | 
    14 
 | 
| 
jbe/bsw@16
 | 
    15 function request.set_cookie(args)
 | 
| 
jbe@223
 | 
    16   local args = table.new(args)
 | 
| 
jbe@223
 | 
    17   if not args.path then
 | 
| 
jbe@223
 | 
    18     args.path = string.match(
 | 
| 
jbe/bsw@16
 | 
    19       request.get_absolute_baseurl(),
 | 
| 
jbe/bsw@16
 | 
    20       "://[^/]*(.*)"
 | 
| 
jbe/bsw@16
 | 
    21     )
 | 
| 
jbe@249
 | 
    22     if args.path == nil then
 | 
| 
jbe@249
 | 
    23       args.path = "/"
 | 
| 
jbe/bsw@16
 | 
    24     end
 | 
| 
jbe/bsw@16
 | 
    25   end
 | 
| 
jbe@223
 | 
    26   if args.secure == nil then
 | 
| 
jbe/bsw@16
 | 
    27     if string.find(
 | 
| 
jbe/bsw@16
 | 
    28       string.lower(request.get_absolute_baseurl()),
 | 
| 
jbe/bsw@16
 | 
    29       "^https://"
 | 
| 
jbe/bsw@16
 | 
    30     ) then
 | 
| 
jbe@223
 | 
    31       args.secure = true
 | 
| 
jbe/bsw@16
 | 
    32     else
 | 
| 
jbe@223
 | 
    33       args.secure = false
 | 
| 
jbe/bsw@16
 | 
    34     end
 | 
| 
jbe/bsw@16
 | 
    35   end
 | 
| 
jbe@223
 | 
    36   assert(string.find(args.name, "^[0-9A-Za-z%%._~-]+$"), "Illegal cookie name")
 | 
| 
jbe@223
 | 
    37   assert(string.find(args.value, "^[0-9A-Za-z%%._~-]+$"), "Illegal cookie value")
 | 
| 
jbe@223
 | 
    38   local parts = {args.name .. "=" .. args.value}
 | 
| 
jbe@223
 | 
    39   if args.domain then
 | 
| 
jbe@223
 | 
    40     assert(
 | 
| 
jbe@223
 | 
    41       string.find(args.path, "^[0-9A-Za-z%%/._~-]+$"),
 | 
| 
jbe@223
 | 
    42       "Illegal cookie domain"
 | 
| 
jbe@223
 | 
    43     )
 | 
| 
jbe@223
 | 
    44     parts[#parts+1] = "domain=" .. args.domain
 | 
| 
jbe@223
 | 
    45   end
 | 
| 
jbe@223
 | 
    46   if args.path then
 | 
| 
jbe@223
 | 
    47     assert(
 | 
| 
jbe@223
 | 
    48       string.find(args.path, "^[0-9A-Za-z%%/._~-]+$"),
 | 
| 
jbe@223
 | 
    49       "Illegal cookie path"
 | 
| 
jbe@223
 | 
    50     )
 | 
| 
jbe@223
 | 
    51     parts[#parts+1] = "path=" .. args.path
 | 
| 
jbe@223
 | 
    52   end
 | 
| 
jbe@223
 | 
    53   if args.secure then
 | 
| 
jbe@223
 | 
    54     parts[#parts+1] = "secure"
 | 
| 
jbe@223
 | 
    55   end
 | 
| 
jbe@551
 | 
    56   if args.samesite == "strict" then
 | 
| 
jbe@551
 | 
    57     parts[#parts+1] = "SameSite=Strict"
 | 
| 
jbe@551
 | 
    58   elseif args.samesite == "lax" or args.samesite == nil then
 | 
| 
jbe@551
 | 
    59     parts[#parts+1] = "SameSite=Lax"
 | 
| 
jbe@551
 | 
    60   elseif args.samesite == "none" then
 | 
| 
jbe@551
 | 
    61     parts[#parts+1] = "SameSite=None"
 | 
| 
jbe@551
 | 
    62   else
 | 
| 
jbe@551
 | 
    63     error("Cookie SameSite policy set to unsupported value")
 | 
| 
jbe@551
 | 
    64   end
 | 
| 
jbe@223
 | 
    65   request.add_header("Set-Cookie", table.concat(parts, "; "))
 | 
| 
jbe/bsw@16
 | 
    66 end
 |