XRootD
Loading...
Searching...
No Matches
XrdClHttpFileSystemPlugIn.cc
Go to the documentation of this file.
1
4
6
7#include <mutex>
8
9#include "davix.hpp"
10
12#include "XrdCl/XrdClLog.hh"
14
18
19namespace XrdCl {
20
21Davix::Context *root_ctx_ = NULL;
22Davix::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
64XRootDStatus 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
96XRootDStatus 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
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
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
223bool HttpFileSystemPlugIn::SetProperty(const std::string &name,
224 const std::string &value) {
225 properties_[name] = value;
226 return true;
227}
228
229bool 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
Handle an async response.
virtual void HandleResponse(XRootDStatus *status, AnyObject *response)
Object stat info.
XRootDStatus Unlink(Davix::DavPosix &davix_client, const std::string &url, uint16_t timeout)
XRootDStatus Rename(Davix::DavPosix &davix_client, const std::string &source, const std::string &dest, uint16_t timeout)
MkDirImpl< false > MkDir
StatImpl< false > Stat(Ctx< File > file, Arg< bool > force, uint16_t timeout=0)
Davix::Context * root_ctx_
Davix::DavPosix * root_davix_client_
RmDirImpl< false > RmDir
void SetUpLogging(Log *logger)
static const uint64_t kLogXrdClHttp
DirListImpl< false > DirList
Response NullRef< Response >::value
@ Stat
Stat each entry.
@ Recursive
Do a recursive listing.