spicetools/easrv/smartea.cpp

86 lines
2.6 KiB
C++

#include "smartea.h"
#include <winsock2.h>
#include <ws2tcpip.h>
#include "util/utils.h"
#include "util/logging.h"
namespace smartea {
bool check_url(std::string url) {
// WSA startup
WSADATA wsa_data;
int error;
if ((error = WSAStartup(MAKEWORD(2, 2), &wsa_data)) != 0) {
log_fatal("smartea", "WSAStartup returned {}", error);
}
// create hints
addrinfo hints;
ZeroMemory(&hints, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
// get port
std::vector<std::string> url_split;
strsplit(url, url_split, ':');
int port = 80;
if (url_split.size() >= 2 && string_begins_with(url_split[0], "http"))
url_split.erase(std::begin(url_split));
while (url_split.size() >= 1 && url_split[0].length() > 0 && url_split[0][0] == '/')
url_split[0] = url_split[0].substr(1);
if (url_split.size() >= 2)
port = strtol(url_split[1].c_str(), nullptr, 10);
// remove path from host
auto host_slash = url_split[0].find("/");
if (host_slash != std::string::npos) {
url_split[0] = url_split[0].substr(0, host_slash);
}
// get address info
addrinfo *result;
if ((error = getaddrinfo(url_split[0].c_str(), to_string(port).c_str(), &hints, &result)) != 0) {
log_info("smartea", "could not resolve {}:{}: {}", url_split[0], url_split[1], error);
WSACleanup();
return false;
}
// iterate list
bool success = false;
for (addrinfo *ptr = result; ptr != nullptr; ptr = ptr->ai_next) {
// create socket
SOCKET sock = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol);
if (sock == INVALID_SOCKET) {
log_info("smartea", "could not create socket: {}", WSAGetLastError());
WSACleanup();
return false;
}
// connect to server
error = connect(sock, ptr->ai_addr, (int) ptr->ai_addrlen);
if (error == SOCKET_ERROR) {
closesocket(sock);
continue;
}
// success
success = true;
closesocket(sock);
break;
}
// WSA shutdown
WSACleanup();
// success
if (success)
log_info("smartea", "server seems to be available :)");
else
log_info("smartea", "server seems to be dead :(");
return success;
}
}