nativehttp

Simple interface to the native http client
Log | Files | Refs | README | LICENSE

commit 4df43343e61de8334567a92788524a6c4c54a6d6
parent 606dda1cadb4d748087621602d36cb7dd01a73da
Author: Jack Mordaunt <jackmordaunt.dev@gmail.com>
Date:   Mon, 12 Feb 2024 18:58:31 +0800

winhttp: add winhttp bindings

Signed-off-by: Jack Mordaunt <jackmordaunt.dev@gmail.com>

Diffstat:
Awinhttp/winhttp.go | 184+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 184 insertions(+), 0 deletions(-)

diff --git a/winhttp/winhttp.go b/winhttp/winhttp.go @@ -0,0 +1,184 @@ +//go:build windows + +package winhttp + +import ( + "syscall" + "unsafe" +) + +const ( + DEFAULT_PORT = 0 // use the protocol-specific default + DEFAULT_HTTP_PORT = 80 // " " HTTP " + DEFAULT_HTTPS_PORT = 443 // " " HTTPS " +) + +type ( + HINTERNET = uintptr + DWORD = uint32 + BOOL = uint32 + LPVOID = unsafe.Pointer + LPCWSTR = *uint16 + LPDWORD = *DWORD + DWORD_PTR = uint +) + +type AccessType DWORD + +const ( + AcessTypeDefaultProxy AccessType = 0 + AcessTypeNoProxy AccessType = 1 + AcessTypeNamedProxy AccessType = 3 + AcessTypeAutoProxy AccessType = 4 +) + +type OpenFlag DWORD + +const ( + OpenFlagNone OpenFlag = 0 + OpenFlagAsync OpenFlag = 0x10000000 // this session is asynchronous (where supported) +) + +type OpenRequestFlag DWORD + +const ( + OpenRequestFlagNone OpenRequestFlag = 0 + OpenRequestFlagSecure OpenRequestFlag = 0x00800000 // use SSL if applicable (HTTPS) + OpenRequestFlagEscapePercent OpenRequestFlag = 0x00000004 // if escaping enabled, escape percent as well + OpenRequestFlagNullCodepage OpenRequestFlag = 0x00000008 // assume all symbols are ASCII, use fast convertion + OpenRequestFlagBypassProxyCache OpenRequestFlag = 0x00000100 // add "pragma: no-cache" request header + OpenRequestFlagRefresh OpenRequestFlag = 0x00000100 + OpenRequestFlagEscapeDisable OpenRequestFlag = 0x00000040 // disable escaping + OpenRequestFlagEscapeDisableQuery OpenRequestFlag = 0x00000080 // if escaping enabled escape path part, but do not escape query +) + +var ( + _WinHttp = syscall.NewLazyDLL("WinHttp") + + _Open = _WinHttp.NewProc("WinHttpOpen") + _Connect = _WinHttp.NewProc("WinHttpConnect") + _OpenRequest = _WinHttp.NewProc("WinHttpOpenRequest") + _SendRequest = _WinHttp.NewProc("WinHttpSendRequest") + _ReceiveResponse = _WinHttp.NewProc("WinHttpReceiveResponse") + _ReadData = _WinHttp.NewProc("WinHttpReadData") + _QueryDataAvailable = _WinHttp.NewProc("WinHttpQueryDataAvailable") + _CloseHandle = _WinHttp.NewProc("WinHttpCloseHandle") +) + +func Open( + agent LPCWSTR, + access AccessType, + proxy, + proxy_bypass LPCWSTR, + flags OpenFlag, +) HINTERNET { + r, _, _ := _Open.Call( + uintptr(unsafe.Pointer(agent)), + uintptr(access), + uintptr(unsafe.Pointer(proxy)), + uintptr(unsafe.Pointer(proxy_bypass)), + uintptr(flags), + ) + return r +} + +func Connect( + hSession HINTERNET, + pswzServerName LPCWSTR, + nServerPort, + dwReserved DWORD, +) HINTERNET { + r, _, _ := _Connect.Call( + uintptr(hSession), + uintptr(unsafe.Pointer(pswzServerName)), + uintptr(nServerPort), + uintptr(dwReserved), + ) + return r +} + +func OpenRequest( + hConnect HINTERNET, + pwszVerb LPCWSTR, + pwszObjectName LPCWSTR, + pwszVersion LPCWSTR, + pwszReferrer LPCWSTR, + ppwszAcceptTypes *LPCWSTR, + dwFlags OpenRequestFlag, +) HINTERNET { + r, _, _ := _OpenRequest.Call( + uintptr(hConnect), + uintptr(unsafe.Pointer(pwszVerb)), + uintptr(unsafe.Pointer(pwszObjectName)), + uintptr(unsafe.Pointer(pwszVersion)), + uintptr(unsafe.Pointer(pwszReferrer)), + uintptr(unsafe.Pointer(ppwszAcceptTypes)), + uintptr(dwFlags), + ) + return r +} + +func SendRequest( + hRequest HINTERNET, + lpszHeaders LPCWSTR, + dwHeadersLength DWORD, + lpOptional LPVOID, + dwOptionalLength DWORD, + dwTotalLength DWORD, + dwContext DWORD_PTR, +) BOOL { + r, _, _ := _SendRequest.Call( + uintptr(hRequest), + uintptr(unsafe.Pointer(lpszHeaders)), + uintptr(dwHeadersLength), + uintptr(lpOptional), + uintptr(dwOptionalLength), + uintptr(dwTotalLength), + uintptr(dwContext), + ) + return BOOL(r) +} + +func ReceiveResponse( + hRequest HINTERNET, + lpReserved LPVOID, +) BOOL { + r, _, _ := _ReceiveResponse.Call( + uintptr(hRequest), + uintptr(lpReserved), + ) + return BOOL(r) +} + +func ReadData( + hRequest HINTERNET, + lpBuffer LPVOID, + dwNumberOfBytesToRead DWORD, + lpdwNumberOfBytesRead LPDWORD, +) BOOL { + r, _, _ := _ReadData.Call( + uintptr(hRequest), + uintptr(lpBuffer), + uintptr(dwNumberOfBytesToRead), + uintptr(unsafe.Pointer(lpdwNumberOfBytesRead)), + ) + return BOOL(r) +} + +func QueryDataAvailable( + hRequest HINTERNET, + lpdwNumberOfBytesAvailable LPDWORD, +) BOOL { + r, _, _ := _QueryDataAvailable.Call( + uintptr(hRequest), + uintptr(unsafe.Pointer(lpdwNumberOfBytesAvailable)), + ) + return BOOL(r) +} + +func CloseHandle( + hInternet HINTERNET, +) BOOL { + r, _, _ := _CloseHandle.Call(uintptr(hInternet)) + return BOOL(r) +}