mirror of
https://github.com/MariaDB/server.git
synced 2025-07-27 18:02:13 +03:00
MDEV-9438 backport feedback-http-proxy to 5.5 and 10.0.
The http-proxy option to the FEEDBACK plugin backported.
This commit is contained in:
@ -8,6 +8,7 @@ select * from information_schema.feedback where variable_name like 'feed%'
|
|||||||
VARIABLE_NAME VARIABLE_VALUE
|
VARIABLE_NAME VARIABLE_VALUE
|
||||||
FEEDBACK used 1
|
FEEDBACK used 1
|
||||||
FEEDBACK version 1.1
|
FEEDBACK version 1.1
|
||||||
|
FEEDBACK_HTTP_PROXY
|
||||||
FEEDBACK_SEND_RETRY_WAIT 60
|
FEEDBACK_SEND_RETRY_WAIT 60
|
||||||
FEEDBACK_SEND_TIMEOUT 60
|
FEEDBACK_SEND_TIMEOUT 60
|
||||||
FEEDBACK_URL http://mariadb.org/feedback_plugin/post
|
FEEDBACK_URL http://mariadb.org/feedback_plugin/post
|
||||||
|
@ -10,6 +10,7 @@ select * from information_schema.feedback where variable_name like 'feed%'
|
|||||||
and variable_name not like '%debug%';
|
and variable_name not like '%debug%';
|
||||||
VARIABLE_NAME VARIABLE_VALUE
|
VARIABLE_NAME VARIABLE_VALUE
|
||||||
FEEDBACK version 1.1
|
FEEDBACK version 1.1
|
||||||
|
FEEDBACK_HTTP_PROXY
|
||||||
FEEDBACK_SEND_RETRY_WAIT 60
|
FEEDBACK_SEND_RETRY_WAIT 60
|
||||||
FEEDBACK_SEND_TIMEOUT 60
|
FEEDBACK_SEND_TIMEOUT 60
|
||||||
FEEDBACK_URL http://mariadb.org/feedback_plugin/post
|
FEEDBACK_URL http://mariadb.org/feedback_plugin/post
|
||||||
|
@ -10,6 +10,7 @@ select * from information_schema.feedback where variable_name like 'feed%'
|
|||||||
and variable_name not like '%debug%';
|
and variable_name not like '%debug%';
|
||||||
VARIABLE_NAME VARIABLE_VALUE
|
VARIABLE_NAME VARIABLE_VALUE
|
||||||
FEEDBACK version 1.1
|
FEEDBACK version 1.1
|
||||||
|
FEEDBACK_HTTP_PROXY
|
||||||
FEEDBACK_SEND_RETRY_WAIT 60
|
FEEDBACK_SEND_RETRY_WAIT 60
|
||||||
FEEDBACK_SEND_TIMEOUT 60
|
FEEDBACK_SEND_TIMEOUT 60
|
||||||
FEEDBACK_URL http://mariadb.org/feedback_plugin/post
|
FEEDBACK_URL http://mariadb.org/feedback_plugin/post
|
||||||
|
@ -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
|
char server_uid_buf[SERVER_UID_SIZE+1]; ///< server uid will be written here
|
||||||
|
|
||||||
/* backing store for system variables */
|
/* 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;
|
char *user_info;
|
||||||
ulong send_timeout, send_retry_wait;
|
ulong send_timeout, send_retry_wait;
|
||||||
|
|
||||||
@ -284,7 +284,13 @@ static int init(void *p)
|
|||||||
if (*e == 0 || *e == ' ')
|
if (*e == 0 || *e == ' ')
|
||||||
{
|
{
|
||||||
if (e > s && (urls[slot]= Url::create(s, e - s)))
|
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++;
|
slot++;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (e > s)
|
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,
|
static MYSQL_SYSVAR_ULONG(send_retry_wait, send_retry_wait, PLUGIN_VAR_RQCMDARG,
|
||||||
"Wait this many seconds before retrying a failed send.",
|
"Wait this many seconds before retrying a failed send.",
|
||||||
NULL, NULL, 60, 1, 60*60*24, 1);
|
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
|
#ifndef DBUG_OFF
|
||||||
static MYSQL_SYSVAR_ULONG(debug_startup_interval, debug_startup_interval,
|
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(url),
|
||||||
MYSQL_SYSVAR(send_timeout),
|
MYSQL_SYSVAR(send_timeout),
|
||||||
MYSQL_SYSVAR(send_retry_wait),
|
MYSQL_SYSVAR(send_retry_wait),
|
||||||
|
MYSQL_SYSVAR(http_proxy),
|
||||||
#ifndef DBUG_OFF
|
#ifndef DBUG_OFF
|
||||||
MYSQL_SYSVAR(debug_startup_interval),
|
MYSQL_SYSVAR(debug_startup_interval),
|
||||||
MYSQL_SYSVAR(debug_first_interval),
|
MYSQL_SYSVAR(debug_first_interval),
|
||||||
|
@ -51,8 +51,14 @@ class Url {
|
|||||||
const char *url() { return full_url.str; }
|
const char *url() { return full_url.str; }
|
||||||
size_t url_length() { return full_url.length; }
|
size_t url_length() { return full_url.length; }
|
||||||
virtual int send(const char* data, size_t data_length) = 0;
|
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 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;
|
extern Url **urls;
|
||||||
|
@ -48,4 +48,49 @@ Url* Url::create(const char *url, size_t url_length)
|
|||||||
return self;
|
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
|
} // namespace feedback
|
||||||
|
@ -38,20 +38,39 @@ class Url_http: public Url {
|
|||||||
protected:
|
protected:
|
||||||
const LEX_STRING host, port, path;
|
const LEX_STRING host, port, path;
|
||||||
bool ssl;
|
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,
|
Url_http(LEX_STRING &url_arg, LEX_STRING &host_arg,
|
||||||
LEX_STRING &port_arg, LEX_STRING &path_arg, bool ssl_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)
|
Url(url_arg), host(host_arg), port(port_arg), path(path_arg), ssl(ssl_arg)
|
||||||
{}
|
{
|
||||||
|
proxy_host.length= 0;
|
||||||
|
}
|
||||||
~Url_http()
|
~Url_http()
|
||||||
{
|
{
|
||||||
my_free(host.str);
|
my_free(host.str);
|
||||||
my_free(port.str);
|
my_free(port.str);
|
||||||
my_free(path.str);
|
my_free(path.str);
|
||||||
|
set_proxy(0,0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
int send(const char* data, size_t data_length);
|
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);
|
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;
|
uint len= 0;
|
||||||
|
|
||||||
addrinfo *addrs, *addr, filter= {0, AF_UNSPEC, SOCK_STREAM, 6, 0, 0, 0, 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)
|
if (res)
|
||||||
{
|
{
|
||||||
@ -228,16 +249,20 @@ int Url_http::send(const char* data, size_t data_length)
|
|||||||
};
|
};
|
||||||
|
|
||||||
len= my_snprintf(buf, sizeof(buf),
|
len= my_snprintf(buf, sizeof(buf),
|
||||||
"POST %s HTTP/1.0\r\n"
|
use_proxy() ? "POST http://%s:%s/" : "POST ",
|
||||||
"User-Agent: MariaDB User Feedback Plugin\r\n"
|
host.str, port.str);
|
||||||
"Host: %s:%s\r\n"
|
|
||||||
"Accept: */*\r\n"
|
len+= my_snprintf(buf+len, sizeof(buf)-len,
|
||||||
"Content-Length: %u\r\n"
|
"%s HTTP/1.0\r\n"
|
||||||
"Content-Type: multipart/form-data; boundary=%s\r\n"
|
"User-Agent: MariaDB User Feedback Plugin\r\n"
|
||||||
"\r\n",
|
"Host: %s:%s\r\n"
|
||||||
path.str, host.str, port.str,
|
"Accept: */*\r\n"
|
||||||
(uint)(2*boundary.length + header.length + data_length + 4),
|
"Content-Length: %u\r\n"
|
||||||
boundary.str + 2);
|
"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_READING, send_timeout);
|
||||||
vio_timeout(vio, FOR_WRITING, send_timeout);
|
vio_timeout(vio, FOR_WRITING, send_timeout);
|
||||||
|
Reference in New Issue
Block a user