You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
322 lines
7.5 KiB
322 lines
7.5 KiB
1 year ago
|
/*
|
||
|
** Zabbix
|
||
|
** Copyright (C) 2001-2023 Zabbix SIA
|
||
|
**
|
||
|
** 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
|
||
|
** the Free Software Foundation; either version 2 of the License, or
|
||
|
** (at your option) any later version.
|
||
|
**
|
||
|
** This program is distributed in the hope that it will be useful,
|
||
|
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
** GNU General Public License for more details.
|
||
|
**
|
||
|
** You should have received a copy of the GNU General Public License
|
||
|
** along with this program; if not, write to the Free Software
|
||
|
** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||
|
**/
|
||
|
|
||
|
/**
|
||
|
* WARNING: the class doesn't support parsing query strings with multi-dimensional arrays.
|
||
|
*
|
||
|
* @param url
|
||
|
*/
|
||
|
var Curl = function(url) {
|
||
|
url = url || location.href;
|
||
|
|
||
|
this.url = url;
|
||
|
this.args = {};
|
||
|
|
||
|
this.query = (this.url.indexOf('?') >= 0) ? this.url.substring(this.url.indexOf('?') + 1) : '';
|
||
|
if (this.query.indexOf('#') >= 0) {
|
||
|
this.query = this.query.substring(0, this.query.indexOf('#'));
|
||
|
}
|
||
|
|
||
|
var protocolSepIndex = this.url.indexOf('://');
|
||
|
if (protocolSepIndex >= 0) {
|
||
|
this.protocol = this.url.substring(0, protocolSepIndex).toLowerCase();
|
||
|
this.host = this.url.substring(protocolSepIndex + 3);
|
||
|
|
||
|
if (this.host.indexOf('/') >= 0) {
|
||
|
this.host = this.host.substring(0, this.host.indexOf('/'));
|
||
|
}
|
||
|
|
||
|
var atIndex = this.host.indexOf('@');
|
||
|
if (atIndex >= 0) {
|
||
|
var credentials = this.host.substring(0, atIndex);
|
||
|
var colonIndex = credentials.indexOf(':');
|
||
|
|
||
|
if (colonIndex >= 0) {
|
||
|
this.username = credentials.substring(0, colonIndex);
|
||
|
this.password = credentials.substring(colonIndex);
|
||
|
}
|
||
|
else {
|
||
|
this.username = credentials;
|
||
|
}
|
||
|
this.host = this.host.substring(atIndex + 1);
|
||
|
}
|
||
|
|
||
|
var host_ipv6 = this.host.indexOf(']');
|
||
|
if (host_ipv6 >= 0) {
|
||
|
if (host_ipv6 < (this.host.length - 1)) {
|
||
|
host_ipv6++;
|
||
|
var host_less = this.host.substring(host_ipv6);
|
||
|
|
||
|
var portColonIndex = host_less.indexOf(':');
|
||
|
if (portColonIndex >= 0) {
|
||
|
this.port = host_less.substring(portColonIndex + 1);
|
||
|
this.host = this.host.substring(0, host_ipv6);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
var portColonIndex = this.host.indexOf(':');
|
||
|
if (portColonIndex >= 0) {
|
||
|
this.port = this.host.substring(portColonIndex + 1);
|
||
|
this.host = this.host.substring(0, portColonIndex);
|
||
|
}
|
||
|
}
|
||
|
this.file = this.url.substring(protocolSepIndex + 3);
|
||
|
this.file = this.file.substring(this.file.indexOf('/'));
|
||
|
|
||
|
if (this.file == this.host) {
|
||
|
this.file = '';
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
this.file = this.url;
|
||
|
}
|
||
|
|
||
|
if (this.file.indexOf('?') >= 0) {
|
||
|
this.file = this.file.substring(0, this.file.indexOf('?'));
|
||
|
}
|
||
|
|
||
|
var refSepIndex = this.file.indexOf('#');
|
||
|
if (refSepIndex >= 0) {
|
||
|
this.reference = this.file.substring(refSepIndex + 1);
|
||
|
this.file = this.file.substring(0, refSepIndex);
|
||
|
}
|
||
|
|
||
|
this.path = this.file;
|
||
|
if (this.query.length > 0) {
|
||
|
this.file += '?' + this.query;
|
||
|
}
|
||
|
if (this.query.length > 0) {
|
||
|
this.formatArguments();
|
||
|
}
|
||
|
};
|
||
|
|
||
|
Curl.prototype = {
|
||
|
|
||
|
url: '', // actually, it's deprecated/private variable
|
||
|
port: -1,
|
||
|
host: '',
|
||
|
protocol: '',
|
||
|
username: '',
|
||
|
password: '',
|
||
|
file: '',
|
||
|
reference: '',
|
||
|
path: '',
|
||
|
query: '',
|
||
|
args: null,
|
||
|
|
||
|
formatQuery: function() {
|
||
|
this.query = jQuery.param(this.args);
|
||
|
},
|
||
|
|
||
|
formatArguments: function() {
|
||
|
this.args = {};
|
||
|
var args = this.query.split('&');
|
||
|
|
||
|
if (args.length < 1) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
var keyval = '',
|
||
|
array_values = {};
|
||
|
|
||
|
for (var i = 0; i < args.length; i++) {
|
||
|
keyval = args[i].split('=');
|
||
|
|
||
|
if (keyval.length > 1) {
|
||
|
try {
|
||
|
var tmp = keyval[1].replace(/\+/g, '%20');
|
||
|
keyval[0] = decodeURIComponent(keyval[0]);
|
||
|
var matches = keyval[0].match(/(.*)\[\]$/);
|
||
|
|
||
|
// Find all parameters with non-indexed arrays like "groupids[]" and store them for later use.
|
||
|
if (matches) {
|
||
|
if (!(matches[1] in array_values)) {
|
||
|
array_values[matches[1]] = [];
|
||
|
}
|
||
|
|
||
|
array_values[matches[1]].push(decodeURIComponent(tmp));
|
||
|
}
|
||
|
else {
|
||
|
this.args[keyval[0]] = decodeURIComponent(tmp);
|
||
|
}
|
||
|
}
|
||
|
catch(exc) {
|
||
|
this.args[keyval[0]] = keyval[1];
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
this.args[keyval[0]] = '';
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Set non-indexed array parameters with values.
|
||
|
for (var key in array_values) {
|
||
|
this.setArgument(key, array_values[key]);
|
||
|
}
|
||
|
},
|
||
|
|
||
|
setArgument: function(key, value) {
|
||
|
this.args[key] = value;
|
||
|
this.formatQuery();
|
||
|
},
|
||
|
|
||
|
unsetArgument: function(key) {
|
||
|
delete(this.args[key]);
|
||
|
this.formatQuery();
|
||
|
},
|
||
|
|
||
|
getArgument: function(key) {
|
||
|
if (typeof(this.args[key]) != 'undefined') {
|
||
|
return this.args[key];
|
||
|
}
|
||
|
else {
|
||
|
return null;
|
||
|
}
|
||
|
},
|
||
|
|
||
|
getArguments: function() {
|
||
|
return this.args;
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* Get query parameters as javascript object, support indexed names up to 3 levels only.
|
||
|
*/
|
||
|
getArgumentsObject: function() {
|
||
|
let result = {},
|
||
|
parts;
|
||
|
|
||
|
for (const name in this.args) {
|
||
|
parts = name.replace(/\]/g, '').split('[');
|
||
|
|
||
|
switch (parts.length) {
|
||
|
case 1:
|
||
|
result[name] = this.args[name];
|
||
|
break;
|
||
|
|
||
|
case 2:
|
||
|
// name[0]
|
||
|
if (!(parts[0] in result)) {
|
||
|
result[parts[0]] = [];
|
||
|
}
|
||
|
|
||
|
result[parts[0]][parts[1]] = this.args[name];
|
||
|
break;
|
||
|
|
||
|
case 3:
|
||
|
// name[0][property]
|
||
|
if (!(parts[0] in result)) {
|
||
|
result[parts[0]] = [];
|
||
|
}
|
||
|
|
||
|
if (!(parts[1] in result[parts[0]])) {
|
||
|
result[parts[0]][parts[1]] = {}
|
||
|
}
|
||
|
|
||
|
result[parts[0]][parts[1]][parts[2]] = this.args[name];
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return result;
|
||
|
},
|
||
|
|
||
|
getUrl: function() {
|
||
|
this.formatQuery();
|
||
|
|
||
|
var url = this.protocol.length > 0 ? this.protocol + '://' : '';
|
||
|
url += this.username.length > 0 ? encodeURI(this.username) : '';
|
||
|
url += this.password.length > 0 ? encodeURI(':' + this.password) : '';
|
||
|
url += this.host.length > 0 ? this.host : '';
|
||
|
url += this.port.length > 0 ? ':' + this.port : '';
|
||
|
url += this.path.length > 0 ? encodeURI(this.path) : '';
|
||
|
url += this.query.length > 0 ? '?' + this.query : '';
|
||
|
url += this.reference.length > 0 ? encodeURI('#' + this.reference) : '';
|
||
|
|
||
|
return url;
|
||
|
},
|
||
|
|
||
|
setPort: function(port) {
|
||
|
this.port = port;
|
||
|
},
|
||
|
|
||
|
getPort: function() {
|
||
|
return this.port;
|
||
|
},
|
||
|
|
||
|
// returns the protocol of this url, i.e. 'http' in the url 'http://server/'
|
||
|
getProtocol: function() {
|
||
|
return this.protocol;
|
||
|
},
|
||
|
|
||
|
setProtocol: function(protocol) {
|
||
|
this.protocol = protocol;
|
||
|
},
|
||
|
|
||
|
// returns the host name of this url, i.e. 'server.com' in the url 'http://server.com/'
|
||
|
getHost: function() {
|
||
|
return this.host;
|
||
|
},
|
||
|
|
||
|
setHost: function(host) {
|
||
|
this.host = host;
|
||
|
},
|
||
|
|
||
|
// returns the user name part of this url, i.e. 'joe' in the url 'http://joe@server.com/'
|
||
|
getUserName: function() {
|
||
|
return this.username;
|
||
|
},
|
||
|
|
||
|
setUserName: function(username) {
|
||
|
this.username = username;
|
||
|
},
|
||
|
|
||
|
// returns the password part of this url, i.e. 'secret' in the url 'http://joe:secret@server.com/'
|
||
|
getPassword: function() {
|
||
|
return this.password;
|
||
|
},
|
||
|
|
||
|
setPassword: function(password) {
|
||
|
this.password = password;
|
||
|
},
|
||
|
|
||
|
// returns the file part of this url, i.e. everything after the host name.
|
||
|
getFile: function() {
|
||
|
return this.file;
|
||
|
},
|
||
|
|
||
|
// returns the reference of this url, i.e. 'bookmark' in the url 'http://server/file.html#bookmark'
|
||
|
getReference: function() {
|
||
|
return this.reference;
|
||
|
},
|
||
|
|
||
|
setReference: function(reference) {
|
||
|
this.reference = reference;
|
||
|
},
|
||
|
|
||
|
// returns the file path of this url, i.e. '/dir/file.html' in the url 'http://server/dir/file.html'
|
||
|
getPath: function() {
|
||
|
return this.path;
|
||
|
},
|
||
|
|
||
|
setPath: function(path) {
|
||
|
this.path = path;
|
||
|
}
|
||
|
};
|