diff options
author | Caleb Maclennan <caleb@alerque.com> | 2023-11-10 09:12:04 +0300 |
---|---|---|
committer | Caleb Maclennan <caleb@alerque.com> | 2023-11-10 09:12:04 +0300 |
commit | 5c4fc93d5f4137bf4c22ddf1a048c907a4a26727 (patch) | |
tree | a9a68e1f6a9c3bfe2b64fa1c3a4098865b7d3b5d /samples/cookie.lua | |
parent | ccef3bc4e2aa6ee5b997a80aabb58f4ff0b0e98f (diff) | |
parent | 43a97b7f0053313b43906371dbdc226271e6c8ab (diff) | |
download | luasocket-hjelmeland-patch-1.tar.gz luasocket-hjelmeland-patch-1.tar.bz2 luasocket-hjelmeland-patch-1.zip |
Merge branch 'master' into hjelmeland-patch-1hjelmeland-patch-1
Diffstat (limited to 'samples/cookie.lua')
-rw-r--r-- | samples/cookie.lua | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/samples/cookie.lua b/samples/cookie.lua new file mode 100644 index 0000000..fec10a1 --- /dev/null +++ b/samples/cookie.lua | |||
@@ -0,0 +1,88 @@ | |||
1 | local socket = require"socket" | ||
2 | local http = require"socket.http" | ||
3 | local url = require"socket.url" | ||
4 | local ltn12 = require"ltn12" | ||
5 | |||
6 | local token_class = '[^%c%s%(%)%<%>%@%,%;%:%\\%"%/%[%]%?%=%{%}]' | ||
7 | |||
8 | local function unquote(t, quoted) | ||
9 | local n = string.match(t, "%$(%d+)$") | ||
10 | if n then n = tonumber(n) end | ||
11 | if quoted[n] then return quoted[n] | ||
12 | else return t end | ||
13 | end | ||
14 | |||
15 | local function parse_set_cookie(c, quoted, cookie_table) | ||
16 | c = c .. ";$last=last;" | ||
17 | local _, _, n, v, i = string.find(c, "(" .. token_class .. | ||
18 | "+)%s*=%s*(.-)%s*;%s*()") | ||
19 | local cookie = { | ||
20 | name = n, | ||
21 | value = unquote(v, quoted), | ||
22 | attributes = {} | ||
23 | } | ||
24 | while 1 do | ||
25 | _, _, n, v, i = string.find(c, "(" .. token_class .. | ||
26 | "+)%s*=?%s*(.-)%s*;%s*()", i) | ||
27 | if not n or n == "$last" then break end | ||
28 | cookie.attributes[#cookie.attributes+1] = { | ||
29 | name = n, | ||
30 | value = unquote(v, quoted) | ||
31 | } | ||
32 | end | ||
33 | cookie_table[#cookie_table+1] = cookie | ||
34 | end | ||
35 | |||
36 | local function split_set_cookie(s, cookie_table) | ||
37 | cookie_table = cookie_table or {} | ||
38 | -- remove quoted strings from cookie list | ||
39 | local quoted = {} | ||
40 | s = string.gsub(s, '"(.-)"', function(q) | ||
41 | quoted[#quoted+1] = q | ||
42 | return "$" .. #quoted | ||
43 | end) | ||
44 | -- add sentinel | ||
45 | s = s .. ",$last=" | ||
46 | -- split into individual cookies | ||
47 | i = 1 | ||
48 | while 1 do | ||
49 | local _, _, cookie, next_token | ||
50 | _, _, cookie, i, next_token = string.find(s, "(.-)%s*%,%s*()(" .. | ||
51 | token_class .. "+)%s*=", i) | ||
52 | if not next_token then break end | ||
53 | parse_set_cookie(cookie, quoted, cookie_table) | ||
54 | if next_token == "$last" then break end | ||
55 | end | ||
56 | return cookie_table | ||
57 | end | ||
58 | |||
59 | local function quote(s) | ||
60 | if string.find(s, "[ %,%;]") then return '"' .. s .. '"' | ||
61 | else return s end | ||
62 | end | ||
63 | |||
64 | local _empty = {} | ||
65 | local function build_cookies(cookies) | ||
66 | s = "" | ||
67 | for i,v in ipairs(cookies or _empty) do | ||
68 | if v.name then | ||
69 | s = s .. v.name | ||
70 | if v.value and v.value ~= "" then | ||
71 | s = s .. '=' .. quote(v.value) | ||
72 | end | ||
73 | end | ||
74 | if v.name and #(v.attributes or _empty) > 0 then s = s .. "; " end | ||
75 | for j,u in ipairs(v.attributes or _empty) do | ||
76 | if u.name then | ||
77 | s = s .. u.name | ||
78 | if u.value and u.value ~= "" then | ||
79 | s = s .. '=' .. quote(u.value) | ||
80 | end | ||
81 | end | ||
82 | if j < #v.attributes then s = s .. "; " end | ||
83 | end | ||
84 | if i < #cookies then s = s .. ", " end | ||
85 | end | ||
86 | return s | ||
87 | end | ||
88 | |||