Tarantool development patches archive
 help / color / mirror / Atom feed
* [tarantool-patches] [PATCH] httpc: add checking of headers in httpc:request
@ 2018-12-21 18:18 Roman Khabibov
  2018-12-23  3:19 ` [tarantool-patches] " Alexander Turenko
  2019-02-25 14:51 ` Kirill Yukhin
  0 siblings, 2 replies; 18+ messages in thread
From: Roman Khabibov @ 2018-12-21 18:18 UTC (permalink / raw)
  To: tarantool-patches; +Cc: alexander.turenko

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

^ permalink raw reply	[flat|nested] 18+ messages in thread

end of thread, other threads:[~2019-02-25 14:51 UTC | newest]

Thread overview: 18+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-12-21 18:18 [tarantool-patches] [PATCH] httpc: add checking of headers in httpc:request Roman Khabibov
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

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox