libzypp  17.23.8
UrlResolverPlugin.cc
Go to the documentation of this file.
1 /*---------------------------------------------------------------------\
2 | ____ _ __ __ ___ |
3 | |__ / \ / / . \ . \ |
4 | / / \ V /| _/ _/ |
5 | / /__ | | | | | | |
6 | /_____||_| |_| |_| |
7 | |
8 \---------------------------------------------------------------------*/
12 #include <iostream>
13 #include <zypp/base/Logger.h>
16 #include <zypp/PluginScript.h>
17 #include <zypp/ZConfig.h>
18 
19 using std::endl;
20 
22 namespace zypp
23 {
24  namespace media
26  {
27 
30  {
31 
32 
33  };
35 
37  {
38  if (o_url.getScheme() != "plugin")
39  return o_url;
40 
41  Url url(o_url);
42  std::string name = url.getPathName();
43  Pathname plugin_path = (ZConfig::instance().pluginsPath()/"urlresolver")/name;
44  if (PathInfo(plugin_path).isExist()) {
45  PluginScript scr;
46  scr.open(plugin_path);
47  // send frame to plugin
48  PluginFrame f("RESOLVEURL");
49 
50  url::ParamMap params = url.getQueryStringMap();
51  url::ParamMap::const_iterator param_it;
52  for( param_it = params.begin();
53  param_it != params.end();
54  ++param_it)
55  f.setHeader(param_it->first, param_it->second);
56 
57  scr.send(f);
58 
59  PluginFrame r(scr.receive());
60  if (r.command() == "RESOLVEDURL") {
61  // now set
62  url = Url(r.body());
64 
65  for (it = r.headerBegin();
66  it != r.headerEnd();
67  ++it) {
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 = "\r\nX-libcurl-Empty-Header-Workaround: *";
72  }
73  headers.insert(values);
74  }
75  }
76  else if (r.command() == "ERROR") {
77  ZYPP_THROW(MediaException(r.body()));
78  }
79  }
80  return url;
81  }
82 
84  inline std::ostream & operator<<( std::ostream & str, const UrlResolverPlugin::Impl & obj )
85  {
86  return str << "UrlResolverPlugin::Impl";
87  }
88 
90  {}
91 
92  std::ostream & operator<<( std::ostream & str, const UrlResolverPlugin & obj )
93  {
94  return str << *obj._pimpl;
95  }
96 
98  } // namespace media
101 } // namespace zypp
zypp::Url::getScheme
std::string getScheme() const
Returns the scheme name of the URL.
Definition: Url.cc:528
zypp::media::MediaException
Just inherits Exception to separate media exceptions.
Definition: MediaException.h:35
zypp::filesystem::PathInfo::isExist
bool isExist() const
Return whether valid stat info exists.
Definition: PathInfo.h:281
PluginScript.h
zypp::media::UrlResolverPlugin::_pimpl
RW_pointer< Impl > _pimpl
Pointer to implementation.
Definition: UrlResolverPlugin.h:62
ZConfig.h
ZYPP_THROW
#define ZYPP_THROW(EXCPT)
Drops a logline and throws the Exception.
Definition: Exception.h:392
zypp::media::UrlResolverPlugin::~UrlResolverPlugin
~UrlResolverPlugin()
Dtor.
Definition: UrlResolverPlugin.cc:89
zypp::media::UrlResolverPlugin::HeaderList
std::multimap< std::string, std::string > HeaderList
Definition: UrlResolverPlugin.h:39
zypp::media::operator<<
std::ostream & operator<<(std::ostream &str, const MediaAccess &obj)
Definition: MediaAccess.cc:481
zypp::PluginFrame::HeaderListIterator
HeaderList::const_iterator HeaderListIterator
Header list iterator.
Definition: PluginFrame.h:138
zypp::media::UrlResolverPlugin::Impl::operator<<
std::ostream & operator<<(std::ostream &str, const UrlResolverPlugin::Impl &obj)
Definition: UrlResolverPlugin.cc:84
zypp::filesystem::PathInfo
Wrapper class for ::stat/::lstat.
Definition: PathInfo.h:220
zypp::media::UrlResolverPlugin
Definition: UrlResolverPlugin.h:33
Logger.h
zypp::ZConfig::instance
static ZConfig & instance()
Singleton ctor.
Definition: Resolver.cc:126
MediaException.h
zypp
Easy-to use interface to the ZYPP dependency resolver.
Definition: CodePitfalls.doc:1
zypp::PluginFrame
Command frame for communication with PluginScript.
Definition: PluginFrame.h:40
zypp::url::ParamMap
std::map< std::string, std::string > ParamMap
A parameter map container.
Definition: UrlUtils.h:47
zypp::PluginFrame::setHeader
void setHeader(const std::string &key_r, const std::string &value_r=std::string())
Set header for key_r removing all other occurrences of key_r.
Definition: PluginFrame.cc:319
zypp::PluginScript::send
void send(const PluginFrame &frame_r) const
Send a PluginFrame.
Definition: PluginScript.cc:504
zypp::filesystem::Pathname
Pathname.
Definition: Pathname.h:44
zypp::PluginScript::receive
PluginFrame receive() const
Receive a PluginFrame.
Definition: PluginScript.cc:507
str
String related utilities and Regular expression matching.
UrlResolverPlugin.h
zypp::media::UrlResolverPlugin::resolveUrl
static Url resolveUrl(const Url &url, HeaderList &headers)
Resolves an url using the installed plugins If no plugin is found the url is resolved as its current ...
Definition: UrlResolverPlugin.cc:36
url
Url url
Definition: MediaCurl.cc:66
zypp::Url
Url manipulation class.
Definition: Url.h:87
zypp::PluginScript
Interface to plugin scripts using a Stomp inspired communication protocol.
Definition: PluginScript.h:62
zypp::PluginScript::open
void open()
Setup connection and execute script.
Definition: PluginScript.cc:492
zypp::ZConfig::pluginsPath
Pathname pluginsPath() const
Defaults to /usr/lib/zypp/plugins.
Definition: ZConfig.cc:1187
zypp::media::UrlResolverPlugin::Impl
UrlResolverPlugin implementation.
Definition: UrlResolverPlugin.cc:29