From 71ecd7486d6d777708adcf6c2883716f07f8aa52 Mon Sep 17 00:00:00 2001 From: Jiale Zhi Date: Fri, 21 Mar 2014 13:21:50 -0700 Subject: Add support for set cookies. #2 --- lib/resty/cookie.lua | 42 ++++++++++++++++++++++-- t/sanity.t | 91 +++++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 126 insertions(+), 7 deletions(-) diff --git a/lib/resty/cookie.lua b/lib/resty/cookie.lua index 1a16592..be12e5f 100644 --- a/lib/resty/cookie.lua +++ b/lib/resty/cookie.lua @@ -95,13 +95,16 @@ end function _M.new(self) local _cookie = ngx.var.http_cookie - if not _cookie then - return nil, "no cookie found in current request" - end + --if not _cookie then + --return nil, "no cookie found in current request" + --end return setmetatable({ _cookie = _cookie }, mt) end function _M.get(self, key) + if not self._cookie then + return nil, "no cookie found in the current request" + end if self.cookie_table == nil then self.cookie_table = get_cookie_table(self._cookie) end @@ -112,6 +115,10 @@ end function _M.get_all(self) local err + if not self._cookie then + return nil, "no cookie found in the current request" + end + if self.cookie_table == nil then self.cookie_table = get_cookie_table(self._cookie) end @@ -119,4 +126,33 @@ function _M.get_all(self) return self.cookie_table end +local function bake(cookie) + if not cookie.key or not cookie.value then + return nil, 'missing cookie field "key" or "value"' + end + + if cookie["max-age"] then + cookie.max_age = cookie["max-age"] + end + local str = cookie.key .. "=" .. cookie.value + .. (cookie.expires and "; Expires=" .. cookie.expires or "") + .. (cookie.max_age and "; Max-Age=" .. cookie.max_age or "") + .. (cookie.domain and "; Domain=" .. cookie.domain or "") + .. (cookie.path and "; Path=" .. cookie.path or "") + .. (cookie.secure and "; Secure" or "") + .. (cookie.httponly and "; HttpOnly" or "") + .. (cookie.extension and "; " .. cookie.extension or "") + return str +end + +function _M.set(self, cookie) + local cookie_str, err = bake(cookie) + if not cookie_str then + return nil, err + end + print(cookie_str) + ngx.header['Set-Cookie'] = cookie_str + return true +end + return _M diff --git a/t/sanity.t b/t/sanity.t index 3f5472d..0899a82 100644 --- a/t/sanity.t +++ b/t/sanity.t @@ -5,7 +5,7 @@ use Cwd qw(cwd); repeat_each(2); -plan tests => repeat_each() * (blocks() * 3); +plan tests => repeat_each() * (blocks() * 3 + 2); my $pwd = cwd(); @@ -95,16 +95,21 @@ lang => en-US return end - local field = cookie:get("lang") + local field, err = cookie:get("lang") + if not field then + ngx.log(ngx.ERR, err) + ngx.say(err) + return + end ngx.say("lang", " => ", field) '; } --- request GET /t --- error_log -no cookie found in current request +no cookie found in the current request --- response_body -no cookie found in current request +no cookie found in the current request @@ -164,3 +169,81 @@ GET /t [error] --- response_body SID => foo + + + +=== TEST 6: set cookie +--- http_config eval: $::HttpConfig +--- config + location /t { + content_by_lua ' + local ck = require "resty.cookie" + local cookie, err = ck:new() + if not cookie then + ngx.log(ngx.ERR, err) + return + end + + local ok, err = cookie:set({ + key = "Name", value = "Bob", path = "/", + domain = "example.com", secure = true, httponly = true, + expires = "Wed, 09 Jun 2021 10:18:14 GMT", max_age = 50, + extension = "a4334aebaec" + }) + if not ok then + ngx.log(ngx.ERR, err) + return + end + ngx.say("Set cookie") + '; + } +--- request +GET /t +--- no_error_log +[error] +--- response_headers +Set-Cookie: Name=Bob; Expires=Wed, 09 Jun 2021 10:18:14 GMT; Max-Age=50; Domain=example.com; Path=/; Secure; HttpOnly; a4334aebaec +--- response_body +Set cookie + + + +=== TEST 7: set multiple cookie +--- http_config eval: $::HttpConfig +--- config + location /t { + content_by_lua ' + local ck = require "resty.cookie" + local cookie, err = ck:new() + if not cookie then + ngx.log(ngx.ERR, err) + return + end + + local ok, err = cookie:set({ + key = "Name", value = "Bob", path = "/", + }) + if not ok then + ngx.log(ngx.ERR, err) + return + end + + local ok, err = cookie:set({ + key = "Age", value = "20", + }) + if not ok then + ngx.log(ngx.ERR, err) + return + end + ngx.say("Set cookie") + '; + } +--- request +GET /t +--- no_error_log +[error] +--- response_headers +Set-Cookie: Name=Bob; Path=/ +Set-Cookie: Age=20 +--- response_body +Set cookie -- cgit v1.2.3-54-g00ecf