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:
| A | winhttp/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)
+}