1 /* 2 * uclient - ustream based protocol client library 3 * 4 * Copyright (C) 2014 Felix Fietkau <nbd@openwrt.org> 5 * 6 * Permission to use, copy, modify, and/or distribute this software for any 7 * purpose with or without fee is hereby granted, provided that the above 8 * copyright notice and this permission notice appear in all copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17 */ 18 #ifndef __LIBUBOX_UCLIENT_H 19 #define __LIBUBOX_UCLIENT_H 20 21 #include <netinet/in.h> 22 23 #include <libubox/blob.h> 24 #include <libubox/ustream.h> 25 #include <libubox/ustream-ssl.h> 26 27 #define UCLIENT_DEFAULT_TIMEOUT_MS 30000 28 29 struct uclient_cb; 30 struct uclient_backend; 31 32 enum uclient_error_code { 33 UCLIENT_ERROR_UNKNOWN, 34 UCLIENT_ERROR_CONNECT, 35 UCLIENT_ERROR_TIMEDOUT, 36 UCLIENT_ERROR_SSL_INVALID_CERT, 37 UCLIENT_ERROR_SSL_CN_MISMATCH, 38 UCLIENT_ERROR_MISSING_SSL_CONTEXT, 39 __UCLIENT_ERROR_MAX 40 }; 41 42 union uclient_addr { 43 struct sockaddr sa; 44 struct sockaddr_in sin; 45 struct sockaddr_in6 sin6; 46 }; 47 48 struct uclient_url { 49 const struct uclient_backend *backend; 50 int prefix; 51 52 const char *host; 53 const char *port; 54 const char *location; 55 56 const char *auth; 57 }; 58 59 struct uclient { 60 const struct uclient_backend *backend; 61 const struct uclient_cb *cb; 62 63 union uclient_addr local_addr, remote_addr; 64 65 struct uclient_url *proxy_url; 66 struct uclient_url *url; 67 int timeout_msecs; 68 void *priv; 69 70 bool eof; 71 bool data_eof; 72 int error_code; 73 int status_code; 74 int seq; 75 struct blob_attr *meta; 76 77 struct uloop_timeout connection_timeout; 78 struct uloop_timeout timeout; 79 }; 80 81 struct uclient_cb { 82 void (*data_read)(struct uclient *cl); 83 void (*data_sent)(struct uclient *cl); 84 void (*data_eof)(struct uclient *cl); 85 void (*header_done)(struct uclient *cl); 86 void (*error)(struct uclient *cl, int code); 87 }; 88 89 struct uclient *uclient_new(const char *url, const char *auth_str, const struct uclient_cb *cb); 90 void uclient_free(struct uclient *cl); 91 92 int uclient_set_url(struct uclient *cl, const char *url, const char *auth); 93 int uclient_set_proxy_url(struct uclient *cl, const char *url_str, const char *auth_str); 94 95 96 /** 97 * Sets connection timeout. 98 * 99 * Provided timeout value will be used for: 100 * 1) Receiving HTTP response 101 * 2) Receiving data 102 * 103 * In case of timeout uclient will use error callback with 104 * UCLIENT_ERROR_TIMEDOUT code. 105 * 106 * @param msecs timeout in milliseconds 107 */ 108 int uclient_set_timeout(struct uclient *cl, int msecs); 109 110 int uclient_connect(struct uclient *cl); 111 void uclient_disconnect(struct uclient *cl); 112 113 int uclient_read(struct uclient *cl, char *buf, int len); 114 int uclient_write(struct uclient *cl, const char *buf, int len); 115 int uclient_request(struct uclient *cl); 116 117 char *uclient_get_addr(char *dest, int *port, union uclient_addr *a); 118 119 /* HTTP */ 120 extern const struct uclient_backend uclient_backend_http; 121 122 int uclient_http_reset_headers(struct uclient *cl); 123 int uclient_http_set_header(struct uclient *cl, const char *name, const char *value); 124 int uclient_http_set_request_type(struct uclient *cl, const char *type); 125 int uclient_http_redirect(struct uclient *cl); 126 127 int uclient_http_set_ssl_ctx(struct uclient *cl, const struct ustream_ssl_ops *ops, 128 struct ustream_ssl_ctx *ctx, bool require_validation); 129 int uclient_http_set_address_family(struct uclient *cl, int af); 130 const char *uclient_strerror(unsigned err); 131 132 #endif 133
This page was automatically generated by LXR 0.3.1. • OpenWrt