Add simplified client API (http_get, http_put, http_post, http_delete)
This commit is contained in:
@@ -4330,6 +4330,69 @@ void http_client_wait_response(HTTP_Client *client,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static _Thread_local HTTP_Client *implicit_client;
|
||||||
|
|
||||||
|
static int perform_request(HTTP_Method method,
|
||||||
|
HTTP_String url, HTTP_String *headers,
|
||||||
|
int num_headers, HTTP_String body,
|
||||||
|
HTTP_Response **response)
|
||||||
|
{
|
||||||
|
if (implicit_client == NULL) {
|
||||||
|
|
||||||
|
implicit_client = malloc(sizeof(HTTP_Client));
|
||||||
|
if (implicit_client == NULL)
|
||||||
|
return HTTP_ERROR_OOM;
|
||||||
|
|
||||||
|
int ret = http_client_init(implicit_client);
|
||||||
|
if (ret < 0) {
|
||||||
|
free(implicit_client);
|
||||||
|
implicit_client = NULL;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
HTTP_Client *client = implicit_client;
|
||||||
|
|
||||||
|
HTTP_RequestBuilder builder = http_client_get_builder(client);
|
||||||
|
http_request_builder_method(builder, method);
|
||||||
|
http_request_builder_target(builder, url);
|
||||||
|
for (int i = 0; i < num_headers; i++)
|
||||||
|
http_request_builder_header(builder, headers[i]);
|
||||||
|
http_request_builder_body(builder, body);
|
||||||
|
int ret = http_request_builder_send(builder);
|
||||||
|
if (ret < 0) return ret;
|
||||||
|
|
||||||
|
int result;
|
||||||
|
void *user;
|
||||||
|
http_client_wait_response(client, &result, &user, response);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
int http_get(HTTP_String url, HTTP_String *headers,
|
||||||
|
int num_headers, HTTP_Response **response)
|
||||||
|
{
|
||||||
|
return perform_request(HTTP_METHOD_GET, url, headers, num_headers, HTTP_STR(""), response);
|
||||||
|
}
|
||||||
|
|
||||||
|
int http_post(HTTP_String url, HTTP_String *headers,
|
||||||
|
int num_headers, HTTP_String body,
|
||||||
|
HTTP_Response **response)
|
||||||
|
{
|
||||||
|
return perform_request(HTTP_METHOD_POST, url, headers, num_headers, body, response);
|
||||||
|
}
|
||||||
|
|
||||||
|
int http_put(HTTP_String url, HTTP_String *headers,
|
||||||
|
int num_headers, HTTP_String body,
|
||||||
|
HTTP_Response **response)
|
||||||
|
{
|
||||||
|
return perform_request(HTTP_METHOD_PUT, url, headers, num_headers, body, response);
|
||||||
|
}
|
||||||
|
|
||||||
|
int http_delete(HTTP_String url, HTTP_String *headers,
|
||||||
|
int num_headers, HTTP_Response **response)
|
||||||
|
{
|
||||||
|
return perform_request(HTTP_METHOD_DELETE, url, headers, num_headers, HTTP_STR(""), response);
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// src/server.c
|
// src/server.c
|
||||||
////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|||||||
@@ -1058,6 +1058,24 @@ void http_client_wait_response(HTTP_Client *client,
|
|||||||
// again after this.
|
// again after this.
|
||||||
void http_free_response(HTTP_Response *response);
|
void http_free_response(HTTP_Response *response);
|
||||||
|
|
||||||
|
// Perform a blocking GET request
|
||||||
|
int http_get(HTTP_String url, HTTP_String *headers,
|
||||||
|
int num_headers, HTTP_Response **response);
|
||||||
|
|
||||||
|
// Perform a blocking POST request
|
||||||
|
int http_post(HTTP_String url, HTTP_String *headers,
|
||||||
|
int num_headers, HTTP_String body,
|
||||||
|
HTTP_Response **response);
|
||||||
|
|
||||||
|
// Perform a blocking PUT request
|
||||||
|
int http_put(HTTP_String url, HTTP_String *headers,
|
||||||
|
int num_headers, HTTP_String body,
|
||||||
|
HTTP_Response **response);
|
||||||
|
|
||||||
|
// Perform a blocking DELETE request
|
||||||
|
int http_delete(HTTP_String url, HTTP_String *headers,
|
||||||
|
int num_headers, HTTP_Response **response);
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// src/server.h
|
// src/server.h
|
||||||
////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|||||||
@@ -2,38 +2,14 @@
|
|||||||
|
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
int ret;
|
|
||||||
|
|
||||||
HTTP_Client client;
|
|
||||||
ret = http_client_init(&client);
|
|
||||||
if (ret < 0) {
|
|
||||||
printf("Couldn't initialize client (%s)\n", http_strerror(ret));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
HTTP_RequestBuilder builder = http_client_get_builder(&client);
|
|
||||||
|
|
||||||
http_request_builder_method(builder, HTTP_METHOD_GET);
|
|
||||||
http_request_builder_target(builder, HTTP_STR("http://coz.is"));
|
|
||||||
http_request_builder_header(builder, HTTP_STR("Greeting: Hello from the cHTTP example!"));
|
|
||||||
|
|
||||||
ret = http_request_builder_send(builder);
|
|
||||||
if (ret < 0) {
|
|
||||||
printf("Couldn't build request (%s)\n", http_strerror(ret));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int result;
|
|
||||||
void *user;
|
|
||||||
HTTP_Response *response;
|
HTTP_Response *response;
|
||||||
http_client_wait_response(&client, &result, &user, &response);
|
|
||||||
|
|
||||||
if (result == HTTP_OK) {
|
int ret = http_get(HTTP_STR("http://coz.is/"), NULL, 0, &response);
|
||||||
|
if (ret == HTTP_OK) {
|
||||||
printf("Received %d bytes\n", response->body.len);
|
printf("Received %d bytes\n", response->body.len);
|
||||||
|
http_free_response(response);
|
||||||
} else {
|
} else {
|
||||||
printf("Couldn't receive response (%s)\n", http_strerror(result));
|
printf("Request failure: %s\n", http_strerror(ret));
|
||||||
}
|
}
|
||||||
|
|
||||||
http_client_free(&client);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,40 @@
|
|||||||
|
#include "../chttp.h"
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
HTTP_Client client;
|
||||||
|
ret = http_client_init(&client);
|
||||||
|
if (ret < 0) {
|
||||||
|
printf("Couldn't initialize client (%s)\n", http_strerror(ret));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
HTTP_RequestBuilder builder = http_client_get_builder(&client);
|
||||||
|
|
||||||
|
http_request_builder_method(builder, HTTP_METHOD_GET);
|
||||||
|
http_request_builder_target(builder, HTTP_STR("http://coz.is"));
|
||||||
|
http_request_builder_header(builder, HTTP_STR("Greeting: Hello from the cHTTP example!"));
|
||||||
|
|
||||||
|
ret = http_request_builder_send(builder);
|
||||||
|
if (ret < 0) {
|
||||||
|
printf("Couldn't build request (%s)\n", http_strerror(ret));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int result;
|
||||||
|
void *user;
|
||||||
|
HTTP_Response *response;
|
||||||
|
http_client_wait_response(&client, &result, &user, &response);
|
||||||
|
|
||||||
|
if (result == HTTP_OK) {
|
||||||
|
printf("Received %d bytes\n", response->body.len);
|
||||||
|
} else {
|
||||||
|
printf("Couldn't receive response (%s)\n", http_strerror(result));
|
||||||
|
}
|
||||||
|
|
||||||
|
http_free_response(response);
|
||||||
|
http_client_free(&client);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@@ -707,3 +707,66 @@ void http_client_wait_response(HTTP_Client *client,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static _Thread_local HTTP_Client *implicit_client;
|
||||||
|
|
||||||
|
static int perform_request(HTTP_Method method,
|
||||||
|
HTTP_String url, HTTP_String *headers,
|
||||||
|
int num_headers, HTTP_String body,
|
||||||
|
HTTP_Response **response)
|
||||||
|
{
|
||||||
|
if (implicit_client == NULL) {
|
||||||
|
|
||||||
|
implicit_client = malloc(sizeof(HTTP_Client));
|
||||||
|
if (implicit_client == NULL)
|
||||||
|
return HTTP_ERROR_OOM;
|
||||||
|
|
||||||
|
int ret = http_client_init(implicit_client);
|
||||||
|
if (ret < 0) {
|
||||||
|
free(implicit_client);
|
||||||
|
implicit_client = NULL;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
HTTP_Client *client = implicit_client;
|
||||||
|
|
||||||
|
HTTP_RequestBuilder builder = http_client_get_builder(client);
|
||||||
|
http_request_builder_method(builder, method);
|
||||||
|
http_request_builder_target(builder, url);
|
||||||
|
for (int i = 0; i < num_headers; i++)
|
||||||
|
http_request_builder_header(builder, headers[i]);
|
||||||
|
http_request_builder_body(builder, body);
|
||||||
|
int ret = http_request_builder_send(builder);
|
||||||
|
if (ret < 0) return ret;
|
||||||
|
|
||||||
|
int result;
|
||||||
|
void *user;
|
||||||
|
http_client_wait_response(client, &result, &user, response);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
int http_get(HTTP_String url, HTTP_String *headers,
|
||||||
|
int num_headers, HTTP_Response **response)
|
||||||
|
{
|
||||||
|
return perform_request(HTTP_METHOD_GET, url, headers, num_headers, HTTP_STR(""), response);
|
||||||
|
}
|
||||||
|
|
||||||
|
int http_post(HTTP_String url, HTTP_String *headers,
|
||||||
|
int num_headers, HTTP_String body,
|
||||||
|
HTTP_Response **response)
|
||||||
|
{
|
||||||
|
return perform_request(HTTP_METHOD_POST, url, headers, num_headers, body, response);
|
||||||
|
}
|
||||||
|
|
||||||
|
int http_put(HTTP_String url, HTTP_String *headers,
|
||||||
|
int num_headers, HTTP_String body,
|
||||||
|
HTTP_Response **response)
|
||||||
|
{
|
||||||
|
return perform_request(HTTP_METHOD_PUT, url, headers, num_headers, body, response);
|
||||||
|
}
|
||||||
|
|
||||||
|
int http_delete(HTTP_String url, HTTP_String *headers,
|
||||||
|
int num_headers, HTTP_Response **response)
|
||||||
|
{
|
||||||
|
return perform_request(HTTP_METHOD_DELETE, url, headers, num_headers, HTTP_STR(""), response);
|
||||||
|
}
|
||||||
|
|||||||
@@ -223,3 +223,21 @@ void http_client_wait_response(HTTP_Client *client,
|
|||||||
// 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);
|
||||||
|
|
||||||
|
// Perform a blocking GET request
|
||||||
|
int http_get(HTTP_String url, HTTP_String *headers,
|
||||||
|
int num_headers, HTTP_Response **response);
|
||||||
|
|
||||||
|
// Perform a blocking POST request
|
||||||
|
int http_post(HTTP_String url, HTTP_String *headers,
|
||||||
|
int num_headers, HTTP_String body,
|
||||||
|
HTTP_Response **response);
|
||||||
|
|
||||||
|
// Perform a blocking PUT request
|
||||||
|
int http_put(HTTP_String url, HTTP_String *headers,
|
||||||
|
int num_headers, HTTP_String body,
|
||||||
|
HTTP_Response **response);
|
||||||
|
|
||||||
|
// Perform a blocking DELETE request
|
||||||
|
int http_delete(HTTP_String url, HTTP_String *headers,
|
||||||
|
int num_headers, HTTP_Response **response);
|
||||||
|
|||||||
Reference in New Issue
Block a user