From 4c4657f0abb3fc7a4a3cae7a67da596066641cf4 Mon Sep 17 00:00:00 2001 From: dahall Date: Sat, 16 Jul 2022 08:27:54 -0600 Subject: [PATCH] Fixed overloads for HttpQueryInfo --- PInvoke/WinINet/WinINet.cs | 6 +- UnitTests/PInvoke/WinINet/WinInetTests.cs | 984 +++++++++++++++--------------- 2 files changed, 480 insertions(+), 510 deletions(-) diff --git a/PInvoke/WinINet/WinINet.cs b/PInvoke/WinINet/WinINet.cs index fc83a096..e4da3f70 100644 --- a/PInvoke/WinINet/WinINet.cs +++ b/PInvoke/WinINet/WinINet.cs @@ -5053,8 +5053,10 @@ namespace Vanara.PInvoke // DWORD_PTR dwContext ); [DllImport(Lib.WinInet, SetLastError = true, CharSet = CharSet.Auto)] [PInvokeData("wininet.h", MSDNShortId = "caaff8e8-7db9-4d6d-8ba2-d8d19475173a")] - public static extern SafeHINTERNET HttpOpenRequest(HINTERNET hConnect, [Optional] string lpszVerb, string lpszObjectName, [Optional] string lpszVersion, [Optional] string lpszReferrer, - [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(StringPtrArrayMarshaler), MarshalCookie = "Auto"), Optional] string[] lplpszAcceptTypes, [Optional] INTERNET_FLAG dwFlags, [Optional] IntPtr dwContext); + public static extern SafeHINTERNET HttpOpenRequest(HINTERNET hConnect, string lpszVerb = null, string lpszObjectName = "/", + string lpszVersion = null, string lpszReferrer = null, + [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(StringPtrArrayMarshaler), MarshalCookie = "Auto")] string[] lplpszAcceptTypes = null, + INTERNET_FLAG dwFlags = 0, IntPtr dwContext = default); /// Retrieves header information associated with an HTTP request. /// A handle returned by a call to the HttpOpenRequest or InternetOpenUrl function. diff --git a/UnitTests/PInvoke/WinINet/WinInetTests.cs b/UnitTests/PInvoke/WinINet/WinInetTests.cs index 0f92ba6c..4884b15b 100644 --- a/UnitTests/PInvoke/WinINet/WinInetTests.cs +++ b/UnitTests/PInvoke/WinINet/WinInetTests.cs @@ -5,531 +5,499 @@ using System.Linq; using System.Text; using Vanara.Extensions; using Vanara.InteropServices; +using Vanara.PInvoke; +using Vanara.PInvoke.Tests; using static Vanara.PInvoke.WinINet; -namespace Vanara.PInvoke.Tests +namespace WinINet; + +[TestFixture] +public class WinInetTests { - [TestFixture()] - public class WinInetTests + private const string exturl = "https://microsoft.com"; + private const string host = "localhost"; + private const string url = "http://" + host; + private static readonly SafeHINTERNET hOpen = InternetOpen("Test"); + + [Test] + public void CreateMD5SSOHashTest() { - private const string exturl = "https://microsoft.com"; - private const string host = "localhost"; - private const string url = "http://" + host; - private static readonly SafeHINTERNET hOpen = InternetOpen("Test"); + var hash = new byte[35]; + Assert.That(CreateMD5SSOHash("IAMACHALLENGE", null, null, hash), ResultIs.Successful); // not supported + } - [Test] - public void CreateMD5SSOHashTest() + [Test] + public void CreateUrlCacheContainerTest() + { + INTERNET_CACHE_CONFIG_INFO icci = INTERNET_CACHE_CONFIG_INFO.Default; + CACHE_CONFIG_FC flags = CACHE_CONFIG_FC.CACHE_CONFIG_CONTENT_PATHS_FC | CACHE_CONFIG_FC.CACHE_CONFIG_COOKIES_PATHS_FC | CACHE_CONFIG_FC.CACHE_CONFIG_HISTORY_PATHS_FC | + CACHE_CONFIG_FC.CACHE_CONFIG_QUOTA_FC | CACHE_CONFIG_FC.CACHE_CONFIG_STICKY_CONTENT_USAGE_FC; + Assert.That(GetUrlCacheConfigInfo(ref icci, default, flags), ResultIs.Successful); + icci.WriteValues(); + var path = icci.CachePaths[0].CachePath; + + Assert.That(CreateUrlCacheContainer("Log", "Log:", path, 0, INTERNET_CACHE_CONTAINER.INTERNET_CACHE_CONTAINER_NOSUBDIRS), ResultIs.Successful); + Assert.That(DeleteUrlCacheContainer("Log"), ResultIs.Successful); + } + + [Test] + public void CreateUrlCacheEntryTest() + { + using var tmp = new TempFile(); + var url = "temp://" + Guid.NewGuid().ToString("N"); + var sb = new StringBuilder(512); + Assert.That(CreateUrlCacheEntry(url, 0, "tmp", sb), ResultIs.Successful); + + try { - var hash = new byte[35]; - Assert.That(CreateMD5SSOHash("IAMACHALLENGE", null, null, hash), ResultIs.Successful); // not supported - } + File.Copy(tmp.FullName, sb.ToString(), true); + Assert.That(CommitUrlCacheEntry(url, sb.ToString()), ResultIs.Successful); - [Test] - public void CreateUrlCacheContainerTest() - { - var icci = INTERNET_CACHE_CONFIG_INFO.Default; - var flags = CACHE_CONFIG_FC.CACHE_CONFIG_CONTENT_PATHS_FC | CACHE_CONFIG_FC.CACHE_CONFIG_COOKIES_PATHS_FC | CACHE_CONFIG_FC.CACHE_CONFIG_HISTORY_PATHS_FC | - CACHE_CONFIG_FC.CACHE_CONFIG_QUOTA_FC | CACHE_CONFIG_FC.CACHE_CONFIG_STICKY_CONTENT_USAGE_FC; - Assert.That(GetUrlCacheConfigInfo(ref icci, default, flags), ResultIs.Successful); - icci.WriteValues(); - var path = icci.CachePaths[0].CachePath; + Assert.That(FindUrlCacheEntries().Where(e => e.lpszSourceUrlName == url), Is.Not.Empty); - Assert.That(CreateUrlCacheContainer("Log", "Log:", path, 0, INTERNET_CACHE_CONTAINER.INTERNET_CACHE_CONTAINER_NOSUBDIRS), ResultIs.Successful); - Assert.That(DeleteUrlCacheContainer("Log"), ResultIs.Successful); - } + using var mem = new SafeHGlobalHandle(4096); + uint sz = mem.Size; + Assert.That(GetUrlCacheEntryInfo(url, mem, ref sz), ResultIs.Successful); + INTERNET_CACHE_ENTRY_INFO ei = mem.ToStructure(); + new INTERNET_CACHE_ENTRY_INFO_MGD(ei).WriteValues(); - [Test] - public void CreateUrlCacheEntryTest() - { - using (var tmp = new TempFile()) + ei.LastModifiedTime = DateTime.Now.ToFileTimeStruct(); + Assert.That(SetUrlCacheEntryInfo(url, ei, CACHE_ENTRY_FC.CACHE_ENTRY_MODTIME_FC), ResultIs.Successful); + + sz = mem.Size; + Assert.That(GetUrlCacheEntryInfoEx(url, mem, ref sz), ResultIs.Successful); + new INTERNET_CACHE_ENTRY_INFO_MGD(mem.ToStructure()).WriteValues(); + + sz = 0; + Assert.That(RetrieveUrlCacheEntryStream(url, default, ref sz, false), ResultIs.Not.ValidHandle); + using (var infomem = new SafeHGlobalHandle(sz)) { - var url = "temp://" + Guid.NewGuid().ToString("N"); - var sb = new StringBuilder(512); - Assert.That(CreateUrlCacheEntry(url, 0, "tmp", sb), ResultIs.Successful); + using SafeHCACHEENTRYSTREAM hStr = RetrieveUrlCacheEntryStream(url, infomem, ref sz, false); + Assert.That(hStr, ResultIs.ValidHandle); + var info = new INTERNET_CACHE_ENTRY_INFO_MGD(infomem.ToStructure()); + info.WriteValues(); - try - { - System.IO.File.Copy(tmp.FullName, sb.ToString(), true); - Assert.That(CommitUrlCacheEntry(url, sb.ToString()), ResultIs.Successful); - - Assert.That(FindUrlCacheEntries().Where(e => e.lpszSourceUrlName == url), Is.Not.Empty); - - using (var mem = new SafeHGlobalHandle(4096)) - { - uint sz = mem.Size; - Assert.That(GetUrlCacheEntryInfo(url, mem, ref sz), ResultIs.Successful); - var ei = mem.ToStructure(); - new INTERNET_CACHE_ENTRY_INFO_MGD(ei).WriteValues(); - - ei.LastModifiedTime = DateTime.Now.ToFileTimeStruct(); - Assert.That(SetUrlCacheEntryInfo(url, ei, CACHE_ENTRY_FC.CACHE_ENTRY_MODTIME_FC), ResultIs.Successful); - - sz = mem.Size; - Assert.That(GetUrlCacheEntryInfoEx(url, mem, ref sz), ResultIs.Successful); - new INTERNET_CACHE_ENTRY_INFO_MGD(mem.ToStructure()).WriteValues(); - - sz = 0; - Assert.That(RetrieveUrlCacheEntryStream(url, default, ref sz, false), ResultIs.Not.ValidHandle); - using (var infomem = new SafeHGlobalHandle(sz)) - { - using (var hStr = RetrieveUrlCacheEntryStream(url, infomem, ref sz, false)) - { - Assert.That(hStr, ResultIs.ValidHandle); - var info = new INTERNET_CACHE_ENTRY_INFO_MGD(infomem.ToStructure()); - info.WriteValues(); - - using (var buf = new SafeHGlobalHandle(info.dwSize)) - { - uint bufSz = buf.Size; - Assert.That(ReadUrlCacheEntryStream(hStr, 0, buf, ref bufSz), ResultIs.Successful); - TestContext.WriteLine(buf.DangerousGetHandle().ToHexDumpString(buf.Size)); - } - } - } - - sz = 0; - Assert.That(RetrieveUrlCacheEntryFile(url, default, ref sz), ResultIs.Failure); - using (var infomem = new SafeHGlobalHandle(sz)) - { - Assert.That(RetrieveUrlCacheEntryFile(url, infomem, ref sz), ResultIs.Successful); - new INTERNET_CACHE_ENTRY_INFO_MGD(infomem.ToStructure()).WriteValues(); - Assert.That(UnlockUrlCacheEntryFile(url), ResultIs.Successful); - } - } - } - finally - { - Assert.That(DeleteUrlCacheEntry(url), ResultIs.Successful); - } - } - } - - [Test] - public void CreateUrlCacheGroupTest() - { - long grp; - Assert.That(grp = CreateUrlCacheGroup(), ResultIs.Not.Value(0L)); - try - { - Assert.That(FindUrlCacheGroups(), Contains.Item(grp)); - } - finally - { - Assert.That(DeleteUrlCacheGroup(grp, CACHEGROUP_FLAG.CACHEGROUP_FLAG_FLUSHURL_ONDELETE), ResultIs.Successful); - } - } - - [Test] - public void DetectAutoProxyUrlTest() - { - var sb = new StringBuilder(4096); - var sz = (uint)sb.Capacity; - Assert.That(() => DetectAutoProxyUrl(sb, sz, (PROXY_AUTO_DETECT_TYPE)3), Throws.Nothing); - } - - [TestCaseSource(typeof(TestCaseSources), nameof(TestCaseSources.RemoteConnections), new object[] { true, 0b00111 })] - public void FtpCommandTest(string host, string ip, string user, string domain, string pwd) - { - Assert.That(hOpen, ResultIs.ValidHandle); - using (var hCon = InternetConnect(hOpen, ip, INTERNET_PORT.INTERNET_DEFAULT_FTP_PORT, user, pwd, InternetService.INTERNET_SERVICE_FTP, InternetApiFlags.INTERNET_FLAG_PASSIVE)) - { - Assert.That(hCon, ResultIs.ValidHandle); - Assert.That(FtpCommand(hCon, true, FTP_TRANSER_TYPE.FTP_TRANSER_TYPE_BINARY, "SYST", default, out var hFtp), ResultIs.Successful); - hFtp.Dispose(); - } - } - - [TestCaseSource(typeof(TestCaseSources), nameof(TestCaseSources.RemoteConnections), new object[] { true, 0b00111 })] - public void FtpTest(string host, string ip, string user, string domain, string pwd) - { - const string dirName = "Temp"; - const string newName = "File.bin"; - - Assert.That(InternetSetStatusCallback(hOpen, Callback), ResultIs.Not.Value(INTERNET_INVALID_STATUS_CALLBACK)); - try - { - Assert.That(hOpen, ResultIs.ValidHandle); - using (var hCon = InternetConnect(hOpen, ip, INTERNET_PORT.INTERNET_DEFAULT_FTP_PORT, user, pwd, InternetService.INTERNET_SERVICE_FTP, InternetApiFlags.INTERNET_FLAG_PASSIVE)) - { - Assert.That(hCon, ResultIs.ValidHandle); - - var sb = new StringBuilder(1024); - var sz = (uint)sb.Capacity; - Assert.That(FtpGetCurrentDirectory(hCon, sb, ref sz), ResultIs.Successful); - Assert.That(FtpCreateDirectory(hCon, dirName), ResultIs.Successful); - Assert.That(FtpSetCurrentDirectory(hCon, dirName), ResultIs.Successful); - - Assert.That(FtpPutFile(hCon, TestCaseSources.SmallFile, System.IO.Path.GetFileName(TestCaseSources.SmallFile), INTERNET_FLAG.INTERNET_FLAG_TRANSFER_BINARY), ResultIs.Successful); - var hFile = SafeHINTERNET.Null; - Assert.That(hFile = FtpFindFirstFile(hCon, System.IO.Path.GetFileName(TestCaseSources.SmallFile), out var fd, 0), ResultIs.ValidHandle); - Assert.That(InternetFindNextFile(hFile, out fd), ResultIs.Failure); - hFile.Dispose(); - - Assert.That(hFile = FtpOpenFile(hCon, System.IO.Path.GetFileName(TestCaseSources.SmallFile), ACCESS_MASK.GENERIC_READ, FTP_TRANSER_TYPE.FTP_TRANSER_TYPE_BINARY), ResultIs.ValidHandle); - uint low; - Assert.That(low = FtpGetFileSize(hFile, out var high), ResultIs.Not.Value(0U)); - - var fileContent = File.ReadAllBytes(TestCaseSources.ImageFile); - Assert.That(InternetWriteFile(hFile, fileContent, fileContent.Length, out var written), ResultIs.Failure); - - hFile.Dispose(); - - Assert.That(FtpRenameFile(hCon, Path.GetFileName(TestCaseSources.SmallFile), newName), ResultIs.Successful); - using (var tmpFile = new TempFile(null)) - Assert.That(FtpGetFile(hCon, newName, tmpFile.FullName, true, 0, INTERNET_FLAG.INTERNET_FLAG_TRANSFER_BINARY), ResultIs.Successful); - Assert.That(FtpDeleteFile(hCon, newName), ResultIs.Successful); - - Assert.That(FtpSetCurrentDirectory(hCon, sb.ToString()), ResultIs.Successful); - Assert.That(FtpRemoveDirectory(hCon, dirName), ResultIs.Successful); - } - } - finally - { - InternetSetStatusCallback(hOpen, null); + using var buf = new SafeHGlobalHandle(info.dwSize); + uint bufSz = buf.Size; + Assert.That(ReadUrlCacheEntryStream(hStr, 0, buf, ref bufSz), ResultIs.Successful); + TestContext.WriteLine(buf.DangerousGetHandle().ToHexDumpString(buf.Size)); } - void Callback(HINTERNET hInternet, IntPtr dwContext, InternetStatus dwInternetStatus, IntPtr lpvStatusInformation, uint dwStatusInformationLength) + sz = 0; + Assert.That(RetrieveUrlCacheEntryFile(url, default, ref sz), ResultIs.Failure); + using (var infomem = new SafeHGlobalHandle(sz)) { - System.Diagnostics.Debug.WriteLine(dwInternetStatus); + Assert.That(RetrieveUrlCacheEntryFile(url, infomem, ref sz), ResultIs.Successful); + new INTERNET_CACHE_ENTRY_INFO_MGD(infomem.ToStructure()).WriteValues(); + Assert.That(UnlockUrlCacheEntryFile(url), ResultIs.Successful); } } - - [Test] - public void HttpSendRequestExTest() + finally { - using (var hCon = InternetConnect(hOpen, host, dwService: InternetService.INTERNET_SERVICE_HTTP)) - { - Assert.That(hCon, ResultIs.ValidHandle); - - using (var hReq = HttpOpenRequest(hCon, null, "", null, "")) - { - Assert.That(hReq, ResultIs.ValidHandle); - - var ibuf = INTERNET_BUFFERS.Default; - ibuf.dwBufferTotal = 4096; - Assert.That(HttpSendRequestEx(hReq, ibuf, dwContext: new IntPtr(1)), ResultIs.Successful); - - Assert.That(HttpEndRequest(hReq), ResultIs.Successful); - } - } - } - - [Test] - public void HttpSendRequestTest() - { - using (var hCon = InternetConnect(hOpen, host, dwService: InternetService.INTERNET_SERVICE_HTTP)) - { - Assert.That(hCon, ResultIs.ValidHandle); - - using (var hReq = HttpOpenRequest(hCon, null, "", null, "")) - { - Assert.That(hReq, ResultIs.ValidHandle); - - Assert.That(HttpAddRequestHeaders(hReq, "Accept: text/html, application/xhtml+xml, */*\r\n", -1, HTTP_ADDREQ_FLAG.HTTP_ADDREQ_FLAG_ADD | HTTP_ADDREQ_FLAG.HTTP_ADDREQ_FLAG_REPLACE), ResultIs.Successful); - - Assert.That(HttpSendRequest(hReq), ResultIs.Successful); - - foreach (var e in Enum.GetValues(typeof(HTTP_QUERY)).OfType().Where(v => (int)v < 0x10000000)) - { - uint idx = 0; - try - { - var mem = HttpQueryInfo(hReq, e, ref idx); - TestContext.WriteLine($"{e} = {HttpQueryInfo(hReq, e, ref idx)}"); - } - catch (Exception ex) - { - TestContext.WriteLine($"{e} caused exception {ex.Message}"); - } - } - - Assert.That(InternetSetFilePointer(hReq, 0, 0, SeekOrigin.Begin), ResultIs.Successful); - using (var mem = new SafeHGlobalHandle(1024)) - Assert.That(InternetReadFile(hReq, mem, mem.Size, out var read), ResultIs.Successful); - } - } - } - - [Test] - public void InternetAttemptConnectTest() - { - Assert.That(InternetAttemptConnect(), ResultIs.Successful); - } - - [Test] - public void InternetAutodialTest() - { - Assert.That(InternetAutodial(INTERNET_AUTODIAL.INTERNET_AUTODIAL_FORCE_ONLINE, HWND.NULL), ResultIs.Successful); - Assert.That(InternetAutodialHangup(), ResultIs.Successful); - } - - [Test] - public void InternetCanonicalizeUrlTest() - { - var sb = new StringBuilder(1024); - var sz = (uint)sb.Capacity; - Assert.That(InternetCanonicalizeUrl(url + "/issstart.htm", sb, ref sz, ICU.ICU_BROWSER_MODE), ResultIs.Successful); - TestContext.Write(sb); - } - - [Test] - public void InternetCheckConnectionTest() - { - Assert.That(InternetCheckConnection(exturl, FLAG_ICC.FLAG_ICC_FORCE_CONNECTION), ResultIs.Successful); - Assert.That(InternetCheckConnection(), ResultIs.Successful); - } - - [Test] - public void InternetClearAllPerSiteCookieDecisionsTest() - { - Assert.That(InternetClearAllPerSiteCookieDecisions(), ResultIs.Successful); - } - - [Test] - public void InternetConfirmZoneCrossingTest() - { - Assert.That(InternetConfirmZoneCrossing(HWND.NULL, url, "http://microsoft.com"), ResultIs.Successful); - } - - [Test] - public void InternetConnectTest() - { - using (var hCon = InternetConnect(hOpen, host, dwService: InternetService.INTERNET_SERVICE_HTTP)) - Assert.That(hCon, ResultIs.ValidHandle); - } - - [Test] - public void InternetCrackUrlTest() - { - const string crkUrl = "https://docs.microsoft.com:443/en-us/windows/win32/api/wininet/ns-wininet-url_componentsa#remarks"; - var comp = new URL_COMPONENTS_MGD(); - Assert.That(InternetCrackUrl(crkUrl, (uint)crkUrl.Length + 1, ICU.ICU_DECODE, ref comp.GetRef()), ResultIs.Successful); - comp.WriteValues(); - comp.GetRef().WriteValues(); - } - - [Test] - public void InternetCreateUrlTest() - { - var comps = new URL_COMPONENTS_MGD("https", "docs.microsoft.com", "/en-us/windows/win32/api/wininet/ns-wininet-url_componentsa", "#remarks", INTERNET_PORT.INTERNET_DEFAULT_HTTPS_PORT); - var sb = new StringBuilder(1024); - var sz = (uint)sb.Capacity; - Assert.That(InternetCreateUrl(ref comps.GetRef(), 0, sb, ref sz), ResultIs.Successful); - TestContext.WriteLine(sb); - } - - [Test] - public void InternetDialTest() - { - Assert.That(InternetDial(HWND.NULL, null, INTERNET_DIAL.INTERNET_DIAL_UNATTENDED, out var id), ResultIs.Successful); - Assert.That(InternetHangUp(id), ResultIs.Successful); - } - - [Test] - public void InternetEnumPerSiteCookieDecisionTest() - { - Assert.That(InternetSetPerSiteCookieDecision("hpe.com", InternetCookieState.COOKIE_STATE_ACCEPT), ResultIs.Successful); - Assert.That(InternetGetPerSiteCookieDecision("hpe.com", out var state), ResultIs.Successful); - Assert.That(state, Is.EqualTo(InternetCookieState.COOKIE_STATE_ACCEPT)); - - var sb = new StringBuilder(1024); - uint i = 0; - do - { - var sz = (uint)sb.Capacity; - if (!InternetEnumPerSiteCookieDecision(sb, ref sz, out var dec, i)) - Assert.That(Win32Error.GetLastError(), Is.EqualTo((Win32Error)Win32Error.ERROR_NO_MORE_ITEMS)); - TestContext.Write($"{i}: {sb}; {dec}"); - } while (i++ < 50); - } - - [Test] - public void InternetErrorDlgTest() - { - using (var hCon = InternetConnect(hOpen, host, dwService: InternetService.INTERNET_SERVICE_HTTP)) - { - Assert.That(hCon, ResultIs.ValidHandle); - using (var hReq = HttpOpenRequest(hCon, null, "", null, "")) - { - Assert.That(hReq, ResultIs.ValidHandle); - Assert.That(HttpSendRequest(hReq), ResultIs.Successful); - - Assert.That(InternetErrorDlg(HWND.NULL, hReq, Win32Error.ERROR_INTERNET_INCORRECT_PASSWORD, FLAGS_ERROR_UI.FLAGS_ERROR_UI_FLAGS_NO_UI, IntPtr.Zero), ResultIs.Successful); - } - } - } - - [Test] - public void InternetGetConnectedStateExTest() - { - var sb = new StringBuilder(1024); - Assert.That(InternetGetConnectedStateEx(out var flags, sb, (uint)sb.Capacity), ResultIs.Successful); - TestContext.Write($"{flags}; {sb}"); - } - - [Test] - public void InternetGetConnectedStateTest() - { - Assert.That(InternetGetConnectedState(out var flags), ResultIs.Successful); - TestContext.Write(flags); - } - - [Test] - public void InternetGetCookieExTest() - { - var sb = new StringBuilder(1024); - var sz = (uint)sb.Capacity; - Assert.That(InternetGetCookieEx(exturl, null, sb, ref sz, 0), ResultIs.Successful); - TestContext.Write(sb); - Assert.That(InternetSetCookieEx(exturl, "TestOnly", "blahblahblah", 0), ResultIs.Not.Value(InternetCookieState.COOKIE_STATE_UNKNOWN)); - } - - [Test] - public void InternetGetCookieTest() - { - var sb = new StringBuilder(1024); - var sz = (uint)sb.Capacity; - Assert.That(InternetGetCookie(exturl, null, sb, ref sz), ResultIs.Successful); - TestContext.Write(sb); - Assert.That(InternetSetCookie(exturl, "TestOnly", "blahblahblah"), ResultIs.Successful); - } - - [Test] - public void InternetGetLastResponseInfoTest() - { - var sb = new StringBuilder(1024); - var sz = (uint)sb.Capacity; - Assert.That(InternetGetLastResponseInfo(out var err, sb, ref sz), ResultIs.Successful); - } - - [Test] - public void InternetGoOnlineTest() - { - Assert.That(InternetGoOnline(url, HWND.NULL), ResultIs.Successful); - } - - [Test] - public void InternetInitializeAutoProxyDllTest() - { - Assert.That(InternetInitializeAutoProxyDll(), ResultIs.Successful); - } - - [Test] - public void InternetLockRequestFileTest() - { - using (var hFile = InternetOpenUrl(hOpen, url, null, 0, 0)) - { - Assert.That(hFile, ResultIs.ValidHandle); - - Assert.That(InternetQueryDataAvailable(hFile, out var num), ResultIs.Successful); - TestContext.Write(num); - - Assert.That(InternetLockRequestFile(hFile, out var hLock), ResultIs.Successful); - using (var mem = new SafeHGlobalHandle(1024)) - { - var ib = INTERNET_BUFFERS.Default; - ib.dwBufferLength = mem.Size; - ib.lpvBuffer = mem; - Assert.That(InternetReadFileEx(hFile, ref ib, IRF.IRF_SYNC), ResultIs.Successful); - } - Assert.That(InternetUnlockRequestFile(hLock), ResultIs.Successful); - } - } - - [Test()] - public void InternetOpenTest() - { - var hOpen2 = InternetOpen("Test", InternetOpenType.INTERNET_OPEN_TYPE_DIRECT, null, null, 0); - Assert.That(hOpen2, ResultIs.ValidHandle); - hOpen2.Dispose(); - Assert.That(hOpen2.IsInvalid, Is.True); - } - - [Test] - public void InternetQueryOptionTest() - { - var sz = sizeof(int); - var hMem = new SafeCoTaskMemHandle(sz); - var ret = InternetQueryOption(hOpen, InternetOptionFlags.INTERNET_OPTION_HANDLE_TYPE, hMem, ref sz); - Assert.That(ret, Is.True); - var hType = (InternetOptionHandleType)hMem.ToStructure(); - Assert.That(hType, Is.Not.Zero); - TestContext.WriteLine($"Handle is {hType}"); - - hType = InternetQueryOption(hOpen, InternetOptionFlags.INTERNET_OPTION_HANDLE_TYPE); - Assert.That(hType, Is.Not.Zero); - TestContext.WriteLine($"Handle is {hType}"); - - var str = InternetQueryOption(hOpen, InternetOptionFlags.INTERNET_OPTION_USER_AGENT); - Assert.That(str, Is.EqualTo("Test")); - - var b = InternetQueryOption(hOpen, InternetOptionFlags.INTERNET_OPTION_ENCODE_EXTRA); - Assert.That(b, Is.False); - - var hParent = new SafeHINTERNET(InternetQueryOption(hOpen, InternetOptionFlags.INTERNET_OPTION_PARENT_HANDLE)); - Assert.That(hParent.IsClosed, Is.False); - - Assert.That(() => InternetQueryOption(hOpen, InternetOptionFlags.INTERNET_OPTION_ENCODE_EXTRA), Throws.Exception); - - Assert.That(() => InternetQueryOption(hOpen, InternetOptionFlags.INTERNET_OPTION_CACHE_STREAM_HANDLE), Throws.Exception); - - var ver = InternetQueryOption(hOpen, InternetOptionFlags.INTERNET_OPTION_VERSION); - Assert.That(ver.dwMajorVersion, Is.Not.Zero); - TestContext.WriteLine($"Ver is {ver.dwMajorVersion}.{ver.dwMinorVersion}"); - - var pi = InternetQueryOption(HINTERNET.NULL, InternetOptionFlags.INTERNET_OPTION_PROXY); - Assert.That(pi.dwAccessType, Is.Not.Zero); - TestContext.WriteLine($"Proxy is {pi.dwAccessType}={pi.lpszProxy}"); - } - - [Test] - public void InternetSetOptionTest() - { - InternetSetOption(hOpen, InternetOptionFlags.INTERNET_OPTION_USER_AGENT, Environment.UserName); - var un = InternetQueryOption(hOpen, InternetOptionFlags.INTERNET_OPTION_USER_AGENT); - Assert.That(un, Is.EqualTo(Environment.UserName)); - - InternetSetOption(hOpen, InternetOptionFlags.INTERNET_OPTION_CONNECT_RETRIES, 3U); - var r = InternetQueryOption(hOpen, InternetOptionFlags.INTERNET_OPTION_CONNECT_RETRIES); - Assert.That(r, Is.EqualTo(3U)); - - Assert.That(InternetSetOption(hOpen, InternetOptionFlags.INTERNET_OPTION_DIGEST_AUTH_UNLOAD), ResultIs.Successful); - - Assert.That(() => InternetSetOption(hOpen, InternetOptionFlags.INTERNET_OPTION_HANDLE_TYPE), Throws.ArgumentException); - Assert.That(() => InternetSetOption(hOpen, InternetOptionFlags.INTERNET_OPTION_HANDLE_TYPE, InternetOptionHandleType.INTERNET_HANDLE_TYPE_CONNECT_FTP), Throws.ArgumentException); - Assert.That(() => InternetSetOption(hOpen, InternetOptionFlags.INTERNET_OPTION_URL), Throws.ArgumentException); - Assert.That(() => InternetSetOption(hOpen, InternetOptionFlags.INTERNET_OPTION_CACHE_STREAM_HANDLE), Throws.Exception); - } - - [Test] - public void InternetTimeFromSystemTimeTest() - { - var st = new SYSTEMTIME(DateTime.Now, DateTimeKind.Local); - var sb = new StringBuilder(1024); - Assert.That(InternetTimeFromSystemTime(st, INTERNET_RFC.INTERNET_RFC1123_FORMAT, sb, (uint)sb.Capacity), ResultIs.Successful); - Assert.That(InternetTimeToSystemTime(sb.ToString(), out var st2), ResultIs.Successful); - Assert.That(st.Equals(st2), Is.True); - } - - [Test] - public void PrivacyGetSetZonePreferenceWTest() - { - URLZONE zone = URLZONE.URLZONE_INTERNET; - PrivacyType priv = PrivacyType.PRIVACY_TYPE_FIRST_PARTY; - PrivacyTemplate iTmpl = 0; - string pref = null; - - var sb = new StringBuilder(1024); - foreach (var e in Enum.GetValues(typeof(URLZONE)).Cast()) - { - var sz = (uint)sb.Capacity; - //Assert.That(PrivacyGetZonePreferenceW(e, priv, out var tmpl, sb, ref sz), ResultIs.Successful); - if (PrivacyGetZonePreferenceW(e, priv, out var tmpl, sb, ref sz).Succeeded) - TestContext.WriteLine($"{e} : {tmpl} : {sb}"); - if (e == zone) { pref = sb.ToString(); iTmpl = tmpl; } - } - - Assert.That(PrivacySetZonePreferenceW(zone, priv, iTmpl, pref), ResultIs.Successful); + Assert.That(DeleteUrlCacheEntry(url), ResultIs.Successful); } } + + [Test] + public void CreateUrlCacheGroupTest() + { + long grp; + Assert.That(grp = CreateUrlCacheGroup(), ResultIs.Not.Value(0L)); + try + { + Assert.That(FindUrlCacheGroups(), Contains.Item(grp)); + } + finally + { + Assert.That(DeleteUrlCacheGroup(grp, CACHEGROUP_FLAG.CACHEGROUP_FLAG_FLUSHURL_ONDELETE), ResultIs.Successful); + } + } + + [Test] + public void DetectAutoProxyUrlTest() + { + var sb = new StringBuilder(4096); + var sz = (uint)sb.Capacity; + Assert.That(() => DetectAutoProxyUrl(sb, sz, (PROXY_AUTO_DETECT_TYPE)3), Throws.Nothing); + } + + [TestCaseSource(typeof(TestCaseSources), nameof(TestCaseSources.RemoteConnections), new object[] { true, 0b00111 })] + public void FtpCommandTest(string host, string ip, string user, string domain, string pwd) + { + Assert.That(hOpen, ResultIs.ValidHandle); + using SafeHINTERNET hCon = InternetConnect(hOpen, ip, INTERNET_PORT.INTERNET_DEFAULT_FTP_PORT, user, pwd, InternetService.INTERNET_SERVICE_FTP, InternetApiFlags.INTERNET_FLAG_PASSIVE); + Assert.That(hCon, ResultIs.ValidHandle); + Assert.That(FtpCommand(hCon, true, FTP_TRANSER_TYPE.FTP_TRANSER_TYPE_BINARY, "SYST", default, out SafeHINTERNET hFtp), ResultIs.Successful); + hFtp.Dispose(); + } + + [TestCaseSource(typeof(TestCaseSources), nameof(TestCaseSources.RemoteConnections), new object[] { true, 0b00111 })] + public void FtpTest(string host, string ip, string user, string domain, string pwd) + { + const string dirName = "Temp"; + const string newName = "File.bin"; + + Assert.That(InternetSetStatusCallback(hOpen, Callback), ResultIs.Not.Value(INTERNET_INVALID_STATUS_CALLBACK)); + try + { + Assert.That(hOpen, ResultIs.ValidHandle); + using SafeHINTERNET hCon = InternetConnect(hOpen, ip, INTERNET_PORT.INTERNET_DEFAULT_FTP_PORT, user, pwd, InternetService.INTERNET_SERVICE_FTP, InternetApiFlags.INTERNET_FLAG_PASSIVE); + Assert.That(hCon, ResultIs.ValidHandle); + + var sb = new StringBuilder(1024); + var sz = (uint)sb.Capacity; + Assert.That(FtpGetCurrentDirectory(hCon, sb, ref sz), ResultIs.Successful); + Assert.That(FtpCreateDirectory(hCon, dirName), ResultIs.Successful); + Assert.That(FtpSetCurrentDirectory(hCon, dirName), ResultIs.Successful); + + Assert.That(FtpPutFile(hCon, TestCaseSources.SmallFile, Path.GetFileName(TestCaseSources.SmallFile), INTERNET_FLAG.INTERNET_FLAG_TRANSFER_BINARY), ResultIs.Successful); + SafeHINTERNET hFile = SafeHINTERNET.Null; + Assert.That(hFile = FtpFindFirstFile(hCon, Path.GetFileName(TestCaseSources.SmallFile), out WIN32_FIND_DATA fd, 0), ResultIs.ValidHandle); + Assert.That(InternetFindNextFile(hFile, out fd), ResultIs.Failure); + hFile.Dispose(); + + Assert.That(hFile = FtpOpenFile(hCon, Path.GetFileName(TestCaseSources.SmallFile), ACCESS_MASK.GENERIC_READ, FTP_TRANSER_TYPE.FTP_TRANSER_TYPE_BINARY), ResultIs.ValidHandle); + uint low; + Assert.That(low = FtpGetFileSize(hFile, out var high), ResultIs.Not.Value(0U)); + + var fileContent = File.ReadAllBytes(TestCaseSources.ImageFile); + Assert.That(InternetWriteFile(hFile, fileContent, fileContent.Length, out var written), ResultIs.Failure); + + hFile.Dispose(); + + Assert.That(FtpRenameFile(hCon, Path.GetFileName(TestCaseSources.SmallFile), newName), ResultIs.Successful); + using (var tmpFile = new TempFile(null)) + Assert.That(FtpGetFile(hCon, newName, tmpFile.FullName, true, 0, INTERNET_FLAG.INTERNET_FLAG_TRANSFER_BINARY), ResultIs.Successful); + Assert.That(FtpDeleteFile(hCon, newName), ResultIs.Successful); + + Assert.That(FtpSetCurrentDirectory(hCon, sb.ToString()), ResultIs.Successful); + Assert.That(FtpRemoveDirectory(hCon, dirName), ResultIs.Successful); + } + finally + { + InternetSetStatusCallback(hOpen, null); + } + + static void Callback(HINTERNET hInternet, IntPtr dwContext, InternetStatus dwInternetStatus, IntPtr lpvStatusInformation, uint dwStatusInformationLength) => System.Diagnostics.Debug.WriteLine(dwInternetStatus); + } + + [Test] + public void HttpSendRequestExTest() + { + using SafeHINTERNET hCon = InternetConnect(hOpen, "microsoft.com", dwService: InternetService.INTERNET_SERVICE_HTTP); + Assert.That(hCon, ResultIs.ValidHandle); + + using SafeHINTERNET hReq = HttpOpenRequest(hCon); + Assert.That(hReq, ResultIs.ValidHandle); + + INTERNET_BUFFERS ibuf = INTERNET_BUFFERS.Default; + ibuf.dwBufferTotal = 4096; + Assert.That(HttpSendRequestEx(hReq, ibuf, dwContext: new IntPtr(1)), ResultIs.Successful); + + Assert.That(HttpEndRequest(hReq), ResultIs.Successful); + } + + [Test] + public void HttpSendRequestTest() + { + using SafeHINTERNET hCon = InternetConnect(hOpen, "microsoft.com", dwService: InternetService.INTERNET_SERVICE_HTTP); + Assert.That(hCon, ResultIs.ValidHandle); + + using SafeHINTERNET hReq = HttpOpenRequest(hCon); + Assert.That(hReq, ResultIs.ValidHandle); + + Assert.That(HttpAddRequestHeaders(hReq, "Accept: text/html, application/xhtml+xml, */*\r\n", -1, HTTP_ADDREQ_FLAG.HTTP_ADDREQ_FLAG_ADD | HTTP_ADDREQ_FLAG.HTTP_ADDREQ_FLAG_REPLACE), ResultIs.Successful); + + Assert.That(HttpSendRequest(hReq), ResultIs.Successful); + + foreach (HTTP_QUERY e in Enum.GetValues(typeof(HTTP_QUERY)).OfType().Where(v => (int)v < 0x10000000)) + { + try + { + TestContext.WriteLine($"{e} = {HttpQueryInfo(hReq, e)}"); + } + catch (Exception ex) + { + TestContext.WriteLine($"{e} caused exception {ex.Message}"); + } + } + + TestContext.WriteLine("HTTP_QUERY_CUSTOM | HTTP_QUERY_FLAG_REQUEST_HEADERS Output\n==================="); + uint idx = 0; + while (true) + { + try + { + TestContext.WriteLine(HttpQueryInfo(hReq, HTTP_QUERY.HTTP_QUERY_CUSTOM | HTTP_QUERY.HTTP_QUERY_FLAG_REQUEST_HEADERS, ref idx)); + } + catch { break; } + } + + //Assert.That(InternetSetFilePointer(hReq, 0, 0, SeekOrigin.Begin), ResultIs.Value(0U)); + using var mem = new SafeHGlobalHandle(1024); + Assert.That(InternetReadFile(hReq, mem, mem.Size, out var read), ResultIs.Successful); + TestContext.WriteLine($"Read {read} bytes: "); + TestContext.WriteLine(HexDempHelpers.ToHexDumpString(mem.DangerousGetHandle(), (int)read)); + } + + [Test] + public void InternetAttemptConnectTest() => Assert.That(InternetAttemptConnect(), ResultIs.Successful); + + [Test] + public void InternetAutodialTest() + { + Assert.That(InternetAutodial(INTERNET_AUTODIAL.INTERNET_AUTODIAL_FORCE_ONLINE, HWND.NULL), ResultIs.Successful); + Assert.That(InternetAutodialHangup(), ResultIs.Successful); + } + + [Test] + public void InternetCanonicalizeUrlTest() + { + var sb = new StringBuilder(1024); + var sz = (uint)sb.Capacity; + Assert.That(InternetCanonicalizeUrl(url + "/issstart.htm", sb, ref sz, ICU.ICU_BROWSER_MODE), ResultIs.Successful); + TestContext.Write(sb); + } + + [Test] + public void InternetCheckConnectionTest() + { + Assert.That(InternetCheckConnection(exturl, FLAG_ICC.FLAG_ICC_FORCE_CONNECTION), ResultIs.Successful); + Assert.That(InternetCheckConnection(), ResultIs.Successful); + } + + [Test] + public void InternetClearAllPerSiteCookieDecisionsTest() => Assert.That(InternetClearAllPerSiteCookieDecisions(), ResultIs.Successful); + + [Test] + public void InternetConfirmZoneCrossingTest() => Assert.That(InternetConfirmZoneCrossing(HWND.NULL, url, "http://microsoft.com"), ResultIs.Successful); + + [Test] + public void InternetConnectTest() + { + using SafeHINTERNET hCon = InternetConnect(hOpen, host, dwService: InternetService.INTERNET_SERVICE_HTTP); + Assert.That(hCon, ResultIs.ValidHandle); + } + + [Test] + public void InternetCrackUrlTest() + { + const string crkUrl = "https://docs.microsoft.com:443/en-us/windows/win32/api/wininet/ns-wininet-url_componentsa#remarks"; + var comp = new URL_COMPONENTS_MGD(); + Assert.That(InternetCrackUrl(crkUrl, (uint)crkUrl.Length + 1, ICU.ICU_DECODE, ref comp.GetRef()), ResultIs.Successful); + comp.WriteValues(); + comp.GetRef().WriteValues(); + } + + [Test] + public void InternetCreateUrlTest() + { + var comps = new URL_COMPONENTS_MGD("https", "docs.microsoft.com", "/en-us/windows/win32/api/wininet/ns-wininet-url_componentsa", "#remarks", INTERNET_PORT.INTERNET_DEFAULT_HTTPS_PORT); + var sb = new StringBuilder(1024); + var sz = (uint)sb.Capacity; + Assert.That(InternetCreateUrl(ref comps.GetRef(), 0, sb, ref sz), ResultIs.Successful); + TestContext.WriteLine(sb); + } + + [Test] + public void InternetDialTest() + { + Assert.That(InternetDial(HWND.NULL, null, INTERNET_DIAL.INTERNET_DIAL_UNATTENDED, out var id), ResultIs.Successful); + Assert.That(InternetHangUp(id), ResultIs.Successful); + } + + [Test] + public void InternetEnumPerSiteCookieDecisionTest() + { + Assert.That(InternetSetPerSiteCookieDecision("hpe.com", InternetCookieState.COOKIE_STATE_ACCEPT), ResultIs.Successful); + Assert.That(InternetGetPerSiteCookieDecision("hpe.com", out InternetCookieState state), ResultIs.Successful); + Assert.That(state, Is.EqualTo(InternetCookieState.COOKIE_STATE_ACCEPT)); + + var sb = new StringBuilder(1024); + uint i = 0; + do + { + var sz = (uint)sb.Capacity; + if (!InternetEnumPerSiteCookieDecision(sb, ref sz, out InternetCookieState dec, i)) + Assert.That(Win32Error.GetLastError(), Is.EqualTo((Win32Error)Win32Error.ERROR_NO_MORE_ITEMS)); + TestContext.Write($"{i}: {sb}; {dec}"); + } while (i++ < 50); + } + + [Test] + public void InternetErrorDlgTest() + { + using SafeHINTERNET hCon = InternetConnect(hOpen, host, dwService: InternetService.INTERNET_SERVICE_HTTP); + Assert.That(hCon, ResultIs.ValidHandle); + using SafeHINTERNET hReq = HttpOpenRequest(hCon); + Assert.That(hReq, ResultIs.ValidHandle); + Assert.That(HttpSendRequest(hReq), ResultIs.Successful); + + Assert.That(InternetErrorDlg(HWND.NULL, hReq, Win32Error.ERROR_INTERNET_INCORRECT_PASSWORD, FLAGS_ERROR_UI.FLAGS_ERROR_UI_FLAGS_NO_UI, IntPtr.Zero), ResultIs.Successful); + } + + [Test] + public void InternetGetConnectedStateExTest() + { + var sb = new StringBuilder(1024); + Assert.That(InternetGetConnectedStateEx(out INTERNET_CONNECTION flags, sb, (uint)sb.Capacity), ResultIs.Successful); + TestContext.Write($"{flags}; {sb}"); + } + + [Test] + public void InternetGetConnectedStateTest() + { + Assert.That(InternetGetConnectedState(out INTERNET_CONNECTION flags), ResultIs.Successful); + TestContext.Write(flags); + } + + [Test] + public void InternetGetCookieExTest() + { + var sb = new StringBuilder(1024); + var sz = (uint)sb.Capacity; + Assert.That(InternetGetCookieEx(exturl, null, sb, ref sz, 0), ResultIs.Successful); + TestContext.Write(sb); + Assert.That(InternetSetCookieEx(exturl, "TestOnly", "blahblahblah", 0), ResultIs.Not.Value(InternetCookieState.COOKIE_STATE_UNKNOWN)); + } + + [Test] + public void InternetGetCookieTest() + { + var sb = new StringBuilder(1024); + var sz = (uint)sb.Capacity; + Assert.That(InternetGetCookie(exturl, null, sb, ref sz), ResultIs.Successful); + TestContext.Write(sb); + Assert.That(InternetSetCookie(exturl, "TestOnly", "blahblahblah"), ResultIs.Successful); + } + + [Test] + public void InternetGetLastResponseInfoTest() + { + var sb = new StringBuilder(1024); + var sz = (uint)sb.Capacity; + Assert.That(InternetGetLastResponseInfo(out _, sb, ref sz), ResultIs.Successful); + } + + [Test] + public void InternetGoOnlineTest() => Assert.That(InternetGoOnline(url, HWND.NULL), ResultIs.Successful); + + [Test] + public void InternetInitializeAutoProxyDllTest() => Assert.That(InternetInitializeAutoProxyDll(), ResultIs.Successful); + + [Test] + public void InternetLockRequestFileTest() + { + using SafeHINTERNET hFile = InternetOpenUrl(hOpen, url, null, 0, 0); + Assert.That(hFile, ResultIs.ValidHandle); + + Assert.That(InternetQueryDataAvailable(hFile, out var num), ResultIs.Successful); + TestContext.Write(num); + + Assert.That(InternetLockRequestFile(hFile, out HANDLE hLock), ResultIs.Successful); + using (var mem = new SafeHGlobalHandle(1024)) + { + INTERNET_BUFFERS ib = INTERNET_BUFFERS.Default; + ib.dwBufferLength = mem.Size; + ib.lpvBuffer = mem; + Assert.That(InternetReadFileEx(hFile, ref ib, IRF.IRF_SYNC), ResultIs.Successful); + } + Assert.That(InternetUnlockRequestFile(hLock), ResultIs.Successful); + } + + [Test()] + public void InternetOpenTest() + { + SafeHINTERNET hOpen2 = InternetOpen("Test", InternetOpenType.INTERNET_OPEN_TYPE_DIRECT, null, null, 0); + Assert.That(hOpen2, ResultIs.ValidHandle); + hOpen2.Dispose(); + Assert.That(hOpen2.IsInvalid, Is.True); + } + + [Test] + public void InternetQueryOptionTest() + { + var sz = sizeof(int); + var hMem = new SafeCoTaskMemHandle(sz); + var ret = InternetQueryOption(hOpen, InternetOptionFlags.INTERNET_OPTION_HANDLE_TYPE, hMem, ref sz); + Assert.That(ret, Is.True); + var hType = (InternetOptionHandleType)hMem.ToStructure(); + Assert.That(hType, Is.Not.Zero); + TestContext.WriteLine($"Handle is {hType}"); + + hType = InternetQueryOption(hOpen, InternetOptionFlags.INTERNET_OPTION_HANDLE_TYPE); + Assert.That(hType, Is.Not.Zero); + TestContext.WriteLine($"Handle is {hType}"); + + var str = InternetQueryOption(hOpen, InternetOptionFlags.INTERNET_OPTION_USER_AGENT); + Assert.That(str, Is.EqualTo("Test")); + + var b = InternetQueryOption(hOpen, InternetOptionFlags.INTERNET_OPTION_ENCODE_EXTRA); + Assert.That(b, Is.False); + + var hParent = new SafeHINTERNET(InternetQueryOption(hOpen, InternetOptionFlags.INTERNET_OPTION_PARENT_HANDLE)); + Assert.That(hParent.IsClosed, Is.False); + + Assert.That(() => InternetQueryOption(hOpen, InternetOptionFlags.INTERNET_OPTION_ENCODE_EXTRA), Throws.Exception); + + Assert.That(() => InternetQueryOption(hOpen, InternetOptionFlags.INTERNET_OPTION_CACHE_STREAM_HANDLE), Throws.Exception); + + INTERNET_VERSION_INFO ver = InternetQueryOption(hOpen, InternetOptionFlags.INTERNET_OPTION_VERSION); + Assert.That(ver.dwMajorVersion, Is.Not.Zero); + TestContext.WriteLine($"Ver is {ver.dwMajorVersion}.{ver.dwMinorVersion}"); + + INTERNET_PROXY_INFO pi = InternetQueryOption(HINTERNET.NULL, InternetOptionFlags.INTERNET_OPTION_PROXY); + Assert.That(pi.dwAccessType, Is.Not.Zero); + TestContext.WriteLine($"Proxy is {pi.dwAccessType}={pi.lpszProxy}"); + } + + [Test] + public void InternetSetOptionTest() + { + InternetSetOption(hOpen, InternetOptionFlags.INTERNET_OPTION_USER_AGENT, Environment.UserName); + var un = InternetQueryOption(hOpen, InternetOptionFlags.INTERNET_OPTION_USER_AGENT); + Assert.That(un, Is.EqualTo(Environment.UserName)); + + InternetSetOption(hOpen, InternetOptionFlags.INTERNET_OPTION_CONNECT_RETRIES, 3U); + var r = InternetQueryOption(hOpen, InternetOptionFlags.INTERNET_OPTION_CONNECT_RETRIES); + Assert.That(r, Is.EqualTo(3U)); + + Assert.That(InternetSetOption(hOpen, InternetOptionFlags.INTERNET_OPTION_DIGEST_AUTH_UNLOAD), ResultIs.Successful); + + Assert.That(() => InternetSetOption(hOpen, InternetOptionFlags.INTERNET_OPTION_HANDLE_TYPE), Throws.ArgumentException); + Assert.That(() => InternetSetOption(hOpen, InternetOptionFlags.INTERNET_OPTION_HANDLE_TYPE, InternetOptionHandleType.INTERNET_HANDLE_TYPE_CONNECT_FTP), Throws.ArgumentException); + Assert.That(() => InternetSetOption(hOpen, InternetOptionFlags.INTERNET_OPTION_URL), Throws.ArgumentException); + Assert.That(() => InternetSetOption(hOpen, InternetOptionFlags.INTERNET_OPTION_CACHE_STREAM_HANDLE), Throws.Exception); + } + + [Test] + public void InternetTimeFromSystemTimeTest() + { + var st = new SYSTEMTIME(DateTime.Now, DateTimeKind.Local); + var sb = new StringBuilder(1024); + Assert.That(InternetTimeFromSystemTime(st, INTERNET_RFC.INTERNET_RFC1123_FORMAT, sb, (uint)sb.Capacity), ResultIs.Successful); + Assert.That(InternetTimeToSystemTime(sb.ToString(), out SYSTEMTIME st2), ResultIs.Successful); + Assert.That(st.Equals(st2), Is.True); + } + + [Test] + public void PrivacyGetSetZonePreferenceWTest() + { + URLZONE zone = URLZONE.URLZONE_INTERNET; + PrivacyType priv = PrivacyType.PRIVACY_TYPE_FIRST_PARTY; + PrivacyTemplate iTmpl = 0; + string pref = null; + + var sb = new StringBuilder(1024); + foreach (URLZONE e in Enum.GetValues(typeof(URLZONE)).Cast()) + { + var sz = (uint)sb.Capacity; + //Assert.That(PrivacyGetZonePreferenceW(e, priv, out var tmpl, sb, ref sz), ResultIs.Successful); + if (PrivacyGetZonePreferenceW(e, priv, out PrivacyTemplate tmpl, sb, ref sz).Succeeded) + TestContext.WriteLine($"{e} : {tmpl} : {sb}"); + if (e == zone) { pref = sb.ToString(); iTmpl = tmpl; } + } + + Assert.That(PrivacySetZonePreferenceW(zone, priv, iTmpl, pref), ResultIs.Successful); + } } \ No newline at end of file