坑爹啊!OpenResty HTTP庫 request_uri方法set_keepalive報錯源碼中的BUG分析

分發層架構中,我們會在nginx裏去寫lua腳本,因爲我們需要自定義一些特殊的業務邏輯
比如說,流量分發,自己用lua去寫分發的邏輯,在分發層nginx裏去寫的
再比如說,要用l緩存架構中的的控制邏輯,在應用層nginx裏去寫的
nginx+lua 用最流行的開源方案,就是用OpenResty
這次我下了一個最新的OpenResty,自己用lua去寫分發的邏輯,在分發層nginx裏去寫的,發現OpenResty最新的 http.new() new出來的對象request_uri方法老是報錯,原來一直都是這樣就可以的
local resp, err = httpc:request_uri(hostUrl, {
method = “GET”,
path = requestBody
})
結果居然報錯了,提示
lua entry thread aborted: runtime error: /usr/hello/lualib/resty/http.lua:909: bad argument #2 to ‘set_keepalive’ (number expected, got nil)
以前做類似的分發代碼的時候,request_uri方法是從來不會報錯的,反覆檢查自己代碼很多遍,應該沒問題纔是,然後直接去看http.lua源碼了,來到909行
在這裏插入圖片描述

在 909 local ok, err = self:set_keepalive(params.keepalive_timeout, params.keepalive_pool)直接報錯
提示bad argument 分析以上代碼

 902     if params.keepalive == false then
 903         local ok, err = self:close()
 904         if not ok then
 905             ngx_log(ngx_ERR, err)
 906         end 

分析說明:
若params 也就是之前我們請求時帶的關聯數組
{
method = “GET”,
path = requestBody
} 這一坨中keepalive這個屬性不爲假 那就調用self:set_keepalive方法,然後這方法調用失敗了,因爲我們沒有在params傳參數進去
直接報number expected, got nil,參數爲空
不知道大家有沒有發現什麼問題,其實是OpenResty源碼這一塊有問題,他不應該去判斷是否keepalive爲假,因爲keepalive這個參數不填的時候,lua的語言性質決定了,這個地方會返回假 因爲nil == false會返回假 所以就執行了有keepalive的邏輯 不信的同學可以用lua交互式模式打印一下 print(nil == false) 會返回假的 所以本來空值的時候不該走下面的流程的,但是由於編碼疏忽,沒有實現相應的效果
希望OpenResty官方儘快修復這個錯誤
臨時解決方案:
在關聯數組中多傳一個參數keepalive=false 即
{
method = “GET”,
path = requestBody,
keepalive=false
}
顯式的給keepalive傳遞一個false 避免發生這樣的問題
******

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章