libzypp 17.31.23
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>
15#include <zypp-media/MediaException>
16#include <zypp/PluginScript.h>
17#include <zypp/ZConfig.h>
18
19using std::endl;
20
22namespace zypp
23{
25 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") {
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
Command frame for communication with PluginScript.
Definition: PluginFrame.h:41
const std::string & body() const
Return the frame body.
Definition: PluginFrame.cc:292
HeaderList::const_iterator HeaderListIterator
Header list iterator.
Definition: PluginFrame.h:138
const std::string & command() const
Return the frame command.
Definition: PluginFrame.cc:286
HeaderListIterator headerEnd() const
Return iterator pointing behind the last header.
Definition: PluginFrame.h:161
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
HeaderListIterator headerBegin() const
Return iterator pointing to the 1st header (or headerEnd)
Definition: PluginFrame.h:157
Interface to plugin scripts using a Stomp inspired communication protocol.
Definition: PluginScript.h:63
PluginFrame receive() const
Receive a PluginFrame.
void send(const PluginFrame &frame_r) const
Send a PluginFrame.
void open()
Setup connection and execute script.
Url manipulation class.
Definition: Url.h:92
std::string getScheme() const
Returns the scheme name of the URL.
Definition: Url.cc:533
std::string getPathName(EEncoding eflag=zypp::url::E_DECODED) const
Returns the path name from the URL.
Definition: Url.cc:604
zypp::url::ParamMap getQueryStringMap(EEncoding eflag=zypp::url::E_DECODED) const
Returns a string map with query parameter and their values.
Definition: Url.cc:652
Pathname pluginsPath() const
Defaults to /usr/lib/zypp/plugins.
Definition: ZConfig.cc:1321
static ZConfig & instance()
Singleton ctor.
Definition: ZConfig.cc:922
Wrapper class for stat/lstat.
Definition: PathInfo.h:221
bool isExist() const
Return whether valid stat info exists.
Definition: PathInfo.h:281
Just inherits Exception to separate media exceptions.
RW_pointer< Impl > _pimpl
Pointer to implementation.
std::multimap< std::string, std::string > HeaderList
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.
std::ostream & operator<<(std::ostream &str, const MediaHandler &obj)
std::map< std::string, std::string > ParamMap
A parameter map container.
Definition: UrlUtils.h:47
Easy-to use interface to the ZYPP dependency resolver.
Definition: CodePitfalls.doc:2
UrlResolverPlugin implementation.
std::ostream & operator<<(std::ostream &str, const UrlResolverPlugin::Impl &obj)
Stream output.
#define ZYPP_THROW(EXCPT)
Drops a logline and throws the Exception.
Definition: Exception.h:428