This one probably isn't ready to apply as-is, but it's working for me
right now. Problems include:
- it should have proper CMake magic to find and build against (and
optionally *not* build against) libproxy.
- it probably shouldn't unconditionally subvert the old code which
looks in /etc/sysconfig/proxy for per-url-scheme information.
- There's a memory leak when we return a proxy specified by libproxy.
I figured that all of those were probably best handled by someone who
knows the code (or just knows CMake/C++) better than me.
---
zypp/CMakeLists.txt | 3 +
zypp/media/MediaCurl.cc | 2 +-
zypp/media/proxyinfo/ProxyInfoLibproxy.cc | 87 +++++++++++++++++++++++++++++
zypp/media/proxyinfo/ProxyInfoLibproxy.h | 57 +++++++++++++++++++
zypp/media/proxyinfo/ProxyInfos.h | 1 +
5 files changed, 149 insertions(+), 1 deletions(-)
create mode 100644 zypp/media/proxyinfo/ProxyInfoLibproxy.cc
create mode 100644 zypp/media/proxyinfo/ProxyInfoLibproxy.h
diff --git a/zypp/CMakeLists.txt b/zypp/CMakeLists.txt
index d4f4682..796968f 100644
--- a/zypp/CMakeLists.txt
+++ b/zypp/CMakeLists.txt
@@ -326,11 +326,13 @@ INSTALL( FILES
SET( zypp_media_proxyinfo_SRCS
media/proxyinfo/ProxyInfoSysconfig.cc
+ media/proxyinfo/ProxyInfoLibproxy.cc
)
SET( zypp_media_proxyinfo_HEADERS
media/proxyinfo/ProxyInfoImpl.h
media/proxyinfo/ProxyInfoSysconfig.h
+ media/proxyinfo/ProxyInfoLibproxy.h
media/proxyinfo/ProxyInfos.h
)
@@ -912,6 +914,7 @@ TARGET_LINK_LIBRARIES(zypp ${OPENSSL_LIBRARIES} )
TARGET_LINK_LIBRARIES(zypp ${CRYPTO_LIBRARIES} )
TARGET_LINK_LIBRARIES(zypp ${SIGNALS_LIBRARY} )
TARGET_LINK_LIBRARIES(zypp ${UDEV_LIBRARY} )
+TARGET_LINK_LIBRARIES(zypp -lproxy )
INSTALL(TARGETS zypp LIBRARY DESTINATION ${LIB_INSTALL_DIR} )
diff --git a/zypp/media/MediaCurl.cc b/zypp/media/MediaCurl.cc
index bf06908..b0c6635 100644
--- a/zypp/media/MediaCurl.cc
+++ b/zypp/media/MediaCurl.cc
@@ -326,7 +326,7 @@ void fillSettingsFromUrl( const Url &url, TransferSettings &s )
*/
void fillSettingsSystemProxy( const Url&url, TransferSettings &s )
{
- ProxyInfo proxy_info (ProxyInfo::ImplPtr(new ProxyInfoSysconfig("proxy")));
+ ProxyInfo proxy_info (ProxyInfo::ImplPtr(new ProxyInfoLibproxy()));
s.setProxyEnabled( proxy_info.useProxyFor( url ) );
if ( s.proxyEnabled() )
s.setProxy(proxy_info.proxy(url));
diff --git a/zypp/media/proxyinfo/ProxyInfoLibproxy.cc b/zypp/media/proxyinfo/ProxyInfoLibproxy.cc
new file mode 100644
index 0000000..ef7bdac
--- /dev/null
+++ b/zypp/media/proxyinfo/ProxyInfoLibproxy.cc
@@ -0,0 +1,87 @@
+/*---------------------------------------------------------------------\
+| ____ _ __ __ ___ |
+| |__ / \ / / . \ . \ |
+| / / \ V /| _/ _/ |
+| / /__ | | | | | | |
+| /_____||_| |_| |_| |
+| |
+\---------------------------------------------------------------------*/
+/** \file zypp/media/proxyinfo/ProxyInfoLibproxy.cc
+ *
+*/
+
+#include <iostream>
+#include <fstream>
+
+#include "zypp/base/Logger.h"
+#include "zypp/base/String.h"
+#include "zypp/Pathname.h"
+
+#include "zypp/media/proxyinfo/ProxyInfoLibproxy.h"
+
+using namespace std;
+using namespace zypp::base;
+
+namespace zypp {
+ namespace media {
+
+ ProxyInfoLibproxy::ProxyInfoLibproxy()
+ : ProxyInfo::Impl()
+ {
+ _factory = px_proxy_factory_new();
+ _enabled = !(_factory == NULL);
+ }
+
+ ProxyInfoLibproxy::~ProxyInfoLibproxy()
+ {
+ if (_enabled) {
+ px_proxy_factory_free(_factory);
+ _factory = NULL;
+ _enabled = false;
+ }
+ }
+
+ std::string ProxyInfoLibproxy::proxy(const Url & url_r) const
+ {
+ if (!_enabled)
+ return "";
+
+ const url::ViewOption vopt =
+ url::ViewOption::WITH_SCHEME
+ + url::ViewOption::WITH_HOST
+ + url::ViewOption::WITH_PORT
+ + url::ViewOption::WITH_PATH_NAME;
+
+ char **proxies = px_proxy_factory_get_proxies(_factory,
+ (char *)url_r.asString(vopt).c_str());
+ if (!proxies)
+ return "";
+
+ /* cURL can only handle HTTP proxies, not SOCKS. And can only handle
+ one. So look through the list and find an appropriate one. */
+ char *result = NULL;
+
+ for (int i = 0; proxies[i]; i++) {
+ if (!result &&
+ !strncmp(proxies[i], "http://", 7))
+ result = proxies[i];
+ else
+ free(proxies[i]);
+ }
+ free(proxies);
+
+ if (!result)
+ return "";
+
+ /* Yes, there's a memory leak here */
+ return result;
+ }
+
+ ProxyInfo::NoProxyIterator ProxyInfoLibproxy::noProxyBegin() const
+ { return _no_proxy.begin(); }
+
+ ProxyInfo::NoProxyIterator ProxyInfoLibproxy::noProxyEnd() const
+ { return _no_proxy.end(); }
+
+ } // namespace media
+} // namespace zypp
diff --git a/zypp/media/proxyinfo/ProxyInfoLibproxy.h b/zypp/media/proxyinfo/ProxyInfoLibproxy.h
new file mode 100644
index 0000000..b181064
--- /dev/null
+++ b/zypp/media/proxyinfo/ProxyInfoLibproxy.h
@@ -0,0 +1,57 @@
+/*---------------------------------------------------------------------\
+| ____ _ __ __ ___ |
+| |__ / \ / / . \ . \ |
+| / / \ V /| _/ _/ |
+| / /__ | | | | | | |
+| /_____||_| |_| |_| |
+| |
+\---------------------------------------------------------------------*/
+/** \file zypp/media/proxyinfo/ProxyInfoLibproxy.h
+ *
+*/
+#ifndef ZYPP_MEDIA_PROXYINFO_PROXYINFOLIBPROXY_H
+#define ZYPP_MEDIA_PROXYINFO_PROXYINFOLIBPROXY_H
+
+#include <string>
+#include <map>
+
+#include