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
////////////////////////////////////////////////////////////////////////////////////////
+3
View File
@@ -1026,6 +1026,9 @@ int http_client_process_events(HTTP_Client *client,
bool http_client_next_response(HTTP_Client *client,
HTTP_Response **response, void **user);
// TODO: comment
int http_client_wait_response(HTTP_Client *client, HTTP_Response **response, void **user);
// Free a response object. You can't access its fields
// again after this.
void http_free_response(HTTP_Response *response);
+5 -34
View File
@@ -17,9 +17,7 @@ int main(void)
http_request_builder_set_trace_bytes(builder, true);
http_request_builder_url(builder,
HTTP_METHOD_GET,
HTTP_STR("http://coz.is")
);
HTTP_METHOD_GET, HTTP_STR("http://coz.is"));
http_request_builder_header(builder,
HTTP_STR("Greeting: Hello from the cHTTP example!"));
@@ -27,39 +25,12 @@ int main(void)
if (http_request_builder_send(builder) < 0)
return -1;
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;
bool done = false;
HTTP_Response *response;
void *user;
while (http_client_next_response(&client, &response, &user)) {
printf("Received response\n");
http_free_response(response);
done = true;
}
HTTP_Response *response;
if (http_client_wait_response(&client, &response, &user) < 0)
return -1;
if (done) break;
}
printf("Received a response!\n");
http_client_free(&client);
return 0;
+42 -8
View File
@@ -61,14 +61,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*
@@ -495,6 +487,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)
{
@@ -671,3 +671,37 @@ void http_free_response(HTTP_Response *response)
byte_queue_free(&conn->output);
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;
}
+3
View File
@@ -207,6 +207,9 @@ int http_client_process_events(HTTP_Client *client,
bool http_client_next_response(HTTP_Client *client,
HTTP_Response **response, void **user);
// TODO: comment
int http_client_wait_response(HTTP_Client *client, HTTP_Response **response, void **user);
// Free a response object. You can't access its fields
// again after this.
void http_free_response(HTTP_Response *response);