aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJiale Zhi <vipcalio@gmail.com>2014-03-21 13:21:50 -0700
committerJiale Zhi <vipcalio@gmail.com>2014-03-21 13:21:50 -0700
commit71ecd7486d6d777708adcf6c2883716f07f8aa52 (patch)
treea4fab25522f3b93d3c98155d48435a0353958944
parent8d2ef74648be80c38cfe6c1f4179d79ce379b33f (diff)
downloadlua-resty-cookie-71ecd7486d6d777708adcf6c2883716f07f8aa52.tar.gz
lua-resty-cookie-71ecd7486d6d777708adcf6c2883716f07f8aa52.tar.bz2
lua-resty-cookie-71ecd7486d6d777708adcf6c2883716f07f8aa52.zip
Add support for set cookies. #2
-rw-r--r--lib/resty/cookie.lua42
-rw-r--r--t/sanity.t91
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