| 87 | } |
| 88 | |
| 89 | DownloadResult FetchString(const std::string& url) { |
| 90 | DownloadResult result; |
| 91 | |
| 92 | UrlParts parts; |
| 93 | if (!ParseUrl(url, parts)) { |
| 94 | result.error = "Invalid URL"; |
| 95 | return result; |
| 96 | } |
| 97 | |
| 98 | HINTERNET session = WinHttpOpen(L"TenBox/1.0", |
| 99 | WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, |
| 100 | WINHTTP_NO_PROXY_NAME, |
| 101 | WINHTTP_NO_PROXY_BYPASS, 0); |
| 102 | if (!session) { |
| 103 | result.error = "Failed to open WinHTTP session"; |
| 104 | return result; |
| 105 | } |
| 106 | |
| 107 | DWORD timeout_ms = 30000; |
| 108 | WinHttpSetOption(session, WINHTTP_OPTION_CONNECT_TIMEOUT, &timeout_ms, sizeof(timeout_ms)); |
| 109 | WinHttpSetOption(session, WINHTTP_OPTION_RECEIVE_TIMEOUT, &timeout_ms, sizeof(timeout_ms)); |
| 110 | WinHttpSetOption(session, WINHTTP_OPTION_SEND_TIMEOUT, &timeout_ms, sizeof(timeout_ms)); |
| 111 | |
| 112 | HINTERNET connect = WinHttpConnect(session, parts.host.c_str(), parts.port, 0); |
| 113 | if (!connect) { |
| 114 | WinHttpCloseHandle(session); |
| 115 | result.error = "Failed to connect"; |
| 116 | return result; |
| 117 | } |
| 118 | |
| 119 | DWORD flags = parts.is_https ? WINHTTP_FLAG_SECURE : 0; |
| 120 | HINTERNET request = WinHttpOpenRequest(connect, L"GET", parts.path.c_str(), |
| 121 | nullptr, WINHTTP_NO_REFERER, |
| 122 | WINHTTP_DEFAULT_ACCEPT_TYPES, flags); |
| 123 | if (!request) { |
| 124 | WinHttpCloseHandle(connect); |
| 125 | WinHttpCloseHandle(session); |
| 126 | result.error = "Failed to open request"; |
| 127 | return result; |
| 128 | } |
| 129 | |
| 130 | if (!WinHttpSendRequest(request, WINHTTP_NO_ADDITIONAL_HEADERS, 0, |
| 131 | WINHTTP_NO_REQUEST_DATA, 0, 0, 0)) { |
| 132 | DWORD err = GetLastError(); |
| 133 | WinHttpCloseHandle(request); |
| 134 | WinHttpCloseHandle(connect); |
| 135 | WinHttpCloseHandle(session); |
| 136 | result.error = "Failed to send request: " + FormatWinError(err); |
| 137 | return result; |
| 138 | } |
| 139 | |
| 140 | if (!WinHttpReceiveResponse(request, nullptr)) { |
| 141 | DWORD err = GetLastError(); |
| 142 | WinHttpCloseHandle(request); |
| 143 | WinHttpCloseHandle(connect); |
| 144 | WinHttpCloseHandle(session); |
| 145 | result.error = "Failed to receive response: " + FormatWinError(err); |
| 146 | return result; |
no test coverage detected