diff options
author | Alexey Botchkov <holyfoot@askmonty.org> | 2015-10-05 14:46:12 +0500 |
---|---|---|
committer | Alexey Botchkov <holyfoot@askmonty.org> | 2015-10-09 03:23:35 +0500 |
commit | 3757bc5e895289a6d69e6382bccb11c021e7144c (patch) | |
tree | c62c4b29573a26d4b58245e21bc85d8e97523f00 /plugin | |
parent | 16ad1fc54027c4607f9edd14b02f776b41393f16 (diff) | |
download | mariadb-git-3757bc5e895289a6d69e6382bccb11c021e7144c.tar.gz |
MDEV-8431 Feedback plugin needs an option for http proxy.
'feedback_http_proxy' system variable added to specify the
proxy server as host:port. Not a dynamic one.
Diffstat (limited to 'plugin')
-rw-r--r-- | plugin/feedback/feedback.cc | 13 | ||||
-rw-r--r-- | plugin/feedback/feedback.h | 6 | ||||
-rw-r--r-- | plugin/feedback/url_base.cc | 46 | ||||
-rw-r--r-- | plugin/feedback/url_http.cc | 49 |
4 files changed, 101 insertions, 13 deletions
diff --git a/plugin/feedback/feedback.cc b/plugin/feedback/feedback.cc index 053d68eb66d..e0c8738eae3 100644 --- a/plugin/feedback/feedback.cc +++ b/plugin/feedback/feedback.cc @@ -25,7 +25,7 @@ namespace feedback { char server_uid_buf[SERVER_UID_SIZE+1]; ///< server uid will be written here /* backing store for system variables */ -static char *server_uid= server_uid_buf, *url; +static char *server_uid= server_uid_buf, *url, *http_proxy; char *user_info; ulong send_timeout, send_retry_wait; @@ -272,7 +272,13 @@ static int init(void *p) if (*e == 0 || *e == ' ') { if (e > s && (urls[slot]= Url::create(s, e - s))) + { + if (urls[slot]->set_proxy(http_proxy, + http_proxy ? strlen(http_proxy) : 0)) + sql_print_error("feedback plugin: invalid proxy '%s'", + http_proxy ? http_proxy : ""); slot++; + } else { if (e > s) @@ -350,6 +356,10 @@ static MYSQL_SYSVAR_ULONG(send_timeout, send_timeout, PLUGIN_VAR_RQCMDARG, static MYSQL_SYSVAR_ULONG(send_retry_wait, send_retry_wait, PLUGIN_VAR_RQCMDARG, "Wait this many seconds before retrying a failed send.", NULL, NULL, 60, 1, 60*60*24, 1); +static MYSQL_SYSVAR_STR(http_proxy, http_proxy, + PLUGIN_VAR_READONLY | PLUGIN_VAR_RQCMDARG, + "Proxy server host:port.", NULL, NULL,0); + static struct st_mysql_sys_var* settings[] = { MYSQL_SYSVAR(server_uid), @@ -357,6 +367,7 @@ static struct st_mysql_sys_var* settings[] = { MYSQL_SYSVAR(url), MYSQL_SYSVAR(send_timeout), MYSQL_SYSVAR(send_retry_wait), + MYSQL_SYSVAR(http_proxy), NULL }; diff --git a/plugin/feedback/feedback.h b/plugin/feedback/feedback.h index c2091afdedc..6c4794e451b 100644 --- a/plugin/feedback/feedback.h +++ b/plugin/feedback/feedback.h @@ -52,8 +52,14 @@ class Url { const char *url() { return full_url.str; } size_t url_length() { return full_url.length; } virtual int send(const char* data, size_t data_length) = 0; + virtual int set_proxy(const char *proxy, size_t proxy_len) + { + return 0; + } static Url* create(const char *url, size_t url_length); + static int parse_proxy_server(const char *proxy_server, size_t proxy_length, + LEX_STRING *host, LEX_STRING *port); }; extern Url **urls; diff --git a/plugin/feedback/url_base.cc b/plugin/feedback/url_base.cc index e7d038f02e2..927183fea57 100644 --- a/plugin/feedback/url_base.cc +++ b/plugin/feedback/url_base.cc @@ -48,4 +48,50 @@ Url* Url::create(const char *url, size_t url_length) return self; } + +int Url::parse_proxy_server(const char *proxy_server, size_t proxy_length, + LEX_STRING *host, LEX_STRING *port) +{ + const char *s; + + host->length= 0; + if (proxy_server == NULL) + return 0; + + for (; proxy_length > 0 && isspace(*proxy_server); + proxy_server++, proxy_length--) /* no-op */; + + if (proxy_length == 0) + return 0; + + for (s=proxy_server; *s && *s != ':'; s++) /* no-op */; + + host->str= const_cast<char*>(proxy_server); + if ((host->length= s-proxy_server) == 0) + return 0; + + port->length= 0; + + if (*s == ':') + { + s++; + port->str= const_cast<char*>(s); + while (*s >= '0' && *s <= '9') + { + s++; + port->length++; + } + } + + if (port->length == 0) + { + port->str= const_cast<char*>("80"); + port->length= 2; + } + + host->str= my_strndup(host->str, host->length, MYF(MY_WME)); + port->str= my_strndup(port->str, port->length, MYF(MY_WME)); + return 0; +} + } // namespace feedback diff --git a/plugin/feedback/url_http.cc b/plugin/feedback/url_http.cc index f214f7a6ccc..d04ff6fa9d5 100644 --- a/plugin/feedback/url_http.cc +++ b/plugin/feedback/url_http.cc @@ -38,20 +38,39 @@ class Url_http: public Url { protected: const LEX_STRING host, port, path; bool ssl; + LEX_STRING proxy_host, proxy_port; + + int use_proxy() + { + return proxy_host.length; + } Url_http(LEX_STRING &url_arg, LEX_STRING &host_arg, LEX_STRING &port_arg, LEX_STRING &path_arg, bool ssl_arg) : Url(url_arg), host(host_arg), port(port_arg), path(path_arg), ssl(ssl_arg) - {} + { + proxy_host.length= 0; + } ~Url_http() { my_free(host.str); my_free(port.str); my_free(path.str); + set_proxy(0,0); } public: int send(const char* data, size_t data_length); + int set_proxy(const char *proxy, size_t proxy_len) + { + if (use_proxy()) + { + my_free(proxy_host.str); + my_free(proxy_port.str); + } + + return parse_proxy_server(proxy, proxy_len, &proxy_host, &proxy_port); + } friend Url* http_create(const char *url, size_t url_length); }; @@ -150,7 +169,9 @@ int Url_http::send(const char* data, size_t data_length) uint len= 0; addrinfo *addrs, *addr, filter= {0, AF_UNSPEC, SOCK_STREAM, 6, 0, 0, 0, 0}; - int res= getaddrinfo(host.str, port.str, &filter, &addrs); + int res= use_proxy() ? + getaddrinfo(proxy_host.str, proxy_port.str, &filter, &addrs) : + getaddrinfo(host.str, port.str, &filter, &addrs); if (res) { @@ -228,16 +249,20 @@ int Url_http::send(const char* data, size_t data_length) }; len= my_snprintf(buf, sizeof(buf), - "POST %s HTTP/1.0\r\n" - "User-Agent: MariaDB User Feedback Plugin\r\n" - "Host: %s:%s\r\n" - "Accept: */*\r\n" - "Content-Length: %u\r\n" - "Content-Type: multipart/form-data; boundary=%s\r\n" - "\r\n", - path.str, host.str, port.str, - (uint)(2*boundary.length + header.length + data_length + 4), - boundary.str + 2); + use_proxy() ? "POST http://%s:%s/" : "POST ", + host.str, port.str); + + len+= my_snprintf(buf+len, sizeof(buf)-len, + "%s HTTP/1.0\r\n" + "User-Agent: MariaDB User Feedback Plugin\r\n" + "Host: %s:%s\r\n" + "Accept: */*\r\n" + "Content-Length: %u\r\n" + "Content-Type: multipart/form-data; boundary=%s\r\n" + "\r\n", + path.str, host.str, port.str, + (uint)(2*boundary.length + header.length + data_length + 4), + boundary.str + 2); vio_timeout(vio, FOR_READING, send_timeout); vio_timeout(vio, FOR_WRITING, send_timeout); |