33 m_logger->Debug(
kLogXrdClHttp,
"Constructing filesystem object with base URL %s", url.c_str());
52 auto full_url = GetCurrentURL(path);
54 m_logger->Debug(
kLogXrdClHttp,
"Filesystem::DirList path %s", path.c_str());
55 std::unique_ptr<XrdClHttp::CurlListdirOp> listdirOp(
58 m_url.GetHostName() +
":" + std::to_string(m_url.GetPort()),
59 SendResponseInfo(),
ts, m_logger,
60 GetConnCallout(), m_header_callout.load(std::memory_order_acquire)
65 m_queue->Produce(std::move(listdirOp));
67 m_logger->Warning(
kLogXrdClHttp,
"Failed to add dirlist op to queue");
75Filesystem::GetConnCallout()
const {
76 std::string pointer_str;
77 if (!
GetProperty(
"XrdClConnectionCallout", pointer_str) && pointer_str.empty()) {
82 pointer = std::stoll(pointer_str,
nullptr, 16);
94 std::string &value)
const
96 std::shared_lock lock(m_properties_mutex);
98 const auto p = m_properties.find(name);
99 if (p == std::end(m_properties)) {
120 auto locateInfo = std::make_unique<XrdCl::LocationInfo>();
123 auto obj = std::make_unique<XrdCl::AnyObject>();
124 obj->Set(locateInfo.release());
138 auto full_url = GetCurrentURL(path);
139 m_logger->Debug(
kLogXrdClHttp,
"Filesystem::MkDir path %s", full_url.c_str());
141 std::unique_ptr<CurlMkcolOp> mkdirOp(
143 handler, full_url,
ts, m_logger, SendResponseInfo(), GetConnCallout(),
144 m_header_callout.load(std::memory_order_acquire)
148 m_queue->Produce(std::move(mkdirOp));
150 m_logger->Warning(
kLogXrdClHttp,
"Failed to add filesystem mkdir op to queue");
166 auto url = GetCurrentURL(arg.
ToString());
167 m_logger->Debug(
kLogXrdClHttp,
"XrdClHttp::Filesystem::Query checksum path %s", url.c_str());
172 auto iter = url_obj.
GetParams().find(
"cks.type");
178 m_logger->Error(
kLogXrdClHttp,
"Unknown checksum type %s", iter->second.c_str());
183 std::unique_ptr<CurlChecksumOp> cksumOp(
185 handler, url, preferred,
ts, m_logger, SendResponseInfo(),
186 GetConnCallout(), m_header_callout.load(std::memory_order_acquire)
191 m_queue->Produce(std::move(cksumOp));
195 m_logger->Warning(
kLogXrdClHttp,
"Failed to add checksum operation to queue");
202 std::string full_url = m_url.GetURL();
203 m_logger->Debug(
kLogXrdClHttp,
"XrdClHttp::Filesystem::Query xattr full_url %s, path %s", full_url.c_str(), path.c_str());
204 full_url = m_url.GetURL();
205 std::unique_ptr<CurlQueryOp> queryOp(
207 handler, path,
ts, m_logger,SendResponseInfo(),
208 GetConnCallout(), queryCode, m_header_callout.load(std::memory_order_acquire)
213 m_queue->Produce(std::move(queryOp));
217 m_logger->Warning(
kLogXrdClHttp,
"Failed to add xattr query operation to queue");
235 auto full_url = GetCurrentURL(path);
236 m_logger->Debug(
kLogXrdClHttp,
"Filesystem::Rm path %s", full_url.c_str());
238 std::unique_ptr<CurlDeleteOp> deleteOp(
240 handler, full_url,
ts, m_logger, SendResponseInfo(),
241 GetConnCallout(), m_header_callout.load(std::memory_order_acquire)
245 m_queue->Produce(std::move(deleteOp));
247 m_logger->Warning(
kLogXrdClHttp,
"Failed to add filesystem delete op to queue");
259 return Rm(path, handler, timeout);
264 const std::string &value)
266 if (name ==
"XrdClHttpHeaderCallout") {
269 pointer = std::stoll(value,
nullptr, 16);
279 std::unique_lock lock(m_properties_mutex);
280 m_properties[name] = value;
291 auto full_url = GetCurrentURL(path);
292 m_logger->Debug(
kLogXrdClHttp,
"Filesystem::Stat path %s", full_url.c_str());
294 std::unique_ptr<CurlStatOp> statOp(
296 handler, full_url,
ts, m_logger, SendResponseInfo(),
297 GetConnCallout(), m_header_callout.load(std::memory_order_acquire)
301 m_queue->Produce(std::move(statOp));
303 m_logger->Warning(
kLogXrdClHttp,
"Failed to add filesystem stat op to queue");
310bool Filesystem::SendResponseInfo()
const {
315std::string Filesystem::GetCurrentURL(
const std::string &path)
const {
318 auto prefix = m_url.
GetURL();
319 std::string_view prefix_view = prefix;
320 while (!prefix_view.empty() && prefix_view[prefix_view.size() - 1] ==
'/')
321 prefix_view = prefix_view.substr(0, prefix_view.size() - 1);
324 std::string_view path_view = path;
325 while (!path_view.empty() && path_view[0] ==
'/')
326 path_view = path_view.substr(1);
327 auto retval = std::string(prefix_view) +
"/" + std::string(path_view);
331 std::shared_lock lock(m_properties_mutex);
332 auto iter = m_properties.find(
"XrdClHttpQueryParam");
333 if (iter != m_properties.end() && !iter->second.empty()) {
334 retval += ((retval.find(
'?') == std::string::npos) ?
'?' :
':') + iter->second;
static std::string ts()
timestamp output for logging messages
#define ResponseInfoProperty
static struct timespec GetHeaderTimeoutWithDefault(time_t oper_timeout)
virtual XrdCl::XRootDStatus MkDir(const std::string &path, XrdCl::MkDirFlags::Flags flags, XrdCl::Access::Mode mode, XrdCl::ResponseHandler *handler, time_t timeout) override
virtual bool SetProperty(const std::string &name, const std::string &value) override
XrdCl::XRootDStatus DirList(const std::string &path, XrdCl::DirListFlags::Flags flags, 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 Stat(const std::string &path, XrdCl::ResponseHandler *handler, time_t timeout) override
virtual XrdCl::XRootDStatus Locate(const std::string &path, XrdCl::OpenFlags::Flags flags, XrdCl::ResponseHandler *handler, time_t timeout) override
virtual ~Filesystem() noexcept
virtual XrdCl::XRootDStatus RmDir(const std::string &path, XrdCl::ResponseHandler *handler, time_t timeout) override
virtual bool GetProperty(const std::string &name, std::string &value) const override
virtual XrdCl::XRootDStatus Query(XrdCl::QueryCode::Code queryCode, const XrdCl::Buffer &arg, XrdCl::ResponseHandler *handler, time_t timeout) override
Filesystem(const std::string &, std::shared_ptr< HandlerQueue > queue, XrdCl::Log *log)
Binary blob representation.
std::string ToString() const
Convert the buffer to a string.
@ Read
read access is allowed
@ ServerOnline
server node where the file is online
Handle an async response.
virtual void HandleResponse(XRootDStatus *status, AnyObject *response)
std::map< std::string, std::string > ParamsMap
bool FromString(const std::string &url)
Parse a string and fill the URL fields.
std::string GetURL() const
Get the URL.
const ParamsMap & GetParams() const
Get the URL params.
ConnectionCallout *(*)(const std::string &, const ResponseInfo &) CreateConnCalloutType
ChecksumType GetTypeFromString(const std::string &str)
const uint64_t kLogXrdClHttp
const uint16_t errNotImplemented
Operation is not implemented.
const uint16_t stError
An error occurred that could potentially be retried.
const uint16_t errOSError
Flags
Open flags, may be or'd when appropriate.
Code
XRootD query request codes.
@ XAttr
Query file extended attributes.
@ Checksum
Query file checksum.