Mailinglist Archive: zypp-devel (24 mails)

< Previous Next >
[zypp-devel] [PATCH 2/2] Add support for using libproxy to find proxies
  • From: David Woodhouse <dwmw2@xxxxxxxxxxxxx>
  • Date: Sat, 20 Nov 2010 13:16:00 +0000
  • Message-id: <1290258961.30970.66.camel@xxxxxxxxxxxxxxxx>
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 <proxy.h>
+
+#include "zypp/base/DefaultIntegral.h"
+#include "zypp/media/ProxyInfo.h"
+#include "zypp/media/proxyinfo/ProxyInfoImpl.h"
+
+namespace zypp {
+ namespace media {
+
+
+ class ProxyInfoLibproxy : public ProxyInfo::Impl
+ {
+ public:
+ ProxyInfoLibproxy();
+ /** */
+ ~ProxyInfoLibproxy();
+ /** */
+ bool enabled() const
+ { return _enabled; }
+ /** */
+ std::string proxy(const Url & url_r) const;
+ /** */
+ ProxyInfo::NoProxyList noProxy() const
+ { return _no_proxy; }
+ /** */
+ virtual ProxyInfo::NoProxyIterator noProxyBegin() const;
+ /** */
+ virtual ProxyInfo::NoProxyIterator noProxyEnd() const;
+ private:
+ DefaultIntegral<bool,false> _enabled;
+ ProxyInfo::NoProxyList _no_proxy;
+ pxProxyFactory *_factory;
+ };
+
+///////////////////////////////////////////////////////////////////
+
+ } // namespace media
+} // namespace zypp
+
+#endif // ZYPP_MEDIA_PROXYINFO_PROXYINFOLIBPROXY_H
diff --git a/zypp/media/proxyinfo/ProxyInfos.h
b/zypp/media/proxyinfo/ProxyInfos.h
index 9cfe78a..3f0682a 100644
--- a/zypp/media/proxyinfo/ProxyInfos.h
+++ b/zypp/media/proxyinfo/ProxyInfos.h
@@ -16,5 +16,6 @@
#include <list>

#include "zypp/media/proxyinfo/ProxyInfoSysconfig.h"
+#include "zypp/media/proxyinfo/ProxyInfoLibproxy.h"

#endif // ZYPP_MEDIA_PROXYINFO_PROXYINFOS_H
--
1.7.3.2

--
David Woodhouse Open Source Technology Centre
David.Woodhouse@xxxxxxxxx Intel Corporation

--
To unsubscribe, e-mail: zypp-devel+unsubscribe@xxxxxxxxxxxx
For additional commands, e-mail: zypp-devel+help@xxxxxxxxxxxx

< Previous Next >
Follow Ups