http-client.h revision 50d1446e71cfbdc5b6d7bafcf91b7bff453989d3
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch#ifndef HTTP_CLIENT_H
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch#define HTTP_CLIENT_H
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch
fc94140acba51adafedafbc8491a3223a51db7a8Stephan Bosch#include "net.h"
fc94140acba51adafedafbc8491a3223a51db7a8Stephan Bosch
1920ef85b63738a06914e56508049dd0afe38732Timo Sirainen#include "http-response.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,
50d1446e71cfbdc5b6d7bafcf91b7bff453989d3Stephan Bosch HTTP_CLIENT_REQUEST_ERROR_BROKEN_PAYLOAD,
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
b99130e4cf4af4e6b103b949456222f3a2dff424Timo Sirainen /* User-Agent: header (default: none) */
b99130e4cf4af4e6b103b949456222f3a2dff424Timo Sirainen const char *user_agent;
b99130e4cf4af4e6b103b949456222f3a2dff424Timo Sirainen
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
ad03049781fc14807248007d524be4daf06c3ee2Stephan Bosch /* don't automatically act upon redirect responses */
ad03049781fc14807248007d524be4daf06c3ee2Stephan Bosch bool no_auto_redirect;
ad03049781fc14807248007d524be4daf06c3ee2Stephan 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
feba5e502b2131c9a1c766b7ef9ff041dbf71d1dStephan Bosch /* response header limits */
feba5e502b2131c9a1c766b7ef9ff041dbf71d1dStephan Bosch struct http_header_limits response_hdr_limits;
feba5e502b2131c9a1c766b7ef9ff041dbf71d1dStephan Bosch
a8c4e79ff50fac21b05a7368b052583d410ca15cTimo Sirainen /* max time to wait for HTTP request to finish before retrying
a8c4e79ff50fac21b05a7368b052583d410ca15cTimo Sirainen (default = unlimited) */
a8c4e79ff50fac21b05a7368b052583d410ca15cTimo Sirainen unsigned int request_timeout_msecs;
a8c4e79ff50fac21b05a7368b052583d410ca15cTimo Sirainen /* max time to wait for connect() (and SSL handshake) to finish before
a8c4e79ff50fac21b05a7368b052583d410ca15cTimo Sirainen retrying (default = request_timeout_msecs) */
a8c4e79ff50fac21b05a7368b052583d410ca15cTimo Sirainen unsigned int connect_timeout_msecs;
70505f4839520ac67895992621c97d2480c22e7fTimo Sirainen /* time to wait for connect() (and SSL handshake) to finish for the first
70505f4839520ac67895992621c97d2480c22e7fTimo Sirainen connection before trying the next IP in parallel
70505f4839520ac67895992621c97d2480c22e7fTimo Sirainen (default = 0; wait until current connection attempt finishes) */
70505f4839520ac67895992621c97d2480c22e7fTimo Sirainen unsigned int soft_connect_timeout_msecs;
a8c4e79ff50fac21b05a7368b052583d410ca15cTimo Sirainen
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,
fc94140acba51adafedafbc8491a3223a51db7a8Stephan Bosch in_port_t 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);
6d573191bea1a64d6046be070487a5705a2d0204Stephan Boschvoid http_client_request_set_date(struct http_client_request *req,
6d573191bea1a64d6046be070487a5705a2d0204Stephan Bosch time_t date);
6d573191bea1a64d6046be070487a5705a2d0204Stephan Bosch
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);
17cd0e0963f2fb0e66d49703e8cd0bda1b842468Timo Sirainen/* Returns number of pending HTTP requests. */
17cd0e0963f2fb0e66d49703e8cd0bda1b842468Timo Sirainenunsigned int http_client_get_pending_request_count(struct http_client *client);
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch#endif