[tarantool-patches] [PATCH] httpc: add checking of headers in httpc:request
Roman Khabibov
roman.habibov at tarantool.org
Fri Dec 21 21:18:44 MSK 2018
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
More information about the Tarantool-patches
mailing list