summaryrefslogtreecommitdiff
path: root/csgo-loader/csgo-server/Networking/WebSocket.cpp
blob: 755e89b3b0cedd09c16ece00ac3b5cdd2b53e0c0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <Networking/WebSocket.hpp>

namespace Networking {
	// Initialises a basic HTTP socket.
	bool WebSocket::Start(const char *Address, const char *Username, const char *Password) {
		m_Internet = InternetOpenA("none", INTERNET_OPEN_TYPE_PRECONFIG, 0, 0, 0);

		if(!m_Internet)
			return false;

		m_Address = InternetConnectA(m_Internet, Address, INTERNET_DEFAULT_HTTPS_PORT, Username, Password, INTERNET_SERVICE_HTTP, 0, 0);

		if(!m_Address)
			return false;

		return true;
	}

	// Receives a response from a request.
	ByteArray WebSocket::Request(const char *File, const char *Header, ByteArray &Data) {
		ByteArray	   Response;
		InternetHandle WebRequest = HttpOpenRequestA(m_Address, "POST", File, 0, 0, 0, INTERNET_FLAG_SECURE | INTERNET_FLAG_KEEP_CONNECTION, 0);

		// Make connection request.
		bool Sent = HttpSendRequestA(WebRequest, Header, (DWORD)strlen(Header), Data.data(), (DWORD)Data.size());

		if(Sent) {
			DWORD ReceivedSize{};

			uint8_t *Block = (uint8_t *)malloc(4096);

			// Read response.
			while(InternetReadFile(WebRequest, Block, 4096, &ReceivedSize)) {
				for(size_t n{}; n < std::min< int >(4096, ReceivedSize); ++n) {
					Response.push_back(Block[n]);
				}
			}

			free(Block);
		}

		return Response;
	}
}