XRootD
Loading...
Searching...
No Matches
XrdClHttp::Filesystem Class Referencefinal

#include <XrdClHttpFilesystem.hh>

Inheritance diagram for XrdClHttp::Filesystem:
Collaboration diagram for XrdClHttp::Filesystem:

Public Member Functions

 Filesystem (const std::string &, std::shared_ptr< HandlerQueue > queue, XrdCl::Log *log)
virtual ~Filesystem () noexcept
XrdCl::XRootDStatus DirList (const std::string &path, XrdCl::DirListFlags::Flags flags, XrdCl::ResponseHandler *handler, time_t timeout) override
virtual bool GetProperty (const std::string &name, std::string &value) const override
virtual XrdCl::XRootDStatus Locate (const std::string &path, XrdCl::OpenFlags::Flags flags, XrdCl::ResponseHandler *handler, time_t timeout) override
virtual XrdCl::XRootDStatus MkDir (const std::string &path, XrdCl::MkDirFlags::Flags flags, XrdCl::Access::Mode mode, XrdCl::ResponseHandler *handler, time_t timeout) override
virtual XrdCl::XRootDStatus Prepare (const std::vector< std::string > &fileList, XrdCl::PrepareFlags::Flags flags, uint8_t priority, XrdCl::ResponseHandler *handler, time_t timeout) override
virtual XrdCl::XRootDStatus Query (XrdCl::QueryCode::Code queryCode, const XrdCl::Buffer &arg, XrdCl::ResponseHandler *handler, time_t timeout) override
virtual XrdCl::XRootDStatus Rm (const std::string &path, XrdCl::ResponseHandler *handler, time_t timeout) override
virtual XrdCl::XRootDStatus RmDir (const std::string &path, XrdCl::ResponseHandler *handler, time_t timeout) override
virtual bool SetProperty (const std::string &name, const std::string &value) override
virtual XrdCl::XRootDStatus Stat (const std::string &path, XrdCl::ResponseHandler *handler, time_t timeout) override
virtual XrdCl::XRootDStatus ThirdPartyCopy (const std::string &source, const std::string &dest, const XrdCl::PropertyList *properties, XrdCl::ProgressHandler *progress_handler, time_t timeout=0) override
Public Member Functions inherited from XrdCl::FileSystemPlugIn
virtual ~FileSystemPlugIn ()
 Destructor.
virtual XRootDStatus ChMod (const std::string &path, Access::Mode mode, ResponseHandler *handler, time_t timeout)
virtual XRootDStatus DeepLocate (const std::string &path, OpenFlags::Flags flags, ResponseHandler *handler, time_t timeout)
virtual XRootDStatus DelXAttr (const std::string &path, const std::vector< std::string > &attrs, ResponseHandler *handler, time_t timeout)
virtual XRootDStatus GetXAttr (const std::string &path, const std::vector< std::string > &attrs, ResponseHandler *handler, time_t timeout)
virtual XRootDStatus ListXAttr (const std::string &path, ResponseHandler *handler, time_t timeout)
virtual XRootDStatus Mv (const std::string &source, const std::string &dest, ResponseHandler *handler, time_t timeout)
virtual XRootDStatus Ping (ResponseHandler *handler, time_t timeout)
virtual XRootDStatus Protocol (ResponseHandler *handler, time_t timeout=0)
virtual XRootDStatus SendInfo (const std::string &info, ResponseHandler *handler, time_t timeout)
virtual XRootDStatus SetXAttr (const std::string &path, const std::vector< xattr_t > &attrs, ResponseHandler *handler, time_t timeout)
virtual XRootDStatus StatVFS (const std::string &path, ResponseHandler *handler, time_t timeout)
virtual XRootDStatus Truncate (const std::string &path, uint64_t size, ResponseHandler *handler, time_t timeout)
Public Member Functions inherited from XrdCl::ThirdPartyCopyPlugIn
virtual ~ThirdPartyCopyPlugIn ()

Detailed Description

Definition at line 52 of file XrdClHttpFilesystem.hh.

Constructor & Destructor Documentation

◆ Filesystem()

Filesystem::Filesystem ( const std::string & url,
std::shared_ptr< HandlerQueue > queue,
XrdCl::Log * log )

Definition at line 121 of file XrdClHttpFilesystem.cc.

122 : m_queue(queue),
123 m_logger(log),
124 m_url(url)
125{
126 m_logger->Debug(kLogXrdClHttp, "Constructing filesystem object with base URL %s", url.c_str());
127 // When constructed from the root protocol handler, we've observed it include the
128 // path here (the code paths appear to be slightly different from http://). Strip
129 // it out so it's not included twice later.
130 m_url.SetPath("/");
132 m_url.SetParams(map);
133}
std::map< std::string, std::string > ParamsMap
Definition XrdClURL.hh:33
const uint64_t kLogXrdClHttp

References XrdClHttp::kLogXrdClHttp.

◆ ~Filesystem()

Filesystem::~Filesystem ( )
virtualnoexcept

Definition at line 135 of file XrdClHttpFilesystem.cc.

135{}

Member Function Documentation

◆ DirList()

XrdCl::XRootDStatus Filesystem::DirList ( const std::string & path,
XrdCl::DirListFlags::Flags flags,
XrdCl::ResponseHandler * handler,
time_t timeout )
overridevirtual
See also
XrdCl::FileSystem::DirlList

Reimplemented from XrdCl::FileSystemPlugIn.

Definition at line 156 of file XrdClHttpFilesystem.cc.

160{
162
163 auto full_url = GetCurrentURL(path);
164
165 m_logger->Debug(kLogXrdClHttp, "Filesystem::DirList path %s", path.c_str());
166 auto listdirOp = std::make_unique<XrdClHttp::CurlListdirOp>(
167 handler, full_url,
168 m_url.GetHostName() + ":" + std::to_string(m_url.GetPort()),
169 SendResponseInfo(), ts, m_logger,
170 GetConnCallout(), m_header_callout.load(std::memory_order_acquire));
171 return QueueOperation(std::move(listdirOp), "directory list operation");
172}
static struct timespec GetHeaderTimeoutWithDefault(time_t oper_timeout)

References XrdClHttp::Factory::GetHeaderTimeoutWithDefault(), and XrdClHttp::kLogXrdClHttp.

Here is the call graph for this function:

◆ GetProperty()

bool Filesystem::GetProperty ( const std::string & name,
std::string & value ) const
overridevirtual
See also
XrdCl::FileSystem::GetProperty

Reimplemented from XrdCl::FileSystemPlugIn.

Definition at line 193 of file XrdClHttpFilesystem.cc.

195{
196 std::shared_lock lock(m_properties_mutex);
197
198 const auto p = m_properties.find(name);
199 if (p == std::end(m_properties)) {
200 return false;
201 }
202
203 value = p->second;
204 return true;
205}

◆ Locate()

XrdCl::XRootDStatus Filesystem::Locate ( const std::string & path,
XrdCl::OpenFlags::Flags flags,
XrdCl::ResponseHandler * handler,
time_t timeout )
overridevirtual
See also
XrdCl::FileSystem::Locate

Reimplemented from XrdCl::FileSystemPlugIn.

Definition at line 213 of file XrdClHttpFilesystem.cc.

217{
218 if (!handler) return XrdCl::XRootDStatus();
219
220 auto locateInfo = std::make_unique<XrdCl::LocationInfo>();
221 locateInfo->Add(XrdCl::LocationInfo::Location(m_url.GetHostName() + ":" + std::to_string(m_url.GetPort()), XrdCl::LocationInfo::ServerOnline, XrdCl::LocationInfo::Read));
222
223 auto obj = std::make_unique<XrdCl::AnyObject>();
224 obj->Set(locateInfo.release());
225 handler->HandleResponse(new XrdCl::XRootDStatus(), obj.release());
226
227 return XrdCl::XRootDStatus();
228}
@ Read
read access is allowed
@ ServerOnline
server node where the file is online
virtual void HandleResponse(XRootDStatus *status, AnyObject *response)

References XrdCl::ResponseHandler::HandleResponse(), XrdCl::LocationInfo::Read, and XrdCl::LocationInfo::ServerOnline.

Here is the call graph for this function:

◆ MkDir()

XrdCl::XRootDStatus Filesystem::MkDir ( const std::string & path,
XrdCl::MkDirFlags::Flags flags,
XrdCl::Access::Mode mode,
XrdCl::ResponseHandler * handler,
time_t timeout )
overridevirtual
See also
XrdCl::FileSystem::MkDir

Reimplemented from XrdCl::FileSystemPlugIn.

Definition at line 230 of file XrdClHttpFilesystem.cc.

235{
237
238 auto full_url = GetCurrentURL(path);
239 m_logger->Debug(kLogXrdClHttp, "Filesystem::MkDir path %s", full_url.c_str());
240
241 auto mkdirOp = std::make_unique<CurlMkcolOp>(
242 handler, full_url, ts, m_logger, SendResponseInfo(), GetConnCallout(),
243 m_header_callout.load(std::memory_order_acquire));
244 return QueueOperation(std::move(mkdirOp), "filesystem mkdir operation");
245}

References XrdClHttp::Factory::GetHeaderTimeoutWithDefault(), and XrdClHttp::kLogXrdClHttp.

Here is the call graph for this function:

◆ Prepare()

XrdCl::XRootDStatus Filesystem::Prepare ( const std::vector< std::string > & fileList,
XrdCl::PrepareFlags::Flags flags,
uint8_t priority,
XrdCl::ResponseHandler * handler,
time_t timeout )
overridevirtual
See also
XrdCl::FileSystem::Prepare

Reimplemented from XrdCl::FileSystemPlugIn.

Definition at line 247 of file XrdClHttpFilesystem.cc.

253{
254 (void)priority;
255
256 if(fileList.empty())
257 {
258 return XrdCl::XRootDStatus(XrdCl::stError, XrdCl::errInvalidArgs,
259 EINVAL, "missing prepare file list");
260 }
261
263 auto tapeOp = std::make_unique<CurlTapePrepareOp>(
264 handler, m_url.GetURL(), fileList, flags, ts, m_logger,
265 GetConnCallout(),
266 m_header_callout.load(std::memory_order_acquire));
267 return QueueOperation(std::move(tapeOp), "Tape prepare operation");
268}
const uint16_t stError
An error occurred that could potentially be retried.
const uint16_t errInvalidArgs

References XrdCl::errInvalidArgs, XrdClHttp::Factory::GetHeaderTimeoutWithDefault(), and XrdCl::stError.

Here is the call graph for this function:

◆ Query()

XrdCl::XRootDStatus Filesystem::Query ( XrdCl::QueryCode::Code queryCode,
const XrdCl::Buffer & arg,
XrdCl::ResponseHandler * handler,
time_t timeout )
overridevirtual
See also
XrdCl::FileSystem::Query

Reimplemented from XrdCl::FileSystemPlugIn.

Definition at line 270 of file XrdClHttpFilesystem.cc.

274{
276 std::unique_ptr<CurlOperation> operation;
277 const char *description = nullptr;
278
279 switch(queryCode)
280 {
283 operation = std::make_unique<CurlTapeQueryOp>(
284 handler, m_url.GetURL(), queryCode, arg, ts, m_logger,
285 GetConnCallout(),
286 m_header_callout.load(std::memory_order_acquire));
287 description = "Tape query operation";
288 break;
290 {
291 const auto url = GetCurrentURL(arg.ToString());
292 m_logger->Debug(kLogXrdClHttp,
293 "XrdClHttp::Filesystem::Query checksum path %s", url.c_str());
294
295 XrdClHttp::ChecksumType preferred =
297 XrdCl::URL urlObj;
298 urlObj.FromString(url);
299 const auto iter = urlObj.GetParams().find("cks.type");
300 if(iter != urlObj.GetParams().end())
301 {
302 preferred = XrdClHttp::GetTypeFromString(iter->second);
303 if(preferred == XrdClHttp::ChecksumType::kUnknown)
304 {
305 m_logger->Error(kLogXrdClHttp,
306 "Unknown checksum type %s", iter->second.c_str());
307 return XrdCl::XRootDStatus(XrdCl::stError,
308 XrdCl::errInvalidArgs, EINVAL,
309 "unknown checksum type '" + iter->second + "'");
310 }
311 }
312 operation = std::make_unique<CurlChecksumOp>(
313 handler, url, preferred, ts, m_logger, SendResponseInfo(),
314 GetConnCallout(),
315 m_header_callout.load(std::memory_order_acquire));
316 description = "checksum operation";
317 break;
318 }
320 {
321 const std::string path = arg.ToString();
322 m_logger->Debug(kLogXrdClHttp,
323 "XrdClHttp::Filesystem::Query xattr full_url %s, path %s",
324 m_url.GetURL().c_str(), path.c_str());
325 operation = std::make_unique<CurlQueryOp>(
326 handler, path, ts, m_logger, SendResponseInfo(),
327 GetConnCallout(), queryCode,
328 m_header_callout.load(std::memory_order_acquire));
329 description = "xattr query operation";
330 break;
331 }
332 default:
333 return XrdCl::XRootDStatus(
335 }
336
337 return QueueOperation(std::move(operation), description);
338}
std::string ToString() const
Convert the buffer to a string.
bool FromString(const std::string &url)
Parse a string and fill the URL fields.
Definition XrdClURL.cc:59
const ParamsMap & GetParams() const
Get the URL params.
Definition XrdClURL.hh:244
ChecksumType GetTypeFromString(const std::string &str)
const uint16_t errNotImplemented
Operation is not implemented.
@ XAttr
Query file extended attributes.
@ Opaque
Implementation dependent.
@ Checksum
Query file checksum.
@ Prepare
Query prepare status.

References XrdCl::QueryCode::Checksum, XrdCl::errInvalidArgs, XrdCl::errNotImplemented, XrdCl::URL::FromString(), XrdClHttp::Factory::GetHeaderTimeoutWithDefault(), XrdCl::URL::GetParams(), XrdClHttp::GetTypeFromString(), XrdClHttp::kAll, XrdClHttp::kLogXrdClHttp, XrdClHttp::kUnknown, XrdCl::QueryCode::Opaque, XrdCl::QueryCode::Prepare, XrdCl::stError, XrdCl::Buffer::ToString(), and XrdCl::QueryCode::XAttr.

Here is the call graph for this function:

◆ Rm()

XrdCl::XRootDStatus Filesystem::Rm ( const std::string & path,
XrdCl::ResponseHandler * handler,
time_t timeout )
overridevirtual
See also
XrdCl::FileSystem::Rm

Reimplemented from XrdCl::FileSystemPlugIn.

Definition at line 341 of file XrdClHttpFilesystem.cc.

344{
346
347 auto full_url = GetCurrentURL(path);
348 m_logger->Debug(kLogXrdClHttp, "Filesystem::Rm path %s", full_url.c_str());
349
350 auto deleteOp = std::make_unique<CurlDeleteOp>(
351 handler, full_url, ts, m_logger, SendResponseInfo(),
352 GetConnCallout(), m_header_callout.load(std::memory_order_acquire));
353 return QueueOperation(std::move(deleteOp), "filesystem delete operation");
354}

References XrdClHttp::Factory::GetHeaderTimeoutWithDefault(), and XrdClHttp::kLogXrdClHttp.

Referenced by RmDir().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ RmDir()

XrdCl::XRootDStatus Filesystem::RmDir ( const std::string & path,
XrdCl::ResponseHandler * handler,
time_t timeout )
overridevirtual
See also
XrdCl::FileSystem::RmDir

Reimplemented from XrdCl::FileSystemPlugIn.

Definition at line 357 of file XrdClHttpFilesystem.cc.

360{
361 return Rm(path, handler, timeout);
362}
virtual XrdCl::XRootDStatus Rm(const std::string &path, XrdCl::ResponseHandler *handler, time_t timeout) override

References Rm().

Here is the call graph for this function:

◆ SetProperty()

bool Filesystem::SetProperty ( const std::string & name,
const std::string & value )
overridevirtual
See also
XrdCl::FileSystem::SetProperty

Reimplemented from XrdCl::FileSystemPlugIn.

Definition at line 365 of file XrdClHttpFilesystem.cc.

367{
368 if (name == "XrdClHttpHeaderCallout") {
369 long long pointer;
370 try {
371 pointer = std::stoll(value, nullptr, 16);
372 } catch (...) {
373 pointer = 0;
374 }
375 if (!pointer) {
376 pointer = 0;
377 }
378 m_header_callout.store(reinterpret_cast<XrdClHttp::HeaderCallout*>(pointer), std::memory_order_release);
379 }
380
381 std::unique_lock lock(m_properties_mutex);
382 m_properties[name] = value;
383 return true;
384}

◆ Stat()

XrdCl::XRootDStatus Filesystem::Stat ( const std::string & path,
XrdCl::ResponseHandler * handler,
time_t timeout )
overridevirtual
See also
XrdCl::FileSystem::Stat

Reimplemented from XrdCl::FileSystemPlugIn.

Definition at line 387 of file XrdClHttpFilesystem.cc.

390{
392
393 auto full_url = GetCurrentURL(path);
394 m_logger->Debug(kLogXrdClHttp, "Filesystem::Stat path %s", full_url.c_str());
395
396 auto statOp = std::make_unique<CurlStatOp>(
397 handler, full_url, ts, m_logger, SendResponseInfo(),
398 GetConnCallout(), m_header_callout.load(std::memory_order_acquire));
399 return QueueOperation(std::move(statOp), "filesystem stat operation");
400}

References XrdClHttp::Factory::GetHeaderTimeoutWithDefault(), and XrdClHttp::kLogXrdClHttp.

Here is the call graph for this function:

◆ ThirdPartyCopy()

XrdCl::XRootDStatus Filesystem::ThirdPartyCopy ( const std::string & source,
const std::string & dest,
const XrdCl::PropertyList * properties,
XrdCl::ProgressHandler * progress_handler,
time_t timeout = 0 )
overridevirtual

Third party copy

The copy runs to completion before this method returns.

Parameters
sourcethe file to be copied from
destthe location the file is copied to
propertiesproperties of the copy, none if null
progress_handlerhandler notified while the copy runs, none if null
timeouttimeout value, if 0 the environment default is used
Returns
status of the operation

Implements XrdCl::ThirdPartyCopyPlugIn.

Definition at line 462 of file XrdClHttpFilesystem.cc.

467{
468 XrdCl::Log *const log = XrdCl::DefaultEnv::GetLog();
469 log->Debug(kLogXrdClHttp, "XrdClHttp::ThirdPartyCopy src %s dst %s", source.c_str(), dest.c_str());
470
471 if (!is_http_url(source) || !is_http_url(dest))
472 {
473 log->Error(kLogXrdClHttp, "Third party copy can only be done between http(s) protocols");
474 return XrdCl::XRootDStatus(XrdCl::stError, XrdCl::errInvalidArgs, 0,
475 "Third party copy can only be done between http(s) protocols");
476 }
477
478 TpcMode mode = TpcMode::Pull;
479 int number_of_streams = 1;
480 time_t init_timeout = 0;
481 time_t tpc_timeout = 0;
482 std::string token_file;
483 bool force_overwrite = false;
484
485 if (properties)
486 {
487 mode = properties->Get<std::string>("thirdPartyMode") != "push" ? TpcMode::Pull : TpcMode::Push;
488 properties->Get("initTimeout", init_timeout);
489 properties->Get("tpcTimeout", tpc_timeout);
490 token_file = properties->Get<std::string>("thirdPartyTokenFile");
491 properties->Get("force", force_overwrite);
492 }
493
494 // The tpcTimeout property takes precedence over the timeout argument.
495 if (tpc_timeout == 0)
496 tpc_timeout = timeout;
497
498 if (auto env = XrdCl::DefaultEnv::GetEnv(); env)
499 env->GetInt("SubStreamsPerChannel", number_of_streams);
500
501 CurlCopyOp::Headers headers;
502 CurlCopyOp::Headers src_hdrs;
503 CurlCopyOp::Headers dst_hdrs;
504
505 if (!token_file.empty() && !ParseTokenFile(token_file, src_hdrs, dst_hdrs))
506 return XrdCl::XRootDStatus(XrdCl::stError, XrdCl::errAuthFailed, 0,
507 "Failed to parse the token file '" + token_file + "'");
508
509 const auto is_unsecure = [] (const CurlCopyOp::Headers &hdrs, const std::string &url)
510 {
511 return XrdCl::URL(url).GetProtocol() != "https"s &&
512 std::any_of(hdrs.begin(), hdrs.end(),
513 [] (const auto &header) { return header.first == "Authorization"s; });
514 };
515
516 if (is_unsecure(src_hdrs, source) || is_unsecure(dst_hdrs, dest))
517 {
518 log->Error(kLogXrdClHttp, "Refusing to send an Authorization header over an unencrypted http URL");
519 return XrdCl::XRootDStatus(XrdCl::stError, XrdCl::errInvalidArgs, 0,
520 "Refusing to send an Authorization header over an unencrypted http URL");
521 }
522
523 // In push mode the source writes the destination with a PUT, which may
524 // replace an existing file whatever the Overwrite header says. Thus check
525 // the destination first, as the destination server may not honor it.
526 if (mode == TpcMode::Push && !force_overwrite &&
527 stat_size(*m_queue, dest, dst_hdrs, init_timeout, log, "destination"))
528 {
529 log->Error(kLogXrdClHttp, "The destination %s exists", dest.c_str());
530 return XrdCl::XRootDStatus(XrdCl::stError, XrdCl::errErrorResponse, kXR_ItExists,
531 "The destination exists; use --force to replace it");
532 }
533
534 headers.emplace_back("X-Number-Of-Streams"s, std::to_string(number_of_streams));
535
536 // The destination headers reach the destination in both modes: directly
537 // in pull mode, with the TransferHeader prefix in push mode.
538 dst_hdrs.emplace_back("Overwrite"s, force_overwrite ? "T"s : "F"s);
539
540 std::size_t size = 0;
541
542 if (progress_handler)
543 {
544 size = stat_size(*m_queue, source, src_hdrs, init_timeout, log, "source").value_or(0);
545 progress_handler->HandleProgress(0, size);
546 }
547
548 const auto rh = std::make_shared<SyncResponseHandler>();
549 const auto op = std::make_shared<CopyOp>(rh.get(), source, src_hdrs, dest, dst_hdrs, headers,
550 mode, timespec{tpc_timeout, 0}, log, nullptr);
551 op->SetProgressHandler(progress_handler);
552
553 try
554 {
555 m_queue->Produce(std::shared_ptr<CopyOp>(op.get(), [rh, op](auto){}));
556 }
557 catch (const std::exception &e) {
558 log->Warning(kLogXrdClHttp, "Failed to add copy op to queue - %s", e.what());
559 return XrdCl::XRootDStatus(XrdCl::stError, XrdCl::errInternal);
560 }
561
562 if (!rh->wait(std::chrono::seconds(tpc_timeout)))
563 return XrdCl::XRootDStatus(XrdCl::stError, XrdCl::errOperationExpired, 0, "Operation expired: Operation timed out"s);
564
565 if (op->IsDone() && !op->IsSentSuccessfully())
566 return XrdCl::XRootDStatus(XrdCl::stError, XrdCl::errPipelineFailed, 0, op->GetSendingFailureMessage());
567
568 if (progress_handler && size > 0)
569 progress_handler->HandleProgress(size, size);
570
571 return XrdCl::XRootDStatus();
572}
@ kXR_ItExists
static bool is_http_url(const std::string &url)
std::vector< std::pair< std::string, std::string > > Headers
static Log * GetLog()
Get default log.
static Env * GetEnv()
Get default client environment.
void Error(uint64_t topic, const char *format,...)
Report an error.
Definition XrdClLog.cc:231
void Warning(uint64_t topic, const char *format,...)
Report a warning.
Definition XrdClLog.cc:248
void Debug(uint64_t topic, const char *format,...)
Print a debug message.
Definition XrdClLog.cc:282
virtual void HandleProgress(std::size_t processed, std::size_t total=0)=0
bool Get(const std::string &name, Item &item) const
static std::optional< std::size_t > stat_size(HandlerQueue &queue, const std::string &url, const CurlCopyOp::Headers &hdrs, time_t timeout, XrdCl::Log *log, const char *what)
bool ParseTokenFile(const std::string &token_file, CurlCopyOp::Headers &src_hdrs, CurlCopyOp::Headers &dst_hdrs)
const uint16_t errErrorResponse
const uint16_t errOperationExpired
const uint16_t errInternal
Internal error.
const uint16_t errPipelineFailed
Pipeline failed and operation couldn't be executed.
const uint16_t errAuthFailed

References XrdCl::Log::Debug(), XrdCl::errAuthFailed, XrdCl::errErrorResponse, XrdCl::errInternal, XrdCl::errInvalidArgs, XrdCl::errOperationExpired, XrdCl::Log::Error(), XrdCl::errPipelineFailed, XrdCl::PropertyList::Get(), XrdCl::DefaultEnv::GetEnv(), XrdCl::DefaultEnv::GetLog(), XrdCl::URL::GetProtocol(), XrdCl::ProgressHandler::HandleProgress(), is_http_url(), XrdClHttp::kLogXrdClHttp, kXR_ItExists, XrdClHttp::ParseTokenFile(), XrdClHttp::Pull, XrdClHttp::Push, XrdClHttp::stat_size(), XrdCl::stError, and XrdCl::Log::Warning().

Here is the call graph for this function:

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