mirror of
https://github.com/spice2x/spice2x.github.io.git
synced 2026-08-05 08:10:40 -07:00
Initial commit for GitHub migration based on spice2x-25-03-03
This commit is contained in:
@@ -0,0 +1,85 @@
|
||||
#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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user