I want to send a request to an api using a socket.
I know the service is running as the legacy code in python works. See an excerpt below:
class SocketConnection:
def __init__(self, payload, host):
self.payload = payload
self.host = host
self.sock = None
self.response_text = {}
self.status_code = None
self.full_resp = ""
def connect(self):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
context = ssl.create_default_context()
sock = context.wrap_socket(sock, server_hostname=self.host)
sock.connect((self.host, 443))
self.sock = sock
def send(self):
self.sock.send(self.payload)
def receive(self):
self.full_resp = self.sock.recv(4096).decode("utf-8")
self.response_text = [self.full_resp]
self.status_code = self.full_resp[9:12]
self.sock.close()
I have the following C++ code which will always succeed in finding an address it can connect to, but can never find one that passes SSL_connect. SSL_get_error returns 1.
array<struct addrinfo*, 2> get_valid_addrinfo(string s) {
struct addrinfo *res;
struct addrinfo hints;
memset(&hints, '\0', sizeof(hints));
hints.ai_socktype = SOCK_STREAM;
hints.ai_family = AF_INET;
hints.ai_flags = AI_ADDRCONFIG;
int e = getaddrinfo(s.c_str(), "https", &hints, &res);
if (e != 0) {
printf("failure %s\n", gai_strerror (e));
assert(-1);
}
int sock = -1;
struct addrinfo *r ;
SSL_CTX * ctx = make_ssl_context();
SSL * ssl;
for (r = res; r != NULL; r = r->ai_next) {
sock = socket(r->ai_family, r->ai_socktype, r->ai_protocol);
if (sock != -1 && connect(sock, r->ai_addr, r->ai_addrlen) == 0) {
free(ssl);
ssl = SSL_new(ctx);
SSL_set_fd(ssl, sock);
if (SSL_connect(ssl) != -1)
break;
}
if (sock != -1) {
close(sock);
sock = -1;
}
}
assert(sock != -1);
close(sock);
free(ssl);
SSL_CTX_free(ctx);
return {res, r};
}
I'm on debian 10.
What am I doing wrong?