1 /*---------------------------------------------------------------------\
3 | |__ / \ / / . \ . \ |
8 \---------------------------------------------------------------------*/
9 /** \file zypp/media/UrlResolverPlugin.cc
13 #include "zypp/base/Logger.h"
14 #include "zypp/media/UrlResolverPlugin.h"
15 #include "zypp/media/MediaException.h"
16 #include "zypp/PluginScript.h"
17 #include "zypp/ZConfig.h"
21 ///////////////////////////////////////////////////////////////////
23 { /////////////////////////////////////////////////////////////////
24 ///////////////////////////////////////////////////////////////////
26 { /////////////////////////////////////////////////////////////////
28 /** UrlResolverPlugin implementation. */
29 struct UrlResolverPlugin::Impl
34 ///////////////////////////////////////////////////////////////////
36 Url UrlResolverPlugin::resolveUrl(const Url & o_url, HeaderList &headers)
38 if (o_url.getScheme() != "plugin")
42 std::string name = url.getPathName();
43 Pathname plugin_path = (ZConfig::instance().pluginsPath()/"urlresolver")/name;
44 if (PathInfo(plugin_path).isExist()) {
46 scr.open(plugin_path);
47 // send frame to plugin
48 PluginFrame f("RESOLVEURL");
50 url::ParamMap params = url.getQueryStringMap();
51 url::ParamMap::const_iterator param_it;
52 for( param_it = params.begin();
53 param_it != params.end();
55 f.setHeader(param_it->first, param_it->second);
59 PluginFrame r(scr.receive());
60 if (r.command() == "RESOLVEDURL") {
63 PluginFrame::HeaderListIterator it;
65 for (it = r.headerBegin();
68 std::pair<std::string, std::string> values(*it);
69 // curl resets headers that are empty, so we use a workaround
70 if (values.second.empty()) {
71 values.second = "\nX-libcurl-Empty-Header-Workaround: *";
73 headers.insert(values);
76 else if (r.command() == "ERROR") {
77 ZYPP_THROW(MediaException(r.body()));
83 /** \relates UrlResolverPlugin::Impl Stream output */
84 inline std::ostream & operator<<( std::ostream & str, const UrlResolverPlugin::Impl & obj )
86 return str << "UrlResolverPlugin::Impl";
89 UrlResolverPlugin::~UrlResolverPlugin()
92 std::ostream & operator<<( std::ostream & str, const UrlResolverPlugin & obj )
94 return str << *obj._pimpl;
97 /////////////////////////////////////////////////////////////////
99 ///////////////////////////////////////////////////////////////////
100 /////////////////////////////////////////////////////////////////
102 ///////////////////////////////////////////////////////////////////