Lua(LuaJit)cURL\u easy\u getinfo无法按预期工作

Lua(LuaJit)cURL\u easy\u getinfo无法按预期工作,curl,lua,libcurl,ffi,luajit,Curl,Lua,Libcurl,Ffi,Luajit,我正在尝试使用curl\u easy\u getinfo获取信息CURLINFO\u响应\u code和CURLINFO\u内容\u TYPE,但两次尝试似乎都失败了 就像在LuaJit/scanf示例中一样,我正在分配ffi.new(“int[1]”)来获取一个元素作为指针并将其用作参数,以便在保存后读取值 ffi = require "ffi" url = [[http://static02.mediaite.com/geekosystem/uploads/2013/12/doge.jpg

我正在尝试使用
curl\u easy\u getinfo
获取信息
CURLINFO\u响应\u code
CURLINFO\u内容\u TYPE
,但两次尝试似乎都失败了

就像在LuaJit/scanf示例中一样,我正在分配
ffi.new(“int[1]”)来获取一个元素作为指针并将其用作参数,以便在保存后读取值

ffi = require "ffi"

url = [[http://static02.mediaite.com/geekosystem/uploads/2013/12/doge.jpg]]

ffi.cdef [[
    int curl_version();
    void *curl_easy_init();
    int curl_easy_setopt(void *curl, int option, ...);
    int curl_easy_perform(void *curl);
    void curl_easy_cleanup(void *curl);
    int curl_easy_getinfo(void *curl, int info, ...);
]]

function curl_callback(ptr, size, nmemb, userdata)
    print("Data callback! File-ID: ", userdata, "\n")
    return size*nmemb
end

ffi_curl_callback = ffi.cast("size_t (*)(char *ptr, size_t size, size_t nmemb, void *userdata)", curl_callback)

CURLOPT_URL = 10002
CURLOPT_WRITEFUNCTION = 20011
CURLOPT_VERBOSE = 41
CURLOPT_PROGRESSDATA = 10057
CURLOPT_NOPROGRESS = 43
CURLOPT_WRITEDATA = 10001
CURLE_OK = 0

CURLINFO_RESPONSE_CODE = 2097154
CURLINFO_CONTENT_TYPE = 1048594

libcurl = ffi.load("libcurl.dll")

-- print("cURL Version: ", libcurl.curl_version(), "\n")

curl = libcurl.curl_easy_init()

if curl then

    file = ffi.new("int", 0xabc) -- not needed

    print("Trying to download: ", url, "\n")
    libcurl.curl_easy_setopt(curl, CURLOPT_VERBOSE, ffi.new("long", 1))
    libcurl.curl_easy_setopt(curl, CURLOPT_URL, url)
    libcurl.curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, ffi_curl_callback)
    --libcurl.curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1)
    --libcurl.curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, 123)
    libcurl.curl_easy_setopt(curl, CURLOPT_WRITEDATA, ffi.cast("void *", file))

    -- bug fixed, called curl_easy_getinfo before curl_easy_perform
    result = libcurl.curl_easy_perform(curl)
    if result == CURLE_OK then
        response_code = ffi.new("int[1]")
        content_type = ffi.new("char*[1]")
        libcurl.curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, response_code)
        libcurl.curl_easy_getinfo(curl, CURLINFO_CONTENT_TYPE, content_type)
        print("RESPONSE CODE: '", tonumber(response_code[0]), "'\n")
        print("CONTENT TYPE: '", ffi.string(content_type[0]), "'\n")
    else
        print("Error! Result: ", result, "\n")
    end

    libcurl.curl_easy_cleanup(curl)
end
输出为(错误的旧输出):

数据回调!文件ID:cdata:0x00000abc
数据回调!文件ID:cdata:0x00000abc
数据回调!文件ID:cdata:0x00000abc
数据回调!文件ID:cdata:0x00000abc
数据回调!文件ID:cdata:0x00000abc
数据回调!文件ID:cdata:0x00000abc
结果:0
响应代码:“无”
内容类型:“”
结果0表示CURLE_OK,并且文件已经下载(我已经用我的自定义游戏FS函数测试了这一点)。虽然我无法获得响应代码或内容类型。有人知道我做错了什么吗?

来自:

CURLINFO\u响应\u代码

指针传递给长的,以接收上次收到的HTTP、FTP或SMTP响应代码

卷发信息内容类型

指针传递给char指针,以接收下载对象的内容类型。这是从Content Type:字段读取的值。如果设置为NULL,则表示服务器未发送有效的内容类型头,或者所使用的协议不支持此操作

这些选项要求
long*
char**
;您正在传入
int*
char*
。以下方面应起作用:

local resp = ffi.new("long[1]")  -- long*
local err  = libcurl.curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, resp)
local code = ffi.new("char*[1]") -- char**
local err2 = libcurl.curl_easy_getinfo(curl, CURLINFO_CONTENT_TYPE, code)
-- get the values
resp = tonumber(resp[0])
code = ffi.string(code[0])
另外,如果对
curl\u easy\u setopt的那些注释掉的调用不起作用,那是因为您传递的是
int
,而不是
long

local vb  = ffi.new("long", 1)
local err = libcurl.curl_easy_setopt(curl, CURLOPT_VERBOSE, vb)

嘿,谢谢你的意见!我发现了“真实”错误,甚至在
curl\u easy\u perform
之前我就调用了
curl\u easy\u getinfo
,因此显然curl不能返回任何响应代码或内容类型。尽管cURL API在这方面很奇怪,因为
cURL\u easy\u getinfo
至少可以为这种情况设置错误代码。它还与
int[1]
一起工作,因为两者都是32位。感谢您更正了
CURLOPT\u VERBOSE
,我想知道它为什么不起作用以及
char*[1]
。实际数据存储在
rc
ct
中,因此您的代码会抛出错误(
curl\u easy\u getinfo
只返回错误代码)。
local vb  = ffi.new("long", 1)
local err = libcurl.curl_easy_setopt(curl, CURLOPT_VERBOSE, vb)