libzypp  17.14.0
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
std::string getScheme() const
Returns the scheme name of the URL.
Definition: Url.cc:528
std::map< std::string, std::string > ParamMap
A parameter map container.
Definition: UrlUtils.h:47
#define ZYPP_THROW(EXCPT)
Drops a logline and throws the Exception.
Definition: Exception.h:392
static ZConfig & instance()
Singleton ctor.
Definition: Resolver.cc:127
Command frame for communication with PluginScript.
Definition: PluginFrame.h:40
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 ...
String related utilities and Regular expression matching.
Url url
Definition: MediaCurl.cc:180
PluginFrame receive() const
Receive a PluginFrame.
std::ostream & operator<<(std::ostream &str, const MediaAccess &obj)
Definition: MediaAccess.cc:482
bool isExist() const
Return whether valid stat info exists.
Definition: PathInfo.h:281
void send(const PluginFrame &frame_r) const
Send a PluginFrame.
Just inherits Exception to separate media exceptions.
std::ostream & operator<<(std::ostream &str, const UrlResolverPlugin::Impl &obj)
void open()
Setup connection and execute script.
UrlResolverPlugin implementation.
RW_pointer< Impl > _pimpl
Pointer to implementation.
HeaderList::const_iterator HeaderListIterator
Header list iterator.
Definition: PluginFrame.h:138
Wrapper class for ::stat/::lstat.
Definition: PathInfo.h:220
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
std::multimap< std::string, std::string > HeaderList
Interface to plugin scripts using a Stomp inspired communication protocol.
Definition: PluginScript.h:62
Easy-to use interface to the ZYPP dependency resolver.
Definition: CodePitfalls.doc:1
Pathname pluginsPath() const
Defaults to /usr/lib/zypp/plugins.
Definition: ZConfig.cc:1175
Url manipulation class.
Definition: Url.h:87