libzypp  16.1.1
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 = "\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::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:321
static ZConfig & instance()
Singleton ctor.
Definition: Resolver.cc:121
Command frame for communication with PluginScript.
Definition: PluginFrame.h:40
std::string getPathName(EEncoding eflag=zypp::url::E_DECODED) const
Returns the path name from the URL.
Definition: Url.cc:598
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.
Pathname pluginsPath() const
Defaults to /usr/lib/zypp/plugins.
Definition: ZConfig.cc:1116
zypp::url::ParamMap getQueryStringMap(EEncoding eflag=zypp::url::E_DECODED) const
Returns a string map with query parameter and their values.
Definition: Url.cc:646
Just inherits Exception to separate media exceptions.
std::ostream & operator<<(std::ostream &str, const UrlResolverPlugin::Impl &obj)
zypp::Url url
Definition: MediaCurl.cc:192
void open()
Setup connection and execute script.
PluginFrame receive() const
Receive a PluginFrame.
UrlResolverPlugin implementation.
RW_pointer< Impl > _pimpl
Pointer to implementation.
HeaderList::const_iterator HeaderListIterator
Header list iterator.
Definition: PluginFrame.h:138
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
std::string getScheme() const
Returns the scheme name of the URL.
Definition: Url.cc:527
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
void send(const PluginFrame &frame_r) const
Send a PluginFrame.
Url manipulation class.
Definition: Url.h:87