libzypp 17.35.11
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;
46 scr.open(plugin_path);
47 // send frame to plugin
48 PluginFrame f("RESOLVEURL");
49
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().asString());
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().asString()));
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
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
Reference counted access to a Tp object calling a custom Dispose function when the last AutoDispose h...
Definition AutoDispose.h:95
shared_ptr< Impl > _pimpl
Command frame for communication with PluginScript.
Definition PluginFrame.h:42
HeaderList::const_iterator HeaderListIterator
Header list iterator.
Interface to plugin scripts using a Stomp inspired communication protocol.
Url manipulation class.
Definition Url.h:92
std::string getPathName(EEncoding eflag=zypp::url::E_DECODED) const
Returns the path name from the URL.
Definition Url.cc:608
zypp::url::ParamMap getQueryStringMap(EEncoding eflag=zypp::url::E_DECODED) const
Returns a string map with query parameter and their values.
Definition Url.cc:656
static ZConfig & instance()
Singleton ctor.
Definition ZConfig.cc:925
Wrapper class for stat/lstat.
Definition PathInfo.h:222
bool isExist() const
Return whether valid stat info exists.
Definition PathInfo.h:282
Just inherits Exception to separate media exceptions.
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.
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:424