#ifndef PROXY_HTTPCLIENT_H
#define PROXY_HTTPCLIENT_H
#include "../public/nsapi.h"
#include "../daemon/httpparser.h"
#include "../util/io.h"
#include <sys/socket.h>
#include <cx/string.h>
#include <cx/mempool.h>
#include <cx/test.h>
#include <inttypes.h>
#ifdef __cplusplus
extern "C" {
#endif
#define HTTP_CLIENT_BUFFER_SIZE 4096
#define HTTP_CLIENT_CALLBACK_WOULD_BLOCK -1
#define HTTP_CLIENT_CALLBACK_ERROR -2
typedef struct HttpClient HttpClient;
struct HttpClient {
EventHandler *ev;
CxMempool *mp;
char *method;
char *uri;
struct sockaddr *addr;
size_t addrlen;
int socketfd;
HttpStream *stream;
HeaderArray *request_headers;
HeaderArray *response_headers;
int64_t req_content_length;
int error;
int statuscode;
ssize_t (*request_body_read)(HttpClient *,
void *,
size_t,
void *);
void *request_body_read_userdata;
int (*response_start)(HttpClient *,
int,
char *,
void *);
void *response_start_userdata;
ssize_t (*response_body_write)(HttpClient *,
void *,
size_t,
void *);
void *response_body_write_userdata;
void (*response_finished)(HttpClient *,
void *);
void *response_finished_userdata;
HttpParser *parser;
netbuf buffer;
char *transfer_buffer;
size_t transfer_buffer_alloc;
size_t transfer_buffer_len;
size_t transfer_buffer_pos;
size_t req_contentlength_pos;
int request_body_complete;
int request_body_terminated;
int response_header_complete;
Event readev;
Event writeev;
};
HttpClient* http_client_new(EventHandler *ev);
void http_client_free(HttpClient *client);
int http_client_set_addr(HttpClient *client,
const struct sockaddr *addr,
socklen_t addrlen);
int http_client_set_method(HttpClient *client,
const char *method);
int http_client_set_uri(HttpClient *client,
const char *uri);
int http_client_set_method_len(HttpClient *client,
const char *method,
size_t len);
int http_client_set_uri_len(HttpClient *client,
const char *uri,
size_t len);
int http_client_add_request_header(HttpClient *client, cxmutstr name, cxmutstr value);
int http_client_add_request_header_copy(HttpClient *client, cxstring name, cxstring value);
int http_client_set_content_length(HttpClient *client,
int64_t contentlength);
int http_client_enable_chunked_transfer_encoding(HttpClient *client);
int http_client_start(HttpClient *client);
void http_client_add_tests(CxTestSuite *suite);
#ifdef __cplusplus
}
#endif
#endif