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