http-client.h revision 4c4c4a740bbb1b674d4b0dae009d1919f8ad96b7
a11689fe3fbb3bca11b9cb4ae5faf27db96401ccTimo Sirainen#ifndef HTTP_CLIENT_H
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen#define HTTP_CLIENT_H
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen#include "net.h"
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen#include "http-response.h"
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainenstruct timeval;
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainenstruct http_response;
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainenstruct http_client;
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainenstruct http_client_request;
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainenenum http_client_request_error {
a78d5bd9772681a232de56b3dd6acefee66cc71bTimo Sirainen HTTP_CLIENT_REQUEST_ERROR_ABORTED = 9000,
a78d5bd9772681a232de56b3dd6acefee66cc71bTimo Sirainen HTTP_CLIENT_REQUEST_ERROR_HOST_LOOKUP_FAILED,
a78d5bd9772681a232de56b3dd6acefee66cc71bTimo Sirainen HTTP_CLIENT_REQUEST_ERROR_CONNECT_FAILED,
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen HTTP_CLIENT_REQUEST_ERROR_INVALID_REDIRECT,
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen HTTP_CLIENT_REQUEST_ERROR_CONNECTION_LOST,
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen HTTP_CLIENT_REQUEST_ERROR_BROKEN_PAYLOAD,
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen HTTP_CLIENT_REQUEST_ERROR_BAD_RESPONSE,
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen HTTP_CLIENT_REQUEST_ERROR_TIMED_OUT,
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen};
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainenenum http_request_state {
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen HTTP_REQUEST_STATE_NEW = 0,
d595049948579def2d82718dbce0a6b49a281402Timo Sirainen HTTP_REQUEST_STATE_QUEUED,
d595049948579def2d82718dbce0a6b49a281402Timo Sirainen HTTP_REQUEST_STATE_PAYLOAD_OUT,
d595049948579def2d82718dbce0a6b49a281402Timo Sirainen HTTP_REQUEST_STATE_WAITING,
d595049948579def2d82718dbce0a6b49a281402Timo Sirainen HTTP_REQUEST_STATE_GOT_RESPONSE,
d595049948579def2d82718dbce0a6b49a281402Timo Sirainen HTTP_REQUEST_STATE_PAYLOAD_IN,
d595049948579def2d82718dbce0a6b49a281402Timo Sirainen HTTP_REQUEST_STATE_FINISHED,
d595049948579def2d82718dbce0a6b49a281402Timo Sirainen HTTP_REQUEST_STATE_ABORTED
d595049948579def2d82718dbce0a6b49a281402Timo Sirainen};
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainenextern const char *http_request_state_names[];
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainenstruct http_client_settings {
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen /* a) If dns_client is set, all lookups are done via it.
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen b) If dns_client_socket_path is set, each DNS lookup does its own
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen dns-lookup UNIX socket connection.
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen c) Otherwise, blocking gethostbyname() lookups are used. */
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen struct dns_client *dns_client;
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen const char *dns_client_socket_path;
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen const char *ssl_ca_dir, *ssl_ca_file, *ssl_ca;
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen const char *ssl_crypto_device;
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen bool ssl_allow_invalid_cert;
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen /* user cert */
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen const char *ssl_cert, *ssl_key, *ssl_key_password;
28cb56e6957f06717e876cecb7aabc820fdf632eTimo Sirainen
28cb56e6957f06717e876cecb7aabc820fdf632eTimo Sirainen /* User-Agent: header (default: none) */
28cb56e6957f06717e876cecb7aabc820fdf632eTimo Sirainen const char *user_agent;
28cb56e6957f06717e876cecb7aabc820fdf632eTimo Sirainen
28cb56e6957f06717e876cecb7aabc820fdf632eTimo Sirainen /* configuration for using a proxy */
28cb56e6957f06717e876cecb7aabc820fdf632eTimo Sirainen const char *proxy_socket_path; /* FIXME: implement */
28cb56e6957f06717e876cecb7aabc820fdf632eTimo Sirainen const struct http_url *proxy_url;
28cb56e6957f06717e876cecb7aabc820fdf632eTimo Sirainen const char *proxy_username;
28cb56e6957f06717e876cecb7aabc820fdf632eTimo Sirainen const char *proxy_password;
28cb56e6957f06717e876cecb7aabc820fdf632eTimo Sirainen
28cb56e6957f06717e876cecb7aabc820fdf632eTimo Sirainen const char *rawlog_dir;
28cb56e6957f06717e876cecb7aabc820fdf632eTimo Sirainen
28cb56e6957f06717e876cecb7aabc820fdf632eTimo Sirainen unsigned int max_idle_time_msecs;
28cb56e6957f06717e876cecb7aabc820fdf632eTimo Sirainen
28cb56e6957f06717e876cecb7aabc820fdf632eTimo Sirainen /* maximum number of parallel connections per peer (default = 1) */
28cb56e6957f06717e876cecb7aabc820fdf632eTimo Sirainen unsigned int max_parallel_connections;
28cb56e6957f06717e876cecb7aabc820fdf632eTimo Sirainen
28cb56e6957f06717e876cecb7aabc820fdf632eTimo Sirainen /* maximum number of pipelined requests per connection (default = 1) */
28cb56e6957f06717e876cecb7aabc820fdf632eTimo Sirainen unsigned int max_pipelined_requests;
28cb56e6957f06717e876cecb7aabc820fdf632eTimo Sirainen
28cb56e6957f06717e876cecb7aabc820fdf632eTimo Sirainen /* don't automatically act upon redirect responses */
28cb56e6957f06717e876cecb7aabc820fdf632eTimo Sirainen bool no_auto_redirect;
28cb56e6957f06717e876cecb7aabc820fdf632eTimo Sirainen
28cb56e6957f06717e876cecb7aabc820fdf632eTimo Sirainen /* if we use a proxy, delegate SSL negotiation to proxy, rather than
28cb56e6957f06717e876cecb7aabc820fdf632eTimo Sirainen creating a CONNECT tunnel through the proxy for the SSL link */
28cb56e6957f06717e876cecb7aabc820fdf632eTimo Sirainen bool no_ssl_tunnel;
28cb56e6957f06717e876cecb7aabc820fdf632eTimo Sirainen
28cb56e6957f06717e876cecb7aabc820fdf632eTimo Sirainen /* maximum number of redirects for a request
28cb56e6957f06717e876cecb7aabc820fdf632eTimo Sirainen (default = 0; redirects refused)
28cb56e6957f06717e876cecb7aabc820fdf632eTimo Sirainen */
28cb56e6957f06717e876cecb7aabc820fdf632eTimo Sirainen unsigned int max_redirects;
28cb56e6957f06717e876cecb7aabc820fdf632eTimo Sirainen
28cb56e6957f06717e876cecb7aabc820fdf632eTimo Sirainen /* maximum number of attempts for a request */
28cb56e6957f06717e876cecb7aabc820fdf632eTimo Sirainen unsigned int max_attempts;
28cb56e6957f06717e876cecb7aabc820fdf632eTimo Sirainen
28cb56e6957f06717e876cecb7aabc820fdf632eTimo Sirainen /* maximum number of connection attempts to a host before all associated
28cb56e6957f06717e876cecb7aabc820fdf632eTimo Sirainen requests fail.
28cb56e6957f06717e876cecb7aabc820fdf632eTimo Sirainen
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen if > 1, the maximum will be enforced across all IPs for that host,
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen meaning that IPs may be tried more than once eventually if the number
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen of IPs is smaller than the specified maximum attempts. If the number of IPs
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen is higher than the maximum attempts, not all IPs are tried. If <= 1, all
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen IPs are tried at most once.
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen */
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen unsigned int max_connect_attempts;
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen /* Initial backoff time; doubled at each connection failure */
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen unsigned int connect_backoff_time_msecs;
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen /* Maximum backoff time */
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen unsigned int connect_backoff_max_time_msecs;
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
28cb56e6957f06717e876cecb7aabc820fdf632eTimo Sirainen /* response header limits */
28cb56e6957f06717e876cecb7aabc820fdf632eTimo Sirainen struct http_header_limits response_hdr_limits;
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen /* max total time to wait for HTTP request to finish
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen this can be overridden/reset for individual requests using
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen http_client_request_set_timeout() and friends.
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen (default is no timeout)
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen */
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen unsigned int request_absolute_timeout_msecs;
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen /* max time to wait for HTTP request to finish before retrying
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen (default = unlimited) */
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen unsigned int request_timeout_msecs;
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen /* max time to wait for connect() (and SSL handshake) to finish before
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen retrying (default = request_timeout_msecs) */
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen unsigned int connect_timeout_msecs;
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen /* time to wait for connect() (and SSL handshake) to finish for the first
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen connection before trying the next IP in parallel
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen (default = 0; wait until current connection attempt finishes) */
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen unsigned int soft_connect_timeout_msecs;
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen /* maximum acceptable delay in seconds for automatically
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen retrying/redirecting requests. if a server sends a response with a
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen Retry-After header that causes a delay longer than this, the request
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen is not automatically retried and the response is returned */
bbc30fd4fa86723f6a72309ad3a2a96f34eabd6cTimo Sirainen unsigned int max_auto_retry_delay;
bbc30fd4fa86723f6a72309ad3a2a96f34eabd6cTimo Sirainen
bbc30fd4fa86723f6a72309ad3a2a96f34eabd6cTimo Sirainen bool debug;
bbc30fd4fa86723f6a72309ad3a2a96f34eabd6cTimo Sirainen};
bbc30fd4fa86723f6a72309ad3a2a96f34eabd6cTimo Sirainen
bbc30fd4fa86723f6a72309ad3a2a96f34eabd6cTimo Sirainenstruct http_client_tunnel {
bbc30fd4fa86723f6a72309ad3a2a96f34eabd6cTimo Sirainen int fd_in, fd_out;
bbc30fd4fa86723f6a72309ad3a2a96f34eabd6cTimo Sirainen struct istream *input;
bbc30fd4fa86723f6a72309ad3a2a96f34eabd6cTimo Sirainen struct ostream *output;
bbc30fd4fa86723f6a72309ad3a2a96f34eabd6cTimo Sirainen};
bbc30fd4fa86723f6a72309ad3a2a96f34eabd6cTimo Sirainen
bbc30fd4fa86723f6a72309ad3a2a96f34eabd6cTimo Sirainentypedef void
bbc30fd4fa86723f6a72309ad3a2a96f34eabd6cTimo Sirainenhttp_client_request_callback_t(const struct http_response *response,
bbc30fd4fa86723f6a72309ad3a2a96f34eabd6cTimo Sirainen void *context);
bbc30fd4fa86723f6a72309ad3a2a96f34eabd6cTimo Sirainen
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainenstruct http_client *http_client_init(const struct http_client_settings *set);
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainenvoid http_client_deinit(struct http_client **_client);
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen/* create new HTTP request */
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainenstruct http_client_request *
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainenhttp_client_request(struct http_client *client,
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen const char *method, const char *host, const char *target,
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen http_client_request_callback_t *callback, void *context);
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen#define http_client_request(client, method, host, target, callback, context) \
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen http_client_request(client, method, host, target + \
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen CALLBACK_TYPECHECK(callback, void (*)( \
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen const struct http_response *response, typeof(context))), \
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen (http_client_request_callback_t *)callback, context)
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainenstruct http_client_request *
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainenhttp_client_request_url(struct http_client *client,
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen const char *method, const struct http_url *target_url,
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen http_client_request_callback_t *callback, void *context);
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen#define http_client_request_url(client, method, target_url, callback, context) \
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen http_client_request_url(client, method, target_url + \
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen CALLBACK_TYPECHECK(callback, void (*)( \
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen const struct http_response *response, typeof(context))), \
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen (http_client_request_callback_t *)callback, context)
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen/* create new HTTP CONNECT request. If this HTTP is configured to use a proxy,
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen a CONNECT request will be submitted at that proxy, otherwise the connection
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen is created directly. Call http_client_request_start_tunnel() to
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen to take over the connection.
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen */
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainenstruct http_client_request *
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainenhttp_client_request_connect(struct http_client *client,
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen const char *host, in_port_t port,
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen http_client_request_callback_t *callback,
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen void *context);
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen#define http_client_request_connect(client, host, port, callback, context) \
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen http_client_request_connect(client, host, port + \
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen CALLBACK_TYPECHECK(callback, void (*)( \
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen const struct http_response *response, typeof(context))), \
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen (http_client_request_callback_t *)callback, context)
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainenstruct http_client_request *
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainenhttp_client_request_connect_ip(struct http_client *client,
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen const struct ip_addr *ip, in_port_t port,
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen http_client_request_callback_t *callback,
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen void *context);
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen#define http_client_request_connect_ip(client, ip, port, callback, context) \
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen http_client_request_connect_ip(client, ip, port + \
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen CALLBACK_TYPECHECK(callback, void (*)( \
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen const struct http_response *response, typeof(context))), \
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen (http_client_request_callback_t *)callback, context)
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainenvoid http_client_request_set_port(struct http_client_request *req,
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen in_port_t port);
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainenvoid http_client_request_set_ssl(struct http_client_request *req,
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen bool ssl);
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainenvoid http_client_request_set_urgent(struct http_client_request *req);
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainenvoid http_client_request_add_header(struct http_client_request *req,
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen const char *key, const char *value);
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainenvoid http_client_request_remove_header(struct http_client_request *req,
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen const char *key);
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainenvoid http_client_request_set_date(struct http_client_request *req,
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen time_t date);
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainenvoid http_client_request_set_payload(struct http_client_request *req,
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen struct istream *input, bool sync);
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainenvoid http_client_request_set_timeout_msecs(struct http_client_request *req,
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen unsigned int msecs);
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainenvoid http_client_request_set_timeout(struct http_client_request *req,
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen const struct timeval *time);
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainenvoid http_client_request_set_auth_simple(struct http_client_request *req,
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen const char *username, const char *password);
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainenvoid http_client_request_delay_until(struct http_client_request *req,
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen time_t time);
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainenvoid http_client_request_delay(struct http_client_request *req,
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen time_t seconds);
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainenvoid http_client_request_delay_msecs(struct http_client_request *req,
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen unsigned int msecs);
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainenconst char *http_client_request_get_method(struct http_client_request *req);
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainenconst char *http_client_request_get_target(struct http_client_request *req);
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainenenum http_request_state
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainenhttp_client_request_get_state(struct http_client_request *req);
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainenvoid http_client_request_submit(struct http_client_request *req);
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainenbool http_client_request_try_retry(struct http_client_request *req);
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainenvoid http_client_request_abort(struct http_client_request **req);
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen/* Call the specified callback when HTTP request is destroyed. */
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainenvoid http_client_request_set_destroy_callback(struct http_client_request *req,
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen void (*callback)(void *),
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen void *context);
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen/* submits request and blocks until provided payload is sent. Multiple calls
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen are allowed; payload transmission is ended with
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen http_client_request_finish_payload(). */
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainenint http_client_request_send_payload(struct http_client_request **req,
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen const unsigned char *data, size_t size);
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainenint http_client_request_finish_payload(struct http_client_request **req);
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainenvoid http_client_request_start_tunnel(struct http_client_request *req,
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen struct http_client_tunnel *tunnel);
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainenvoid http_client_switch_ioloop(struct http_client *client);
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen/* blocks until all currently submitted requests are handled */
1b33e848e84e6f74aa0e3339c32fa96bc15102a2Timo Sirainenvoid http_client_wait(struct http_client *client);
1b33e848e84e6f74aa0e3339c32fa96bc15102a2Timo Sirainen/* Returns number of pending HTTP requests. */
1b33e848e84e6f74aa0e3339c32fa96bc15102a2Timo Sirainenunsigned int http_client_get_pending_request_count(struct http_client *client);
1b33e848e84e6f74aa0e3339c32fa96bc15102a2Timo Sirainen
1b33e848e84e6f74aa0e3339c32fa96bc15102a2Timo Sirainen#endif
1b33e848e84e6f74aa0e3339c32fa96bc15102a2Timo Sirainen