diff options
author | Alexey Botchkov <holyfoot@askmonty.org> | 2016-02-09 05:17:41 +0400 |
---|---|---|
committer | Alexey Botchkov <holyfoot@askmonty.org> | 2016-02-09 05:19:56 +0400 |
commit | ea0c3fc87b6964db63f328b1567a06f21042c5d1 (patch) | |
tree | 26c4402f0016fb56d1deeca8b51f1eba8fd6502e /plugin | |
parent | b17a4350696c646e4bc6154a27eeddf363cd39c7 (diff) | |
download | mariadb-git-ea0c3fc87b6964db63f328b1567a06f21042c5d1.tar.gz |
MDEV-9438 backport feedback-http-proxy to 5.5 and 10.0.
The http-proxy option to the FEEDBACK plugin backported.
Diffstat (limited to 'plugin')
-rw-r--r-- | plugin/feedback/feedback.cc | 12 | ||||
-rw-r--r-- | plugin/feedback/feedback.h | 6 | ||||
-rw-r--r-- | plugin/feedback/url_base.cc | 45 | ||||
-rw-r--r-- | plugin/feedback/url_http.cc | 49 |
4 files changed, 99 insertions, 13 deletions
diff --git a/plugin/feedback/feedback.cc b/plugin/feedback/feedback.cc index a06c0e6c496..79436bd5268 100644 --- a/plugin/feedback/feedback.cc +++ b/plugin/feedback/feedback.cc @@ -29,7 +29,7 @@ ulong debug_startup_interval, debug_first_interval, debug_interval; 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; @@ -284,7 +284,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) @@ -362,6 +368,9 @@ 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); #ifndef DBUG_OFF static MYSQL_SYSVAR_ULONG(debug_startup_interval, debug_startup_interval, @@ -381,6 +390,7 @@ static struct st_mysql_sys_var* settings[] = { MYSQL_SYSVAR(url), MYSQL_SYSVAR(send_timeout), MYSQL_SYSVAR(send_retry_wait), + MYSQL_SYSVAR(http_proxy), #ifndef DBUG_OFF MYSQL_SYSVAR(debug_startup_interval), MYSQL_SYSVAR(debug_first_interval), diff --git a/plugin/feedback/feedback.h b/plugin/feedback/feedback.h index 98939c29d34..0542b7399f1 100644 --- a/plugin/feedback/feedback.h +++ b/plugin/feedback/feedback.h @@ -51,8 +51,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..6afbcd7c8f4 100644 --- a/plugin/feedback/url_base.cc +++ b/plugin/feedback/url_base.cc @@ -48,4 +48,49 @@ 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 && my_isspace(system_charset_info, *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 dd39adbf7a7..dff5da56a4f 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); |