[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