blob: 6de41d3a31b77a558773bbb73f5369e00ca0fef1 [file] [log] [blame]
/* Copyright 2016 The Android Open Source Project
**
** This software is licensed under the terms of the GNU General Public
** License version 2, as published by the Free Software Foundation, and
** may be copied, distributed, and modified under those terms.
**
** 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.
*/
#include "android/proxy/proxy_setup.h"
#include "android/proxy/ProxyUtils.h"
#include "android/proxy/proxy_common.h"
#include "android/proxy/proxy_http.h"
#include "android/utils/debug.h"
#include <errno.h>
#include <string.h>
bool android_http_proxy_setup(const char* http_proxy, bool verbose) {
if (!http_proxy) {
VERBOSE_DPRINT(init, "Not using any http proxy");
return true;
}
// Parse the configuration string first.
android::proxy::ParseResult result =
android::proxy::parseConfigurationString(http_proxy);
if (result.mError) {
dwarning("Ignoring invalid http proxy: %s", result.mError->c_str());
return false;
}
if (verbose) {
proxy_set_verbose(1);
}
std::string proxy = result.mServerAddress.toString();
int proxyPort = result.mServerPort;
VERBOSE_DPRINT(init, "setting up http proxy: proxy=%s port=%d",
proxy.c_str(), proxyPort);
/* Check that we can connect to the proxy in the next second.
* If not, the proxy setting is probably garbage !!
*/
if (proxy_check_connection(proxy.c_str(), proxy.size(), proxyPort, 1000) <
0) {
dwarning("Could not connect to proxy at %s:%d: %s !", proxy.c_str(),
proxyPort, strerror(errno));
dwarning("Proxy will be ignored !");
return false;
}
ProxyOption option_tab[2] = {};
ProxyOption* option = option_tab;
if (result.mUsername) {
option->type = PROXY_OPTION_AUTH_USERNAME;
option->string = result.mUsername->c_str();
option->string_len = result.mUsername->size();
option++;
}
if (result.mPassword) {
option->type = PROXY_OPTION_AUTH_PASSWORD;
option->string = result.mPassword->c_str();
option->string_len = result.mPassword->size();
option++;
}
if (proxy_http_setup(proxy.c_str(), proxy.size(), proxyPort,
option - option_tab, option_tab) < 0) {
dwarning("Http proxy setup failed for '%s:%d': %s", proxy.c_str(),
proxyPort, errno_str);
dwarning("Proxy will be ignored !");
return false;
}
return true;
}