http-client.h revision 35e962a9186b4e9b2001628c1d7b55c24b33ce84
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch#ifndef HTTP_CLIENT_H
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch#define HTTP_CLIENT_H
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch
eb325a5a90c1d2655e74972bde0de6a699d2c864Stephan Bosch#include "http-response-parser.h"
eb325a5a90c1d2655e74972bde0de6a699d2c864Stephan Bosch
7384b4e78eaab44693c985192276e31322155e32Stephan Boschstruct http_response;
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch
7384b4e78eaab44693c985192276e31322155e32Stephan Boschstruct http_client;
7384b4e78eaab44693c985192276e31322155e32Stephan Boschstruct http_client_request;
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch
7384b4e78eaab44693c985192276e31322155e32Stephan Boschenum http_client_request_error {
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch HTTP_CLIENT_REQUEST_ERROR_ABORTED = 9000,
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch HTTP_CLIENT_REQUEST_ERROR_HOST_LOOKUP_FAILED,
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch HTTP_CLIENT_REQUEST_ERROR_CONNECT_FAILED,
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch HTTP_CLIENT_REQUEST_ERROR_INVALID_REDIRECT,
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch HTTP_CLIENT_REQUEST_ERROR_CONNECTION_LOST,
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch HTTP_CLIENT_REQUEST_ERROR_BAD_RESPONSE,
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch HTTP_CLIENT_REQUEST_ERROR_TIMED_OUT,
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch};
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch
1d048c5050f03c24251e5af8087e640de21b2d62Timo Sirainenenum http_request_state {
1d048c5050f03c24251e5af8087e640de21b2d62Timo Sirainen HTTP_REQUEST_STATE_NEW = 0,
1d048c5050f03c24251e5af8087e640de21b2d62Timo Sirainen HTTP_REQUEST_STATE_QUEUED,
1d048c5050f03c24251e5af8087e640de21b2d62Timo Sirainen HTTP_REQUEST_STATE_PAYLOAD_OUT,
1d048c5050f03c24251e5af8087e640de21b2d62Timo Sirainen HTTP_REQUEST_STATE_WAITING,
1d048c5050f03c24251e5af8087e640de21b2d62Timo Sirainen HTTP_REQUEST_STATE_GOT_RESPONSE,
1d048c5050f03c24251e5af8087e640de21b2d62Timo Sirainen HTTP_REQUEST_STATE_PAYLOAD_IN,
1d048c5050f03c24251e5af8087e640de21b2d62Timo Sirainen HTTP_REQUEST_STATE_FINISHED,
1d048c5050f03c24251e5af8087e640de21b2d62Timo Sirainen HTTP_REQUEST_STATE_ABORTED
1d048c5050f03c24251e5af8087e640de21b2d62Timo Sirainen};
1d048c5050f03c24251e5af8087e640de21b2d62Timo Sirainenextern const char *http_request_state_names[];
1d048c5050f03c24251e5af8087e640de21b2d62Timo Sirainen
7384b4e78eaab44693c985192276e31322155e32Stephan Boschstruct http_client_settings {
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch const char *dns_client_socket_path;
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch
56d1345c43bbd28c36b7faa85e4163bd9e874290Timo Sirainen const char *ssl_ca_dir, *ssl_ca_file, *ssl_ca;
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch const char *ssl_crypto_device;
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch bool ssl_allow_invalid_cert;
35e962a9186b4e9b2001628c1d7b55c24b33ce84Timo Sirainen /* user cert */
35e962a9186b4e9b2001628c1d7b55c24b33ce84Timo Sirainen const char *ssl_cert, *ssl_key, *ssl_key_password;
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch const char *rawlog_dir;
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch unsigned int max_idle_time_msecs;
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch /* maximum number of parallel connections per peer (default = 1) */
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch unsigned int max_parallel_connections;
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch /* maximum number of pipelined requests per connection (default = 1) */
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch unsigned int max_pipelined_requests;
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch /* maximum number of redirects for a request
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch (default = 0; redirects refused)
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch */
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch unsigned int max_redirects;
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch /* maximum number of attempts for a request */
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch unsigned int max_attempts;
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch bool debug;
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch};
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch
7384b4e78eaab44693c985192276e31322155e32Stephan Boschtypedef void
7384b4e78eaab44693c985192276e31322155e32Stephan Boschhttp_client_request_callback_t(const struct http_response *response,
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch void *context);
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch
7384b4e78eaab44693c985192276e31322155e32Stephan Boschstruct http_client *http_client_init(const struct http_client_settings *set);
7384b4e78eaab44693c985192276e31322155e32Stephan Boschvoid http_client_deinit(struct http_client **_client);
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch
7384b4e78eaab44693c985192276e31322155e32Stephan Boschstruct http_client_request *
7384b4e78eaab44693c985192276e31322155e32Stephan Boschhttp_client_request(struct http_client *client,
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch const char *method, const char *host, const char *target,
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch http_client_request_callback_t *callback, void *context);
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch#define http_client_request(client, method, host, target, callback, context) \
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch http_client_request(client, method, host, target + \
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch CALLBACK_TYPECHECK(callback, void (*)( \
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch const struct http_response *response, typeof(context))), \
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch (http_client_request_callback_t *)callback, context)
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch
7384b4e78eaab44693c985192276e31322155e32Stephan Boschvoid http_client_request_set_port(struct http_client_request *req,
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch unsigned int port);
7384b4e78eaab44693c985192276e31322155e32Stephan Boschvoid http_client_request_set_ssl(struct http_client_request *req,
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch bool ssl);
7384b4e78eaab44693c985192276e31322155e32Stephan Boschvoid http_client_request_set_urgent(struct http_client_request *req);
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch
7384b4e78eaab44693c985192276e31322155e32Stephan Boschvoid http_client_request_add_header(struct http_client_request *req,
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch const char *key, const char *value);
7384b4e78eaab44693c985192276e31322155e32Stephan Boschvoid http_client_request_set_payload(struct http_client_request *req,
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch struct istream *input, bool sync);
eb325a5a90c1d2655e74972bde0de6a699d2c864Stephan Bosch
1d048c5050f03c24251e5af8087e640de21b2d62Timo Sirainenenum http_request_state
1d048c5050f03c24251e5af8087e640de21b2d62Timo Sirainenhttp_client_request_get_state(struct http_client_request *req);
7384b4e78eaab44693c985192276e31322155e32Stephan Boschvoid http_client_request_submit(struct http_client_request *req);
6c768e0e1ca2da178e79f7435c32ced01f6bcb24Timo Sirainenbool http_client_request_try_retry(struct http_client_request *req);
7384b4e78eaab44693c985192276e31322155e32Stephan Boschvoid http_client_request_abort(struct http_client_request **req);
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch
4124bebe6daab2cd05acb0416096fc47cb9abd92Timo Sirainen/* Call the specified callback when HTTP request is destroyed. */
4124bebe6daab2cd05acb0416096fc47cb9abd92Timo Sirainenvoid http_client_request_set_destroy_callback(struct http_client_request *req,
4124bebe6daab2cd05acb0416096fc47cb9abd92Timo Sirainen void (*callback)(void *),
4124bebe6daab2cd05acb0416096fc47cb9abd92Timo Sirainen void *context);
4124bebe6daab2cd05acb0416096fc47cb9abd92Timo Sirainen
eb325a5a90c1d2655e74972bde0de6a699d2c864Stephan Bosch/* submits request and blocks until provided payload is sent. Multiple calls
069b28a2ef54072a221fe4ac67aaeb4e83fee6c1Timo Sirainen are allowed; payload transmission is ended with
069b28a2ef54072a221fe4ac67aaeb4e83fee6c1Timo Sirainen http_client_request_finish_payload(). */
eb325a5a90c1d2655e74972bde0de6a699d2c864Stephan Boschint http_client_request_send_payload(struct http_client_request **req,
eb325a5a90c1d2655e74972bde0de6a699d2c864Stephan Bosch const unsigned char *data, size_t size);
069b28a2ef54072a221fe4ac67aaeb4e83fee6c1Timo Sirainenint http_client_request_finish_payload(struct http_client_request **req);
eb325a5a90c1d2655e74972bde0de6a699d2c864Stephan Bosch
7384b4e78eaab44693c985192276e31322155e32Stephan Boschvoid http_client_switch_ioloop(struct http_client *client);
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch/* blocks until all currently submitted requests are handled */
7384b4e78eaab44693c985192276e31322155e32Stephan Boschvoid http_client_wait(struct http_client *client);
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch#endif