From: Roman Khabibov <roman.habibov@tarantool.org> To: tarantool-patches@freelists.org Cc: alexander.turenko@tarantool.org Subject: [tarantool-patches] [PATCH] httpc: add checking of headers in httpc:request Date: Fri, 21 Dec 2018 21:18:44 +0300 [thread overview] Message-ID: <20181221181844.4417-1-roman.habibov@tarantool.org> (raw) Add function that checks the value of each header. It must be 'string' or 'table' with '__tostring' metamethod. Closes #3679 --- Branch: https://github.com/tarantool/tarantool/tree/romanhabibov/gh-3679-httpc-request Issue: https://github.com/tarantool/tarantool/issues/3679 src/lua/httpc.lua | 23 +++++++++++++++++++++++ test/app-tap/http_client.test.lua | 17 +++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/src/lua/httpc.lua b/src/lua/httpc.lua index cd44b6054..ede976a3a 100644 --- a/src/lua/httpc.lua +++ b/src/lua/httpc.lua @@ -216,6 +216,28 @@ local function process_cookies(cookies) return result end +local function check_headers(opts) + if opts ~= nil then + local headers = opts["headers"] + if headers ~= nil then + for header, value in pairs(headers) do + if type(value) ~= 'string' then + if type(value) ~= 'table' then + error('Usage: httpc:request bad \''..header..'\' value') + end + local mt = getmetatable(value) + if mt == nil then + error('Usage: httpc:request \''..header..'\' has not \'__tostring\'') + end + if mt["__tostring"] ~= nil then + headers[header] = tostring(value) + end + end + end + end + end +end + local function process_headers(headers) for header, value in pairs(headers) do if type(value) == 'table' then @@ -296,6 +318,7 @@ curl_mt = { if not method or not url then error('request(method, url [, options]])') end + check_headers(opts) local resp = self.curl:request(method, url, body, opts or {}) if resp and resp.headers then if resp.headers['set-cookie'] ~= nil then diff --git a/test/app-tap/http_client.test.lua b/test/app-tap/http_client.test.lua index 10a3728f8..d7e01d60f 100755 --- a/test/app-tap/http_client.test.lua +++ b/test/app-tap/http_client.test.lua @@ -205,6 +205,23 @@ local function test_errors(test) test:is(r.status, 595, "GET: response on bad url") end +--gh-3679 Check that client check that the httpc:request doesn't modify headers. + +local function test_request_headers(test) + test:plan(5) + httpc = require('http.client').new() + test:ok(not pcall(httpc:request('GET', 'localhost:4444', nil, {headers = {aaa = true}})), + 'expected error about bad value') + test:ok(not pcall(httpc:request('GET', 'localhost:4444', nil, {headers = {aaa = 10}})), + 'expected error about bad value') + test:ok(not pcall(httpc:request('GET', 'localhost:4444', nil, {headers = {aaa = box.NULL}})), + 'expected error about bad value') + test:ok(not pcall(httpc:request('GET', 'localhost:4444', nil, {headers = {aaa = 10ULL}})), + 'expected error about bad value') + test:ok(not pcall(httpc:request('GET', 'localhost:4444', nil, {headers = {aaa = {}}})), + 'expected error with no \'__tostring\'') +end + local function test_headers(test, url, opts) test:plan(19) local http = client:new() -- 2.17.1
next reply other threads:[~2018-12-21 18:18 UTC|newest] Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top 2018-12-21 18:18 Roman Khabibov [this message] 2018-12-23 3:19 ` [tarantool-patches] " Alexander Turenko 2018-12-26 15:56 ` Roman 2018-12-29 10:30 ` Vladislav Shpilevoy 2019-01-09 13:29 ` Roman 2019-01-24 14:54 ` Roman 2019-01-29 19:44 ` Vladislav Shpilevoy 2019-01-29 20:32 ` Alexander Turenko 2019-01-31 23:47 ` Roman 2019-02-05 11:42 ` Vladislav Shpilevoy 2019-02-11 23:24 ` Roman 2019-02-15 21:17 ` Vladislav Shpilevoy 2019-02-19 10:49 ` Roman 2019-02-22 16:01 ` Vladislav Shpilevoy 2019-02-23 21:38 ` Roman Khabibov 2019-02-23 22:43 ` Roman Khabibov 2019-02-25 13:04 ` Vladislav Shpilevoy 2019-02-25 14:51 ` Kirill Yukhin
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20181221181844.4417-1-roman.habibov@tarantool.org \ --to=roman.habibov@tarantool.org \ --cc=alexander.turenko@tarantool.org \ --cc=tarantool-patches@freelists.org \ --subject='Re: [tarantool-patches] [PATCH] httpc: add checking of headers in httpc:request' \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox