XRootD
XrdClHttpFileSystemPlugIn.cc
Go to the documentation of this file.
1 
6 
7 #include <mutex>
8 
9 #include "davix.hpp"
10 
11 #include "XrdCl/XrdClDefaultEnv.hh"
12 #include "XrdCl/XrdClLog.hh"
14 
18 
19 namespace XrdCl {
20 
21 Davix::Context *root_ctx_ = NULL;
22 Davix::DavPosix *root_davix_client_ = NULL;
23 
25  : url_(url), logger_(DefaultEnv::GetLog()) {
26  SetUpLogging(logger_);
27  logger_->Debug(kLogXrdClHttp,
28  "HttpFileSystemPlugIn constructed with URL: %s.",
29  url_.GetObfuscatedURL().c_str());
30  std::string origin = getenv("XRDXROOTD_PROXY")? getenv("XRDXROOTD_PROXY") : "";
31 
32  if (getenv("DAVIX_DBG_LOGGING_IN_XRD")) {
33  Davix::setLogScope(DAVIX_LOG_HEADER | DAVIX_LOG_S3 | DAVIX_LOG_BODY | DAVIX_LOG_CHAIN);
34  Davix::setLogLevel(DAVIX_LOG_DEBUG);
35  }
36  if ( origin.empty() || origin.find("=") == 0) {
37  ctx_ = new Davix::Context();
38  davix_client_ = new Davix::DavPosix(ctx_);
39  }
40  else {
41  if (root_ctx_ == NULL) {
42  root_ctx_ = new Davix::Context();
43  if (getenv("DAVIX_LOAD_GRID_MODULE_IN_XRD"))
44  root_ctx_->loadModule("grid");
45  root_davix_client_ = new Davix::DavPosix(root_ctx_);
46  }
47  ctx_ = root_ctx_;
48  davix_client_ = root_davix_client_;
49  }
50 }
51 
52 // destructor of davix_client_ or ctx_ will call something in ssl3 lib
53 // which reset errno. We need to preserve errno so that XrdPssSys::Stat
54 // will see it.
56  int rc = errno;
57  if (root_ctx_ == NULL) {
58  delete davix_client_;
59  delete ctx_;
60  }
61  errno = rc;
62 }
63 
64 XRootDStatus HttpFileSystemPlugIn::Mv(const std::string &source,
65  const std::string &dest,
66  ResponseHandler *handler,
67  uint16_t timeout) {
68  //const auto full_source_path = url_.GetLocation() + source;
69  //const auto full_dest_path = url_.GetLocation() + dest;
70  const auto full_source_path = url_.GetProtocol() + "://"
71  + url_.GetHostName() + ":"
72  + std::to_string(url_.GetPort())
73  + source;
74  const auto full_dest_path = url_.GetProtocol() + "://"
75  + url_.GetHostName() + ":"
76  + std::to_string(url_.GetPort())
77  + dest;
78 
79  logger_->Debug(kLogXrdClHttp,
80  "HttpFileSystemPlugIn::Mv - src = %s, dest = %s, timeout = %d",
81  full_source_path.c_str(), full_dest_path.c_str(), timeout);
82 
83  auto status =
84  Posix::Rename(*davix_client_, full_source_path, full_dest_path, timeout);
85 
86  if (status.IsError()) {
87  logger_->Error(kLogXrdClHttp, "Mv failed: %s", status.ToStr().c_str());
88  return status;
89  }
90 
91  handler->HandleResponse(new XRootDStatus(status), nullptr);
92 
93  return XRootDStatus();
94 }
95 
96 XRootDStatus HttpFileSystemPlugIn::Rm(const std::string &path,
97  ResponseHandler *handler,
98  uint16_t timeout) {
99  auto url = url_;
100  url.SetPath(path);
101 
102  logger_->Debug(kLogXrdClHttp,
103  "HttpFileSystemPlugIn::Rm - path = %s, timeout = %d",
104  url.GetObfuscatedURL().c_str(), timeout);
105 
106  auto status = Posix::Unlink(*davix_client_, url.GetURL(), timeout);
107 
108  if (status.IsError()) {
109  logger_->Error(kLogXrdClHttp, "Rm failed: %s", status.ToStr().c_str());
110  return status;
111  }
112 
113  handler->HandleResponse(new XRootDStatus(status), nullptr);
114 
115  return XRootDStatus();
116 }
117 
119  MkDirFlags::Flags flags,
120  Access::Mode mode,
121  ResponseHandler *handler,
122  uint16_t timeout) {
123  auto url = url_;
124  url.SetPath(path);
125 
126  logger_->Debug(
128  "HttpFileSystemPlugIn::MkDir - path = %s, flags = %d, timeout = %d",
129  url.GetObfuscatedURL().c_str(), flags, timeout);
130 
131  auto status = Posix::MkDir(*davix_client_, url.GetURL(), flags, mode, timeout);
132  if (status.IsError()) {
133  logger_->Error(kLogXrdClHttp, "MkDir failed: %s", status.ToStr().c_str());
134  return status;
135  }
136 
137  handler->HandleResponse(new XRootDStatus(status), nullptr);
138 
139  return XRootDStatus();
140 }
141 
143  ResponseHandler *handler,
144  uint16_t timeout) {
145  auto url = url_;
146  url.SetPath(path);
147 
148  logger_->Debug(kLogXrdClHttp,
149  "HttpFileSystemPlugIn::RmDir - path = %s, timeout = %d",
150  url.GetObfuscatedURL().c_str(), timeout);
151 
152  auto status = Posix::RmDir(*davix_client_, url.GetURL(), timeout);
153  if (status.IsError()) {
154  logger_->Error(kLogXrdClHttp, "RmDir failed: %s", status.ToStr().c_str());
155  return status;
156  }
157 
158  handler->HandleResponse(new XRootDStatus(status), nullptr);
159  return XRootDStatus();
160 }
161 
163  DirListFlags::Flags flags,
164  ResponseHandler *handler,
165  uint16_t timeout) {
166  auto url = url_;
167  url.SetPath(path);
168  const auto full_path = url.GetLocation();
169 
170  logger_->Debug(
172  "HttpFileSystemPlugIn::DirList - path = %s, flags = %d, timeout = %d",
173  full_path.c_str(), flags, timeout);
174 
175  const bool details = flags & DirListFlags::Stat;
176  const bool recursive = flags & DirListFlags::Recursive;
177 
178  // res == std::pair<DirectoryList*, XRootDStatus>
179  auto res =
180  Posix::DirList(*davix_client_, full_path, details, recursive, timeout);
181  if (res.second.IsError()) {
182  logger_->Error(kLogXrdClHttp, "Could not list dir: %s, error: %s",
183  full_path.c_str(), res.second.ToStr().c_str());
184  return res.second;
185  }
186 
187  auto obj = new AnyObject();
188  obj->Set(res.first);
189 
190  handler->HandleResponse(new XRootDStatus(), obj);
191  return XRootDStatus();
192 }
193 
194 XRootDStatus HttpFileSystemPlugIn::Stat(const std::string &path,
195  ResponseHandler *handler,
196  uint16_t timeout) {
197  //const auto full_path = url_.GetLocation() + path;
198  const auto full_path = url_.GetProtocol() + "://" +
199  url_.GetHostName() + ":" +
200  std::to_string(url_.GetPort()) + "/" + path;
201 
202  logger_->Debug(kLogXrdClHttp,
203  "HttpFileSystemPlugIn::Stat - path = %s, timeout = %d",
204  full_path.c_str(), timeout);
205 
206  auto stat_info = new StatInfo();
207  //XRootDStatus status;
208  auto status = Posix::Stat(*davix_client_, full_path, timeout, stat_info);
209 
210  if (status.IsError()) {
211  logger_->Error(kLogXrdClHttp, "Stat failed: %s", status.ToStr().c_str());
212  return status;
213  }
214 
215  auto obj = new AnyObject();
216  obj->Set(stat_info);
217 
218  handler->HandleResponse(new XRootDStatus(), obj);
219 
220  return XRootDStatus();
221 }
222 
223 bool HttpFileSystemPlugIn::SetProperty(const std::string &name,
224  const std::string &value) {
225  properties_[name] = value;
226  return true;
227 }
228 
229 bool HttpFileSystemPlugIn::GetProperty(const std::string &name,
230  std::string &value) const {
231  const auto p = properties_.find(name);
232  if (p == std::end(properties_)) {
233  return false;
234  }
235 
236  value = p->second;
237  return true;
238 }
239 
240 } // namespace XrdCl
virtual XRootDStatus Rm(const std::string &path, ResponseHandler *handler, uint16_t timeout) override
virtual bool GetProperty(const std::string &name, std::string &value) const override
virtual XRootDStatus DirList(const std::string &path, DirListFlags::Flags flags, ResponseHandler *handler, uint16_t timeout) override
virtual XRootDStatus Mv(const std::string &source, const std::string &dest, ResponseHandler *handler, uint16_t timeout) override
virtual XRootDStatus Stat(const std::string &path, ResponseHandler *handler, uint16_t timeout) override
virtual XRootDStatus RmDir(const std::string &path, ResponseHandler *handler, uint16_t timeout) override
virtual XRootDStatus MkDir(const std::string &path, MkDirFlags::Flags flags, Access::Mode mode, ResponseHandler *handler, uint16_t timeout) override
HttpFileSystemPlugIn(const std::string &url)
virtual bool SetProperty(const std::string &name, const std::string &value) override
void Error(uint64_t topic, const char *format,...)
Report an error.
Definition: XrdClLog.cc:231
void Debug(uint64_t topic, const char *format,...)
Print a debug message.
Definition: XrdClLog.cc:282
Handle an async response.
virtual void HandleResponse(XRootDStatus *status, AnyObject *response)
Object stat info.
const std::string & GetHostName() const
Get the name of the target host.
Definition: XrdClURL.hh:170
const std::string & GetProtocol() const
Get the protocol.
Definition: XrdClURL.hh:118
std::string GetObfuscatedURL() const
Get the URL with authz information obfuscated.
Definition: XrdClURL.cc:491
void SetPath(const std::string &path)
Set the path.
Definition: XrdClURL.hh:225
int GetPort() const
Get the target port.
Definition: XrdClURL.hh:188
XRootDStatus Unlink(Davix::DavPosix &davix_client, const std::string &url, uint16_t timeout)
XRootDStatus RmDir(Davix::DavPosix &davix_client, const std::string &path, uint16_t timeout)
std::pair< XrdCl::DirectoryList *, XrdCl::XRootDStatus > DirList(Davix::DavPosix &davix_client, const std::string &path, bool details, bool, uint16_t timeout)
XRootDStatus MkDir(Davix::DavPosix &davix_client, const std::string &path, XrdCl::MkDirFlags::Flags flags, XrdCl::Access::Mode, uint16_t timeout)
XRootDStatus Rename(Davix::DavPosix &davix_client, const std::string &source, const std::string &dest, uint16_t timeout)
XRootDStatus Stat(Davix::DavPosix &davix_client, const std::string &url, uint16_t timeout, StatInfo *stat_info)
Davix::Context * root_ctx_
Davix::DavPosix * root_davix_client_
void SetUpLogging(Log *logger)
static const uint64_t kLogXrdClHttp
Mode
Access mode.
@ Stat
Stat each entry.
@ Recursive
Do a recursive listing.