diff --git a/src/http.cpp b/src/http.cpp
index a022b5e..628ed34 100644
--- a/src/http.cpp
+++ b/src/http.cpp
@@ -14,10 +14,10 @@
* along with this program. If not, see .
*/
-#include
#include
#include
#include
+#include
#include
#include
#include
@@ -35,6 +35,9 @@ using std::endl;
using std::istream;
using std::unique_ptr;
using std::make_unique;
+using std::regex;
+using std::regex_search;
+using std::smatch;
using Poco::Net::HTTPClientSession;
using Poco::Net::HTTPSClientSession;
using Poco::Net::HTTPRequest;
@@ -47,31 +50,21 @@ void set_proxy()
{
try
{
- HTTPClientSession::ProxyConfig proxy;
- string proxy_env = Environment::get("http_proxy");
- size_t pos;
+ HTTPSClientSession::ProxyConfig proxyconfig;
+ string env_proxy = Environment::get("http_proxy");
+ regex re_proxy("^(?:https?://)?(?:([^:]+):?([^@]*)@)?" // user:password
+ "([^:]+):([[:digit:]]+/?)"); // host:port
+ smatch match;
- // Only keep text between // and /.
- if ((pos = proxy_env.find("//")) != string::npos)
+ if (regex_search(env_proxy, match, re_proxy))
{
- proxy_env = proxy_env.substr(pos + 2);
- }
- if ((pos = proxy_env.find('/')) != string::npos)
- {
- proxy_env = proxy_env.substr(0, pos);
- }
+ proxyconfig.host = match[3].str();
+ proxyconfig.port = std::stoi(match[4].str());
+ proxyconfig.username = match[1].str();
+ proxyconfig.password = match[2].str();
- if ((pos = proxy_env.find(':')) != string::npos)
- {
- proxy.host = proxy_env.substr(0, pos);
- proxy.port = std::stoi(proxy_env.substr(pos + 1));
+ HTTPSClientSession::setGlobalProxyConfig(proxyconfig);
}
- else
- {
- proxy.host = proxy_env;
- }
-
- HTTPClientSession::setGlobalProxyConfig(proxy);
}
catch (const std::exception &)
{