| 1 | #include "network.h" |
| 2 | |
| 3 | HttpRequest::HttpRequest( |
| 4 | const wchar_t* agentName, |
| 5 | const wchar_t* serverName, |
| 6 | const wchar_t* action, |
| 7 | const wchar_t* objectName, |
| 8 | std::string body, |
| 9 | const wchar_t* headers, |
| 10 | DWORD port, |
| 11 | const wchar_t* referrer, |
| 12 | DWORD requestFlags, |
| 13 | const wchar_t* httpVersion, |
| 14 | const wchar_t** acceptTypes |
| 15 | ) |
| 16 | { |
| 17 | static std::atomic<HINTERNET> internet = NULL; |
| 18 | if (!internet) internet = WinHttpOpen(agentName, WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, NULL, NULL, 0); |
| 19 | if (internet) |
| 20 | if (InternetHandle connection = WinHttpConnect(internet, serverName, port, 0)) |
| 21 | if (InternetHandle request = WinHttpOpenRequest(connection, action, objectName, httpVersion, referrer, acceptTypes, requestFlags)) |
| 22 | if (WinHttpSendRequest(request, headers, -1UL, body.empty() ? NULL : body.data(), body.size(), body.size(), NULL)) |
| 23 | { |
| 24 | WinHttpReceiveResponse(request, NULL); |
| 25 | |
| 26 | //DWORD size = 0; |
| 27 | //WinHttpQueryHeaders(request, WINHTTP_QUERY_RAW_HEADERS_CRLF, WINHTTP_HEADER_NAME_BY_INDEX, NULL, &size, WINHTTP_NO_HEADER_INDEX); |
| 28 | //this->headers.resize(size); |
| 29 | //WinHttpQueryHeaders(request, WINHTTP_QUERY_RAW_HEADERS_CRLF, WINHTTP_HEADER_NAME_BY_INDEX, this->headers.data(), &size, WINHTTP_NO_HEADER_INDEX); |
| 30 | std::string data; |
| 31 | DWORD availableSize, downloadedSize; |
| 32 | do |
| 33 | { |
| 34 | availableSize = 0; |
| 35 | WinHttpQueryDataAvailable(request, &availableSize); |
| 36 | if (!availableSize) break; |
| 37 | std::vector<char> buffer(availableSize); |
| 38 | WinHttpReadData(request, buffer.data(), availableSize, &downloadedSize); |
| 39 | data.append(buffer.data(), downloadedSize); |
| 40 | } while (availableSize > 0); |
| 41 | response = StringToWideString(data); |
| 42 | this->connection = std::move(connection); |
| 43 | this->request = std::move(request); |
| 44 | } |
| 45 | else errorCode = GetLastError(); |
| 46 | else errorCode = GetLastError(); |
| 47 | else errorCode = GetLastError(); |
| 48 | else errorCode = GetLastError(); |
| 49 | } |
| 50 | |
| 51 | std::wstring Escape(const std::wstring& text) |
| 52 | { |
nothing calls this directly
no test coverage detected