-- querystring and post body parsing local function urldecode(s) return s:gsub('+',' ') :gsub('%%(%x%x)',function(x) return string.char(tonumber(x,16)) end) end local function parse_qs(s) local ix = 1 local res = {} while true do local _,next_ix,ek,ev = s:find("([^=]+)=([^&]*)&?",ix) if not ek then break end local k,v = urldecode(ek), urldecode(ev) res[k] = v ix = next_ix + 1 end return res end