Add http_client_wait_response for client who don't care about calling poll() directly
This commit is contained in:
@@ -3720,14 +3720,6 @@ int http_client_wakeup(HTTP_Client *client)
|
|||||||
return 0;
|
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.
|
// Get a connection pointer from a request builder.
|
||||||
// If the builder is invalid, returns NULL.
|
// If the builder is invalid, returns NULL.
|
||||||
static HTTP_ClientConn*
|
static HTTP_ClientConn*
|
||||||
@@ -4154,6 +4146,14 @@ static void save_cookies(HTTP_CookieJar *cookie_jar,
|
|||||||
save_one_cookie(cookie_jar, headers[i], domain, path);
|
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,
|
int http_client_process_events(HTTP_Client *client,
|
||||||
EventRegister *reg)
|
EventRegister *reg)
|
||||||
{
|
{
|
||||||
@@ -4331,6 +4331,40 @@ void http_free_response(HTTP_Response *response)
|
|||||||
client->num_conns--;
|
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, ®) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (reg.num_polled > 0)
|
||||||
|
POLL(reg.polled, reg.num_polled, -1);
|
||||||
|
|
||||||
|
if (http_client_process_events(client, ®) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (http_client_next_response(client, response, user))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// src/server.c
|
// src/server.c
|
||||||
////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|||||||
@@ -1026,6 +1026,9 @@ int http_client_process_events(HTTP_Client *client,
|
|||||||
bool http_client_next_response(HTTP_Client *client,
|
bool http_client_next_response(HTTP_Client *client,
|
||||||
HTTP_Response **response, void **user);
|
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
|
// Free a response object. You can't access its fields
|
||||||
// again after this.
|
// again after this.
|
||||||
void http_free_response(HTTP_Response *response);
|
void http_free_response(HTTP_Response *response);
|
||||||
|
|||||||
@@ -17,9 +17,7 @@ int main(void)
|
|||||||
http_request_builder_set_trace_bytes(builder, true);
|
http_request_builder_set_trace_bytes(builder, true);
|
||||||
|
|
||||||
http_request_builder_url(builder,
|
http_request_builder_url(builder,
|
||||||
HTTP_METHOD_GET,
|
HTTP_METHOD_GET, HTTP_STR("http://coz.is"));
|
||||||
HTTP_STR("http://coz.is")
|
|
||||||
);
|
|
||||||
|
|
||||||
http_request_builder_header(builder,
|
http_request_builder_header(builder,
|
||||||
HTTP_STR("Greeting: Hello from the cHTTP example!"));
|
HTTP_STR("Greeting: Hello from the cHTTP example!"));
|
||||||
@@ -27,39 +25,12 @@ int main(void)
|
|||||||
if (http_request_builder_send(builder) < 0)
|
if (http_request_builder_send(builder) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
for (;;) {
|
void *user;
|
||||||
|
HTTP_Response *response;
|
||||||
|
if (http_client_wait_response(&client, &response, &user) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
void *ptrs[HTTP_CLIENT_POLL_CAPACITY];
|
printf("Received a response!\n");
|
||||||
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, ®) < 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if (reg.num_polled > 0)
|
|
||||||
POLL(reg.polled, reg.num_polled, -1);
|
|
||||||
|
|
||||||
if (http_client_process_events(&client, ®) < 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (done) break;
|
|
||||||
}
|
|
||||||
|
|
||||||
http_client_free(&client);
|
http_client_free(&client);
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
+42
-8
@@ -61,14 +61,6 @@ int http_client_wakeup(HTTP_Client *client)
|
|||||||
return 0;
|
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.
|
// Get a connection pointer from a request builder.
|
||||||
// If the builder is invalid, returns NULL.
|
// If the builder is invalid, returns NULL.
|
||||||
static HTTP_ClientConn*
|
static HTTP_ClientConn*
|
||||||
@@ -495,6 +487,14 @@ static void save_cookies(HTTP_CookieJar *cookie_jar,
|
|||||||
save_one_cookie(cookie_jar, headers[i], domain, path);
|
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,
|
int http_client_process_events(HTTP_Client *client,
|
||||||
EventRegister *reg)
|
EventRegister *reg)
|
||||||
{
|
{
|
||||||
@@ -671,3 +671,37 @@ void http_free_response(HTTP_Response *response)
|
|||||||
byte_queue_free(&conn->output);
|
byte_queue_free(&conn->output);
|
||||||
client->num_conns--;
|
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, ®) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (reg.num_polled > 0)
|
||||||
|
POLL(reg.polled, reg.num_polled, -1);
|
||||||
|
|
||||||
|
if (http_client_process_events(client, ®) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (http_client_next_response(client, response, user))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|||||||
@@ -207,6 +207,9 @@ int http_client_process_events(HTTP_Client *client,
|
|||||||
bool http_client_next_response(HTTP_Client *client,
|
bool http_client_next_response(HTTP_Client *client,
|
||||||
HTTP_Response **response, void **user);
|
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
|
// Free a response object. You can't access its fields
|
||||||
// again after this.
|
// again after this.
|
||||||
void http_free_response(HTTP_Response *response);
|
void http_free_response(HTTP_Response *response);
|
||||||
|
|||||||
Reference in New Issue
Block a user