通过luajit调用winhttp
Calling winhttp through luajit
我正在尝试使用 luajit 使用 winhttp library 执行一个简单的 GET 请求,但似乎卡住了。我正在创建请求,但是当我尝试接收响应时却一无所获。我的代码可以在下面看到
local ffi = require("ffi")
local log = require("log")
local winhttp = ffi.load("winhttp")
ffi.cdef[[
typedef void * HINTERNET;
typedef unsigned int INTERNET_PORT;
typedef const wchar_t * LPCWSTR;
typedef unsigned long DWORD;
typedef unsigned long DWORD_PTR;
typedef DWORD * LPDWORD;
typedef void * LPVOID;
typedef int BOOL;
static const int INTERNET_DEFAULT_PORT = 0;
static const int INTERNET_DEFAULT_HTTP_PORT = 80;
static const int INTERNET_DEFAULT_HTTPS_PORT = 443;
static const int WINHTTP_FLAG_SECURE = 0x00800000;
HINTERNET WinHttpOpen(LPCWSTR pwszUserAgent, DWORD dwAccessType, LPCWSTR pwszProxyName, LPCWSTR pwszProxyBypass, DWORD dwFlags);
HINTERNET WinHttpConnect(HINTERNET hSession, LPCWSTR pswzServerName, INTERNET_PORT nServerPort, DWORD dwReserved);
HINTERNET WinHttpOpenRequest(HINTERNET hConnect, LPCWSTR pwszVerb, LPCWSTR pwszObjectName, LPCWSTR pwszVersion, LPCWSTR pwszReferrer, LPCWSTR *ppwszAcceptTypes, DWORD dwFlags);
BOOL WinHttpSendRequest(HINTERNET hRequest, LPCWSTR pwszHeaders, DWORD dwHeadersLength, LPVOID lpOptional, DWORD dwOptionalLength, DWORD dwTotalLength, DWORD_PTR dwContext);
BOOL WinHttpReceiveResponse(HINTERNET hRequest, LPVOID lpReserved);
BOOL WinHttpQueryDataAvailable(HINTERNET hRequest, LPDWORD lpdwNumberOfBytesAvailable);
DWORD GetLastError(void);
]]
return {
get = function(url)
local session = winhttp.WinHttpOpen(L("Example/1.0"), 1, nil, nil, 0)
log.debug(session)
if not session then
log.error("Could not create session ", ffi.C.GetLastError())
return
end
--www.google.com
local connect = winhttp.WinHttpConnect(session, L("www.google.com"), winhttp.INTERNET_DEFAULT_PORT, 0)
log.debug(connect)
if not connect then
log.error("Could not connect ", ffi.C.GetLastError())
return
end
local request = winhttp.WinHttpOpenRequest(connect, L("GET"), nil, nil, nil, nil, winhttp.WINHTTP_FLAG_SECURE)
log.debug(request)
if not request then
log.error("Could not create request ", ffi.C.GetLastError())
return
end
local response = winhttp.WinHttpReceiveResponse(request, nil)
log.debug(response)
if not tonumber(response) then
log.error("Could not receive response ", ffi.C.GetLastError())
return
end
local size = ffi.new("LPDWORD")
winhttp.WinHttpQueryDataAvailable(request, size)
log.debug(size)
if not tonumber(size) or not tonumber(size[0]) then
log.error("No data available ", ffi.C.GetLastError())
return
end
end
}
我在 运行 为
时得到的示例日志输出
[DEBUG Fri Jun 2 09:10:42 2017] lua\libs\http.lua:34: cdata: 0x005d16c8
[DEBUG Fri Jun 2 09:10:42 2017] lua\libs\http.lua:41: cdata: 0x0077ec60
[DEBUG Fri Jun 2 09:10:42 2017] lua\libs\http.lua:47: cdata: 0x005a2328
[DEBUG Fri Jun 2 09:10:42 2017] lua\libs\http.lua:53: -0
[DEBUG Fri Jun 2 09:10:42 2017] lua\libs\http.lua:60: cdata: NULL
[ERROR Fri Jun 2 09:10:42 2017] lua\libs\http.lua:62: No data available 183
我忽略了一个最重要的功能。我没有打电话给 WinHttpSendRequest
我正在尝试使用 luajit 使用 winhttp library 执行一个简单的 GET 请求,但似乎卡住了。我正在创建请求,但是当我尝试接收响应时却一无所获。我的代码可以在下面看到
local ffi = require("ffi") local log = require("log") local winhttp = ffi.load("winhttp") ffi.cdef[[ typedef void * HINTERNET; typedef unsigned int INTERNET_PORT; typedef const wchar_t * LPCWSTR; typedef unsigned long DWORD; typedef unsigned long DWORD_PTR; typedef DWORD * LPDWORD; typedef void * LPVOID; typedef int BOOL; static const int INTERNET_DEFAULT_PORT = 0; static const int INTERNET_DEFAULT_HTTP_PORT = 80; static const int INTERNET_DEFAULT_HTTPS_PORT = 443; static const int WINHTTP_FLAG_SECURE = 0x00800000; HINTERNET WinHttpOpen(LPCWSTR pwszUserAgent, DWORD dwAccessType, LPCWSTR pwszProxyName, LPCWSTR pwszProxyBypass, DWORD dwFlags); HINTERNET WinHttpConnect(HINTERNET hSession, LPCWSTR pswzServerName, INTERNET_PORT nServerPort, DWORD dwReserved); HINTERNET WinHttpOpenRequest(HINTERNET hConnect, LPCWSTR pwszVerb, LPCWSTR pwszObjectName, LPCWSTR pwszVersion, LPCWSTR pwszReferrer, LPCWSTR *ppwszAcceptTypes, DWORD dwFlags); BOOL WinHttpSendRequest(HINTERNET hRequest, LPCWSTR pwszHeaders, DWORD dwHeadersLength, LPVOID lpOptional, DWORD dwOptionalLength, DWORD dwTotalLength, DWORD_PTR dwContext); BOOL WinHttpReceiveResponse(HINTERNET hRequest, LPVOID lpReserved); BOOL WinHttpQueryDataAvailable(HINTERNET hRequest, LPDWORD lpdwNumberOfBytesAvailable); DWORD GetLastError(void); ]] return { get = function(url) local session = winhttp.WinHttpOpen(L("Example/1.0"), 1, nil, nil, 0) log.debug(session) if not session then log.error("Could not create session ", ffi.C.GetLastError()) return end --www.google.com local connect = winhttp.WinHttpConnect(session, L("www.google.com"), winhttp.INTERNET_DEFAULT_PORT, 0) log.debug(connect) if not connect then log.error("Could not connect ", ffi.C.GetLastError()) return end local request = winhttp.WinHttpOpenRequest(connect, L("GET"), nil, nil, nil, nil, winhttp.WINHTTP_FLAG_SECURE) log.debug(request) if not request then log.error("Could not create request ", ffi.C.GetLastError()) return end local response = winhttp.WinHttpReceiveResponse(request, nil) log.debug(response) if not tonumber(response) then log.error("Could not receive response ", ffi.C.GetLastError()) return end local size = ffi.new("LPDWORD") winhttp.WinHttpQueryDataAvailable(request, size) log.debug(size) if not tonumber(size) or not tonumber(size[0]) then log.error("No data available ", ffi.C.GetLastError()) return end end }
我在 运行 为
时得到的示例日志输出[DEBUG Fri Jun 2 09:10:42 2017] lua\libs\http.lua:34: cdata: 0x005d16c8 [DEBUG Fri Jun 2 09:10:42 2017] lua\libs\http.lua:41: cdata: 0x0077ec60 [DEBUG Fri Jun 2 09:10:42 2017] lua\libs\http.lua:47: cdata: 0x005a2328 [DEBUG Fri Jun 2 09:10:42 2017] lua\libs\http.lua:53: -0 [DEBUG Fri Jun 2 09:10:42 2017] lua\libs\http.lua:60: cdata: NULL [ERROR Fri Jun 2 09:10:42 2017] lua\libs\http.lua:62: No data available 183
我忽略了一个最重要的功能。我没有打电话给 WinHttpSendRequest