libzypp: zypp::media::MediaCurl Class Reference

libzypp 17.36.6

Classes | Public Types | Public Member Functions | Static Public Member Functions | Protected Member Functions | Static Protected Member Functions | Protected Attributes | Private Member Functions | Private Attributes | Static Private Attributes | List of all members
zypp::media::MediaCurl Class Reference

Implementation class for FTP, HTTP and HTTPS MediaHandler. More...

`#include <zypp/media/MediaCurl.h>`

Inheritance diagram for zypp::media::MediaCurl:

## Classes
class | Callbacks

## Public Types
enum | RequestOption { OPTION_NONE = 0x0 , OPTION_RANGE = 0x1 , OPTION_HEAD = 0x02 , OPTION_NO_IFMODSINCE = 0x04 , OPTION_NO_REPORT_START = 0x08 }
Public Types inherited from zypp::media::MediaHandler
using | Ptr = shared_ptr<MediaHandler>
using | constPtr = shared_ptr<const MediaHandler>

## Public Member Functions
| ZYPP_DECLARE_FLAGS (RequestOptions, RequestOption)
| MediaCurl (const Url &url_r, const Pathname &attach_point_hint_r)
| ~MediaCurl () override
Public Member Functions inherited from zypp::media::MediaNetworkCommonHandler
| MediaNetworkCommonHandler (const Url &url_r, const Pathname &attach_point_r, const Pathname &urlpath_below_attachpoint_r, const bool does_download_r)
TransferSettings & | settings ()
Public Member Functions inherited from zypp::media::MediaHandler
bool | dependsOnParent (MediaAccessId parentId, bool exactIdMatch)
| Check if the current media handler depends on an another handler specified by media access id.
bool | dependsOnParent ()
void | resetParentId ()
| Called in case, where the media manager takes over the destruction of the parent id (e.g.
Pathname | attachPoint () const
| Return the currently used attach point.
void | setAttachPoint (const Pathname &path, bool temp)
| Set a new attach point.
void | setAttachPoint (const AttachPointRef &ref)
| Set a (shared) attach point.
AttachPoint | attachPointHint () const
| Get the actual attach point hint.
void | attachPointHint (const Pathname &path, bool temp)
| Set the attach point hint as specified by the user.
Pathname | createAttachPoint () const
| Try to create a default / temporary attach point.
Pathname | createAttachPoint (const Pathname &attach_root) const
| Try to create a temporary attach point in specified root.
void | removeAttachPoint ()
| Remove unused attach point.
bool | isUseableAttachPoint (const Pathname &path, bool mtab=true) const
| Ask media manager, if the specified path is already used as attach point or if there are another attach points bellow of it.
std::string | mediaSourceName () const
| Get the media source name or an empty string.
void | setMediaSource (const MediaSourceRef &ref)
| Set new media source reference.
AttachedMedia | findAttachedMedia (const MediaSourceRef &media) const
| Ask the media manager if specified media source is already attached.
AttachedMedia | attachedMedia () const
| Returns the attached media.
bool | isSharedMedia () const
| Returns a hint if the media is shared or not.
bool | checkAttached (bool matchMountFs) const
| Check actual mediaSource attachment against the current mount table of the system.
void | forceRelaseAllMedia (bool matchMountFs)
| Call to this function will try to release all media matching the currenlty attached media source, that it is able to find in the mount table.
void | forceRelaseAllMedia (const MediaSourceRef &ref, bool matchMountFs)
| MediaHandler (Url url_r, const Pathname &attach_point_r, Pathname urlpath_below_attachpoint_r, const bool does_download_r)
| If the concrete media handler provides a nonempty attach_point, it must be an existing directory.
virtual | ~MediaHandler ()
| Contolling MediaAccess takes care, that attached media is released prior to deleting this.
bool | downloads () const
| Hint if files are downloaded or not.
std::string | protocol () const
| Protocol hint for MediaAccess.
Url | url () const
| Url used.
void | attach (bool next)
| Use concrete handler to attach the media.
virtual bool | isAttached () const
| True if media is attached.
Pathname | localRoot () const
| Return the local directory that corresponds to medias url, no matter if media isAttached or not.
Pathname | localPath (const Pathname &pathname) const
| Files provided will be available at 'localPath(filename)'.
void | disconnect ()
| Use concrete handler to isconnect media.
void | release (const std::string &ejectDev="")
| Use concrete handler to release the media.
void | provideFile (const OnMediaLocation &file) const
| Use concrete handler to provide file denoted by path below 'localRoot'.
void | provideFileCopy (const OnMediaLocation &srcFile, const Pathname &targetFilename) const
| Call concrete handler to provide a copy of a file under a different place in the file system (usually not under attach point) as a copy.
void | provideDir (const Pathname &dirname) const
| Use concrete handler to provide directory denoted by path below 'localRoot' (not recursive!).
void | provideDirTree (const Pathname &dirname) const
| Use concrete handler to provide directory tree denoted by path below 'localRoot' (recursive!
void | releaseFile (const Pathname &filename) const
| Remove filename below localRoot IFF handler downloads files to the local filesystem.
void | releaseDir (const Pathname &dirname) const
| Remove directory tree below localRoot IFF handler downloads files to the local filesystem.
void | releasePath (const Pathname &pathname) const
| Remove pathname below localRoot IFF handler downloads files to the local filesystem.
void | dirInfo (std::list< std::string > &retlist, const Pathname &dirname, bool dots=true) const
| Return content of directory on media via retlist.
void | dirInfo (filesystem::DirContent &retlist, const Pathname &dirname, bool dots=true) const
| Basically the same as dirInfo above.
bool | doesFileExist (const Pathname &filename) const
| check if a file exists
virtual bool | hasMoreDevices ()
| Check if the media has one more device available for attach(true).
virtual void | getDetectedDevices (std::vector< std::string > &devices, unsigned int &index) const
| Fill in a vector of detected ejectable devices and the index of the currently attached device within the vector.
virtual void | precacheFiles (const std::vector< OnMediaLocation > &files)
| Tries to fetch the given files and precaches them.

## Static Public Member Functions
static void | setCookieFile (const Pathname &)
Static Public Member Functions inherited from zypp::media::MediaNetworkCommonHandler
static const char * | anonymousIdHeader ()
static const char * | distributionFlavorHeader ()
static const char * | agentString ()
Static Public Member Functions inherited from zypp::media::MediaHandler
static bool | setAttachPrefix (const Pathname &attach_prefix)
static std::string | getRealPath (const std::string &path)
static Pathname | getRealPath (const Pathname &path)
static bool | checkAttachPoint (const Pathname &apoint, bool empty_dir, bool writeable)
| Verify if the specified directory as attach point (root) using requested checks.

## Protected Member Functions
Url | clearQueryString (const Url &url) const
void | attachTo (bool next=false) override
| Call concrete handler to attach the media.
void | releaseFrom (const std::string &ejectDev) override
| Call concrete handler to release the media.
void | getFile (const OnMediaLocation &file) const override
| Call concrete handler to provide file below attach point.
void | getDir (const Pathname &dirname, bool recurse_r) const override
| Call concrete handler to provide directory content (not recursive!) below attach point.
void | getDirInfo (std::list< std::string > &retlist, const Pathname &dirname, bool dots=true) const override
| Call concrete handler to provide a content list of directory on media via retlist.
void | getDirInfo (filesystem::DirContent &retlist, const Pathname &dirname, bool dots=true) const override
| Basically the same as getDirInfo above.
bool | getDoesFileExist (const Pathname &filename) const override
| Repeatedly calls doGetDoesFileExist() until it successfully returns, fails unexpectedly, or user cancels the operation.
virtual bool | doGetDoesFileExist (const Pathname &filename) const
void | disconnectFrom () override
void | getFileCopy (const OnMediaLocation &srcFile, const Pathname &targetFilename) const override
virtual void | doGetFileCopy (const OnMediaLocation &srcFile, const Pathname &targetFilename, callback::SendReport< DownloadProgressReport > &_report, RequestOptions options=OPTION_NONE) const
bool | checkAttachPoint (const Pathname &apoint) const override
| Verify if the specified directory as attach point (root) as requires by the particular media handler implementation.
void | checkProtocol (const Url &url) const
| check the url is supported by the curl library
virtual void | setupEasy ()
| initializes the curl easy handle with the data from the url
void | evaluateCurlCode (const zypp::Pathname &filename, CURLcode code, bool timeout) const
| Evaluates a curl return code and throws the right MediaException `filename` Filename being downloaded `code` Code curl returnes `timeout` Whether we reached timeout, which we need to differentiate in case the codes aborted-by-callback or timeout are returned by curl Otherwise we can't differentiate abort from timeout.
void | doGetFileCopyFile (const OnMediaLocation &srcFile, const Pathname &dest, FILE *file, callback::SendReport< DownloadProgressReport > &report, RequestOptions options=OPTION_NONE) const
const char * | curlError () const
void | setCurlError (const char *error)
Protected Member Functions inherited from zypp::media::MediaNetworkCommonHandler
Url | getFileUrl (const Pathname &filename) const
| concatenate the attach url and the filename to a complete download url
Protected Member Functions inherited from zypp::media::MediaHandler
virtual void | forceEject (const std::string &device)
| Call concrete handler to physically eject the media (i.e.
void | getDirectoryYast (std::list< std::string > &retlist, const Pathname &dirname, bool dots=true) const
| Retrieve and if available scan dirname/directory.yast.
void | getDirectoryYast (filesystem::DirContent &retlist, const Pathname &dirname, bool dots=true) const
| Retrieve and if available scan dirname/directory.yast.

## Static Protected Member Functions
static int | aliveCallback (void *clientp, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow)
| Callback sending just an alive trigger to the UI, without stats (e.g.
static int | progressCallback (void *clientp, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow)
| Callback reporting download progress.
static CURL * | progressCallback_getcurl (void *clientp)
static void | resetExpectedFileSize (void *clientp, const ByteCount &expectedFileSize)
| MediaMultiCurl needs to reset the expected filesize in case a metalink file is downloaded otherwise this function should not be called.
Static Protected Member Functions inherited from zypp::media::MediaNetworkCommonHandler
static zypp::Url | findGeoIPRedirect (const zypp::Url &url)
| Rewrites the baseURL to the geoIP target if one is found in the metadata cache, otherwise simply returns the url again.

## Protected Attributes
CURL * | _curl
curl_slist * | _customHeaders
Protected Attributes inherited from zypp::media::MediaNetworkCommonHandler
TransferSettings | _settings
Url | _redirTarget
Protected Attributes inherited from zypp::media::MediaHandler
const Url | _url
| Url to handle.
MediaAccessId | _parentId
| Access Id of media handler we depend on.

## Private Member Functions
CURLcode | executeCurl () const
std::string | getAuthHint () const
| Return a comma separated list of available authentication methods supported by server.
bool | authenticate (const std::string &availAuthTypes, bool firstTry) const
bool | detectDirIndex () const

## Private Attributes
std::string | _currentCookieFile
char | _curlError [CURL_ERROR_SIZE]
std::string | _lastRedirect
| to log/report redirections

## Static Private Attributes
static Pathname | _cookieFile = "/var/lib/YaST2/cookies"

## Detailed Description

Implementation class for FTP, HTTP and HTTPS MediaHandler.

See also
  MediaHandler

Definition at line 31 of file MediaCurl.h.

## Member Enumeration Documentation

## ◆ RequestOption

enum zypp::media::MediaCurl::RequestOption

Enumerator
OPTION_NONE | Defaults.
OPTION_RANGE | retrieve only a range of the file
OPTION_HEAD | only issue a HEAD (or equivalent) request
OPTION_NO_IFMODSINCE | to not add a IFMODSINCE header if target exists
OPTION_NO_REPORT_START | do not send a start ProgressReport

Definition at line 34 of file MediaCurl.h.

## Constructor & Destructor Documentation

## ◆ MediaCurl()

zypp::media::MediaCurl::MediaCurl | ( | const Url & | url_r,
|  | const Pathname & | attach_point_hint_r )

Definition at line 207 of file MediaCurl.cc.

## ◆ ~MediaCurl()

zypp::media::MediaCurl::~MediaCurl | ( |  | ) |
| inlineoverride

Definition at line 101 of file MediaCurl.h.

## Member Function Documentation

## ◆ ZYPP_DECLARE_FLAGS()

zypp::media::MediaCurl::ZYPP_DECLARE_FLAGS | ( | RequestOptions | ,
|  | RequestOption | )

## ◆ clearQueryString()

Url zypp::media::MediaCurl::clearQueryString | ( | const Url & | url | ) | const
| protected

Definition at line 242 of file MediaCurl.cc.

## ◆ attachTo()

void zypp::media::MediaCurl::attachTo | ( | bool | next = false | ) |
| overrideprotectedvirtual

Call concrete handler to attach the media.

Asserted that not already attached, and attachPoint is a directory.

Parameters

  next | try next available device in turn until end of device list is reached (for media which are accessible through multiple devices like cdroms).

Exceptions

  MediaException |

Implements zypp::media::MediaHandler.

Definition at line 532 of file MediaCurl.cc.

## ◆ releaseFrom()

void zypp::media::MediaCurl::releaseFrom | ( | const std::string & | ejectDev | ) |
| overrideprotectedvirtual

Call concrete handler to release the media.

If eject is true, and the media is used in one handler instance only, physically eject the media (i.e. CD-ROM).

Asserted that media is attached.

Parameters

  ejectDev | Device to eject. None if empty.

Exceptions

  MediaException |

Implements zypp::media::MediaHandler.

Definition at line 593 of file MediaCurl.cc.

## ◆ getFile()

void zypp::media::MediaCurl::getFile | ( | const OnMediaLocation & | file | ) | const
| overrideprotectedvirtual

Call concrete handler to provide file below attach point.

Default implementation provided, that returns whether a file is located at 'localRoot + filename'.

Asserted that media is attached.

Exceptions

  MediaException |

Reimplemented from zypp::media::MediaHandler.

Definition at line 600 of file MediaCurl.cc.

## ◆ getDir()

void zypp::media::MediaCurl::getDir | ( | const Pathname & | dirname,
|  | bool | recurse_r ) const
| overrideprotectedvirtual

Call concrete handler to provide directory content (not recursive!) below attach point.

Return E_not_supported_by_media if media does not support retrieval of directory content.

Default implementation provided, that returns whether a directory is located at 'localRoot + dirname'.

Asserted that media is attached.

Exceptions

  MediaException |

Implements zypp::media::MediaHandler.

Definition at line 1162 of file MediaCurl.cc.

## ◆ getDirInfo() [1/2]

void zypp::media::MediaCurl::getDirInfo | ( | std::list< std::string > & | retlist,
|  | const Pathname & | dirname,
|  | bool | dots = true ) const
| overrideprotectedvirtual

Call concrete handler to provide a content list of directory on media via retlist.

If dots is false entries starting with '.' are not reported.

Return E_not_supported_by_media if media does not support retrieval of directory content.

Default implementation provided, that returns the content of a directory at 'localRoot + dirnname' retrieved via 'readdir'.

Asserted that media is attached and retlist is empty.

Exceptions

  MediaException |

Implements zypp::media::MediaHandler.

Definition at line 1195 of file MediaCurl.cc.

## ◆ getDirInfo() [2/2]

void zypp::media::MediaCurl::getDirInfo | ( | filesystem::DirContent & | retlist,
|  | const Pathname & | dirname,
|  | bool | dots = true ) const
| overrideprotectedvirtual

Basically the same as getDirInfo above.

The content list is returned as filesystem::DirContent, which includes name and filetype of each directory entry. Retrieving the filetype usg. requires an additional ::stat call for each entry, thus it's more expensive than a simple readdir.

Asserted that media is attached and retlist is empty.

Exceptions

  MediaException |

Implements zypp::media::MediaHandler.

Definition at line 1203 of file MediaCurl.cc.

## ◆ getDoesFileExist()

bool zypp::media::MediaCurl::getDoesFileExist | ( | const Pathname & | filename | ) | const
| overrideprotectedvirtual

Repeatedly calls doGetDoesFileExist() until it successfully returns, fails unexpectedly, or user cancels the operation.

This is used to handle authentication or similar retry scenarios on media level.

Implements zypp::media::MediaHandler.

Definition at line 671 of file MediaCurl.cc.

## ◆ doGetDoesFileExist()

bool zypp::media::MediaCurl::doGetDoesFileExist | ( | const Pathname & | filename | ) | const
| protectedvirtual

See also
  MediaHandler::getDoesFileExist

RAII Handler for temp. setting a head/range request

Definition at line 843 of file MediaCurl.cc.

## ◆ disconnectFrom()

void zypp::media::MediaCurl::disconnectFrom | ( |  | ) |
| overrideprotectedvirtual

Exceptions

  MediaException |

Reimplemented from zypp::media::MediaHandler.

Definition at line 574 of file MediaCurl.cc.

## ◆ getFileCopy()

void zypp::media::MediaCurl::getFileCopy | ( | const OnMediaLocation & | srcFile,
|  | const Pathname & | targetFilename ) const
| overrideprotectedvirtual

Exceptions

  MediaException |

Reimplemented from zypp::media::MediaHandler.

Definition at line 609 of file MediaCurl.cc.

## ◆ doGetFileCopy()

void zypp::media::MediaCurl::doGetFileCopy | ( | const OnMediaLocation & | srcFile,
|  | const Pathname & | targetFilename,
|  | callback::SendReport< DownloadProgressReport > & | _report,
|  | RequestOptions | options = OPTION_NONE ) const
| protectedvirtual

Exceptions

  MediaException |

Reimplemented in zypp::media::MediaMultiCurl.

Definition at line 952 of file MediaCurl.cc.

## ◆ checkAttachPoint()

bool zypp::media::MediaCurl::checkAttachPoint | ( | const Pathname & | apoint | ) | const
| overrideprotectedvirtual

Verify if the specified directory as attach point (root) as requires by the particular media handler implementation.

Parameters

  apoint | The directory to check.

Returns
  True, if the directory checks succeeded.

Reimplemented from zypp::media::MediaHandler.

Definition at line 567 of file MediaCurl.cc.

## ◆ setCookieFile()

void zypp::media::MediaCurl::setCookieFile | ( | const Pathname & | fileName | ) |
| static

Definition at line 247 of file MediaCurl.cc.

## ◆ aliveCallback()

int zypp::media::MediaCurl::aliveCallback | ( | void * | clientp,
|  | curl_off_t | dltotal,
|  | curl_off_t | dlnow,
|  | curl_off_t | ultotal,
|  | curl_off_t | ulnow )
| staticprotected

Callback sending just an alive trigger to the UI, without stats (e.g.

during metalink download).

Definition at line 1211 of file MediaCurl.cc.

## ◆ progressCallback()

int zypp::media::MediaCurl::progressCallback | ( | void * | clientp,
|  | curl_off_t | dltotal,
|  | curl_off_t | dlnow,
|  | curl_off_t | ultotal,
|  | curl_off_t | ulnow )
| staticprotected

Callback reporting download progress.

Definition at line 1225 of file MediaCurl.cc.

## ◆ progressCallback_getcurl()

CURL * zypp::media::MediaCurl::progressCallback_getcurl | ( | void * | clientp | ) |
| staticprotected

Definition at line 1241 of file MediaCurl.cc.

## ◆ checkProtocol()

void zypp::media::MediaCurl::checkProtocol | ( | const Url & | url | ) | const
| protected

check the url is supported by the curl library

Exceptions

  MediaBadUrlException | if there is a problem

Definition at line 261 of file MediaCurl.cc.

## ◆ setupEasy()

void zypp::media::MediaCurl::setupEasy | ( |  | ) |
| protectedvirtual

initializes the curl easy handle with the data from the url

Exceptions

  MediaCurlSetOptException | if there is a problem

Force IPv4/v6

Connect timeout

Speed limits

Reimplemented in zypp::media::MediaMultiCurl.

Definition at line 286 of file MediaCurl.cc.

## ◆ evaluateCurlCode()

void zypp::media::MediaCurl::evaluateCurlCode | ( | const zypp::Pathname & | filename,
|  | CURLcode | code,
|  | bool | timeout ) const
| protected

Evaluates a curl return code and throws the right MediaException `filename` Filename being downloaded `code` Code curl returnes `timeout` Whether we reached timeout, which we need to differentiate in case the codes aborted-by-callback or timeout are returned by curl Otherwise we can't differentiate abort from timeout.

Here you may want to pass the progress data object timeout-reached value, or just true if you are not doing user interaction.

Exceptions

  MediaException | If there is a problem

Definition at line 702 of file MediaCurl.cc.

## ◆ doGetFileCopyFile()

void zypp::media::MediaCurl::doGetFileCopyFile | ( | const OnMediaLocation & | srcFile,
|  | const Pathname & | dest,
|  | FILE * | file,
|  | callback::SendReport< DownloadProgressReport > & | report,
|  | RequestOptions | options = OPTION_NONE ) const
| protected

Definition at line 1062 of file MediaCurl.cc.

## ◆ resetExpectedFileSize()

void zypp::media::MediaCurl::resetExpectedFileSize | ( | void * | clientp,
|  | const ByteCount & | expectedFileSize )
| staticprotected

MediaMultiCurl needs to reset the expected filesize in case a metalink file is downloaded otherwise this function should not be called.

Definition at line 1268 of file MediaCurl.cc.

## ◆ executeCurl()

CURLcode zypp::media::MediaCurl::executeCurl | ( |  | ) | const
| private

Executes the given curl handle in a multi context

Note
  this should not be a const function, but API forces us to do so

Definition at line 1281 of file MediaCurl.cc.

## ◆ getAuthHint()

std::string zypp::media::MediaCurl::getAuthHint | ( |  | ) | const
| private

Return a comma separated list of available authentication methods supported by server.

Definition at line 1249 of file MediaCurl.cc.

## ◆ authenticate()

bool zypp::media::MediaCurl::authenticate | ( | const std::string & | availAuthTypes,
|  | bool | firstTry ) const
| private

Todo
  need a way to pass different CredManagerOptions here

Todo
  find a way to save the url with changed username back to repoinfo or dont store urls with username (and either forbid more repos with the same url and different user, or return a set of credentials from CM and try them one by one)

Definition at line 1342 of file MediaCurl.cc.

## ◆ detectDirIndex()

bool zypp::media::MediaCurl::detectDirIndex | ( |  | ) | const
| private

## ◆ curlError()

const char * zypp::media::MediaCurl::curlError | ( |  | ) | const
| inlineprotected

Definition at line 173 of file MediaCurl.h.

## ◆ setCurlError()

void zypp::media::MediaCurl::setCurlError | ( | const char * | error | ) |
| protected

Definition at line 252 of file MediaCurl.cc.

## Member Data Documentation

## ◆ _currentCookieFile

std::string zypp::media::MediaCurl::_currentCookieFile
| private

Definition at line 163 of file MediaCurl.h.

## ◆ _cookieFile

Pathname zypp::media::MediaCurl::_cookieFile = "/var/lib/YaST2/cookies"
| staticprivate

Definition at line 164 of file MediaCurl.h.

## ◆ _curlError

char zypp::media::MediaCurl::_curlError[CURL_ERROR_SIZE]
| private

Definition at line 165 of file MediaCurl.h.

## ◆ _lastRedirect

std::string zypp::media::MediaCurl::_lastRedirect
| mutableprivate

to log/report redirections

Definition at line 167 of file MediaCurl.h.

## ◆ _curl

CURL* zypp::media::MediaCurl::_curl
| protected

Definition at line 170 of file MediaCurl.h.

## ◆ _customHeaders

curl_slist* zypp::media::MediaCurl::_customHeaders
| protected

Definition at line 171 of file MediaCurl.h.

The documentation for this class was generated from the following files:

- zypp/media/MediaCurl.h
- zypp/media/MediaCurl.cc