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 enum uclient_log_type { 43 UCLIENT_LOG_SSL_ERROR, 44 UCLIENT_LOG_SSL_VERIFY_ERROR, 45 __UCLIENT_LOG_MAX 46 }; 47 48 union uclient_addr { 49 struct sockaddr sa; 50 struct sockaddr_in sin; 51 struct sockaddr_in6 sin6; 52 }; 53 54 struct uclient_url { 55 const struct uclient_backend *backend; 56 int prefix; 57 58 const char *host; 59 const char *port; 60 const char *location; 61 62 const char *auth; 63 }; 64 65 struct uclient { 66 const struct uclient_backend *backend; 67 const struct uclient_cb *cb; 68 69 union uclient_addr local_addr, remote_addr; 70 71 struct uclient_url *proxy_url; 72 struct uclient_url *url; 73 int timeout_msecs; 74 void *priv; 75 76 bool eof; 77 bool data_eof; 78 int error_code; 79 int status_code; 80 struct blob_attr *meta; 81 82 struct uloop_timeout connection_timeout; 83 struct uloop_timeout read_notify; 84 struct uloop_timeout timeout; 85 }; 86 87 struct uclient_cb { 88 void (*data_read)(struct uclient *cl); 89 void (*data_sent)(struct uclient *cl); 90 void (*data_eof)(struct uclient *cl); 91 void (*header_done)(struct uclient *cl); 92 void (*error)(struct uclient *cl, int code); 93 void (*log_msg)(struct uclient *cl, enum uclient_log_type type, const char *msg); 94 }; 95 96 struct uclient *uclient_new(const char *url, const char *auth_str, const struct uclient_cb *cb); 97 void uclient_free(struct uclient *cl); 98 99 int uclient_set_url(struct uclient *cl, const char *url, const char *auth); 100 int uclient_set_proxy_url(struct uclient *cl, const char *url_str, const char *auth_str); 101 102 103 /** 104 * Sets connection timeout. 105 * 106 * Provided timeout value will be used for: 107 * 1) Receiving HTTP response 108 * 2) Receiving data 109 * 110 * In case of timeout uclient will use error callback with 111 * UCLIENT_ERROR_TIMEDOUT code. 112 * 113 * @param msecs timeout in milliseconds 114 */ 115 int uclient_set_timeout(struct uclient *cl, int msecs); 116 117 int uclient_connect(struct uclient *cl); 118 void uclient_disconnect(struct uclient *cl); 119 120 int uclient_read(struct uclient *cl, char *buf, int len); 121 int uclient_write(struct uclient *cl, const char *buf, int len); 122 int uclient_pending_bytes(struct uclient *cl, bool write); 123 int uclient_request(struct uclient *cl); 124 125 char *uclient_get_addr(char *dest, int *port, union uclient_addr *a); 126 struct ustream_ssl_ctx *uclient_new_ssl_context(const struct ustream_ssl_ops **ops); 127 128 /* HTTP */ 129 extern const struct uclient_backend uclient_backend_http; 130 131 int uclient_http_reset_headers(struct uclient *cl); 132 int uclient_http_set_header(struct uclient *cl, const char *name, const char *value); 133 int uclient_http_set_request_type(struct uclient *cl, const char *type); 134 int uclient_http_redirect(struct uclient *cl); 135 136 static inline bool uclient_http_status_redirect(struct uclient *cl) 137 { 138 switch (cl->status_code) { 139 case 301: 140 case 302: 141 case 307: 142 return true; 143 default: 144 return false; 145 } 146 } 147 148 int uclient_http_set_ssl_ctx(struct uclient *cl, const struct ustream_ssl_ops *ops, 149 struct ustream_ssl_ctx *ctx, bool require_validation); 150 int uclient_http_set_address_family(struct uclient *cl, int af); 151 const char *uclient_strerror(unsigned err); 152 153 #endif 154
This page was automatically generated by LXR 0.3.1. • OpenWrt