diff options
author | Sergei Golubchik <serg@mariadb.org> | 2016-02-15 22:50:59 +0100 |
---|---|---|
committer | Sergei Golubchik <serg@mariadb.org> | 2016-02-15 22:50:59 +0100 |
commit | 271fed41061e25faa47b7a28108cf101ebb3551d (patch) | |
tree | 733bf84d468a1d47c71c87cfcee33098a090e3c5 /plugin | |
parent | ff26d93a8c25d667709180ad13a090309631990d (diff) | |
parent | e1385f2083f782d7064db3c0059fcca45bfcb2a4 (diff) | |
download | mariadb-git-271fed41061e25faa47b7a28108cf101ebb3551d.tar.gz |
Merge branch '5.5' into 10.0
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 | ||||
-rw-r--r-- | plugin/semisync/semisync_master.cc | 4 | ||||
-rw-r--r-- | plugin/server_audit/server_audit.c | 12 |
6 files changed, 109 insertions, 19 deletions
diff --git a/plugin/feedback/feedback.cc b/plugin/feedback/feedback.cc index de7b2c9060b..b9ab3563125 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; @@ -285,7 +285,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) @@ -363,6 +369,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, @@ -382,6 +391,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 2cfbeed4eb5..bb3f896288d 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..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 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); diff --git a/plugin/semisync/semisync_master.cc b/plugin/semisync/semisync_master.cc index af5eb9d090d..12415484b82 100644 --- a/plugin/semisync/semisync_master.cc +++ b/plugin/semisync/semisync_master.cc @@ -1,6 +1,6 @@ /* Copyright (C) 2007 Google Inc. - Copyright (c) 2008 MySQL AB, 2008-2009 Sun Microsystems, Inc. - Use is subject to license terms. + Copyright (c) 2008, 2013, Oracle and/or its affiliates. + Copyright (c) 2011, 2016, MariaDB This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/plugin/server_audit/server_audit.c b/plugin/server_audit/server_audit.c index d988f7e8317..30b7cdb5dcb 100644 --- a/plugin/server_audit/server_audit.c +++ b/plugin/server_audit/server_audit.c @@ -537,10 +537,14 @@ static struct st_mysql_show_var audit_status[]= #if defined(HAVE_PSI_INTERFACE) && !defined(FLOGGER_NO_PSI) /* These belong to the service initialization */ static PSI_mutex_key key_LOCK_operations; +static PSI_mutex_key key_LOCK_bigbuffer; static PSI_mutex_info mutex_key_list[]= -{{ &key_LOCK_operations, "SERVER_AUDIT_plugin::lock_operations", -{{ &key_LOCK_bigbuffer, "SERVER_AUDIT_plugin::lock_bigbuffer", - PSI_FLAG_GLOBAL}}; +{ + { &key_LOCK_operations, "SERVER_AUDIT_plugin::lock_operations", + PSI_FLAG_GLOBAL}, + { &key_LOCK_bigbuffer, "SERVER_AUDIT_plugin::lock_bigbuffer", + PSI_FLAG_GLOBAL} +}; #endif static mysql_mutex_t lock_operations; static mysql_mutex_t lock_bigbuffer; @@ -2845,7 +2849,7 @@ void __attribute__ ((constructor)) audit_plugin_so_init(void) } memset(locinfo_ini_value, 'O', sizeof(locinfo_ini_value)-1); - locinfo_ini_value[sizeof(locinfo_ini_value)]= 0; + locinfo_ini_value[sizeof(locinfo_ini_value)-1]= 0; exit: #ifdef _WIN32 |