Add http_client_wait_response for client who don't care about calling poll() directly

This commit is contained in:
2025-11-23 23:39:48 +01:00
parent f6b2c805c6
commit 9f0560fb9e
5 changed files with 96 additions and 51 deletions
+42 -8
View File
@@ -3720,14 +3720,6 @@ int http_client_wakeup(HTTP_Client *client)
return 0;
}
int http_client_register_events(HTTP_Client *client,
EventRegister *reg)
{
if (socket_manager_register_events(&client->sockets, reg) < 0)
return -1;
return 0;
}
// Get a connection pointer from a request builder.
// If the builder is invalid, returns NULL.
static HTTP_ClientConn*
@@ -4154,6 +4146,14 @@ static void save_cookies(HTTP_CookieJar *cookie_jar,
save_one_cookie(cookie_jar, headers[i], domain, path);
}
int http_client_register_events(HTTP_Client *client,
EventRegister *reg)
{
if (socket_manager_register_events(&client->sockets, reg) < 0)
return -1;
return 0;
}
int http_client_process_events(HTTP_Client *client,
EventRegister *reg)
{
@@ -4331,6 +4331,40 @@ void http_free_response(HTTP_Response *response)
client->num_conns--;
}
#ifdef _WIN32
#define POLL WSAPoll
#else
#define POLL poll
#endif
int http_client_wait_response(HTTP_Client *client, HTTP_Response **response, void **user)
{
for (;;) {
void *ptrs[HTTP_CLIENT_POLL_CAPACITY];
struct pollfd polled[HTTP_CLIENT_POLL_CAPACITY];
EventRegister reg = {
.ptrs=ptrs,
.polled=polled,
.num_polled=0,
.max_polled=HTTP_CLIENT_POLL_CAPACITY,
};
if (http_client_register_events(client, &reg) < 0)
return -1;
if (reg.num_polled > 0)
POLL(reg.polled, reg.num_polled, -1);
if (http_client_process_events(client, &reg) < 0)
return -1;
if (http_client_next_response(client, response, user))
break;
}
return 0;
}
////////////////////////////////////////////////////////////////////////////////////////
// src/server.c
////////////////////////////////////////////////////////////////////////////////////////