32 OpenResponseHandler(
bool *is_opened, XrdCl::ResponseHandler *handler)
33 : m_is_opened(is_opened),
38 virtual void HandleResponse(XrdCl::XRootDStatus *status, XrdCl::AnyObject *response) {
40 std::unique_ptr<OpenResponseHandler> owner(
this);
42 if (status && status->
IsOK()) {
43 if (m_is_opened) *m_is_opened =
true;
45 if (m_handler) m_handler->HandleResponse(status, response);
54 XrdCl::ResponseHandler *m_handler;
59 CloseResponseHandler(
bool *is_opened, XrdCl::ResponseHandler *handler)
60 : m_is_opened(is_opened),
65 virtual void HandleResponse(XrdCl::XRootDStatus *status, XrdCl::AnyObject *response) {
66 std::unique_ptr<CloseResponseHandler> owner(
this);
68 if (status && status->
IsOK()) {
69 if (m_is_opened) *m_is_opened =
false;
71 if (m_handler) m_handler->HandleResponse(status, response);
80 XrdCl::ResponseHandler *m_handler;
97 return m_wrapped_file->Close(
new CloseResponseHandler(&m_is_opened, handler), timeout);
108 std::string &value)
const
110 std::unique_lock lock(m_properties_mutex);
111 const auto p = m_properties.find(name);
112 if (p == std::end(m_properties)) {
120std::tuple<XrdCl::XRootDStatus, std::string, XrdCl::File*>
121File::GetFileHandle(
const std::string &s3_url) {
122 if (m_wrapped_file) {
126 std::string s3_noslash_url;
127 auto schema_loc = s3_url.find(
"://");
128 if (schema_loc != std::string::npos) {
129 auto path_loc = s3_url.find(
'/', schema_loc + 3);
130 if (path_loc != std::string::npos) {
131 if (s3_url.size() >= path_loc && s3_url[path_loc + 1] ==
'/') {
132 s3_noslash_url = s3_url.substr(0, path_loc) + s3_url.substr(path_loc + 1);
137 std::string https_url, err_msg;
141 auto loc = https_url.find(
'/', 8);
142 if (loc == std::string::npos) {
151 std::unique_ptr<XrdCl::File> wrapped_file(
new XrdCl::File());
156 if (!status.
IsOK()) {
157 return std::make_tuple(status,
"",
nullptr);
160 std::stringstream ss;
161 ss << std::hex << reinterpret_cast<long long>(&m_header_callout);
162 if (!wrapped_file->SetProperty(
"XrdClHttpHeaderCallout", ss.str())) {
165 m_wrapped_file.reset(wrapped_file.release());
167 return std::make_tuple(XrdCl::XRootDStatus{}, https_url, m_wrapped_file.get());
178 m_logger->Error(
kLogXrdClS3,
"URL %s already open", url.c_str());
182 auto [st, https_url, fs] = GetFileHandle(url);
187 return fs->Open(https_url, flags, mode,
new OpenResponseHandler(&m_is_opened, handler), timeout);
197 return m_wrapped_file->PgRead(offset, size, buffer, handler, timeout);
208 return m_wrapped_file->Read(offset, size, buffer, handler, timeout);
213 const std::string &value)
215 std::unique_lock lock(m_properties_mutex);
216 m_properties[name] = value;
225 return m_wrapped_file->Stat(force, handler, timeout);
234 return m_wrapped_file->VectorRead(chunks, buffer, handler, timeout);
244 return m_wrapped_file->Write(offset, size, buffer, handler, timeout);
253 return m_wrapped_file->Write(offset, std::move(buffer), handler, timeout);
256std::shared_ptr<XrdClHttp::HeaderCallout::HeaderList>
257File::S3HeaderCallout::GetHeaders(
const std::string &verb,
258 const std::string &url,
261 std::string auth_token, err_msg;
262 std::shared_ptr<HeaderList> header_list(
new HeaderList(headers));
264 header_list->emplace_back(
"Authorization", auth_token);
266 m_parent.m_logger->
Error(
kLogXrdClS3,
"Failed to generate V4 signature: %s", err_msg.c_str());
static bool GenerateHttpUrl(const std::string &s3_url, std::string &https_url, std::string *obj_result, std::string &err_msg)
static bool GenerateV4Signature(const std::string &url, const std::string &verb, std::vector< std::pair< std::string, std::string > > &headers, std::string &auth_token, std::string &err_msg)
virtual XrdCl::XRootDStatus Open(const std::string &url, XrdCl::OpenFlags::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
virtual bool IsOpen() const override
virtual XrdCl::XRootDStatus VectorRead(const XrdCl::ChunkList &chunks, void *buffer, XrdCl::ResponseHandler *handler, time_t timeout) override
virtual XrdCl::XRootDStatus Write(uint64_t offset, uint32_t size, const void *buffer, XrdCl::ResponseHandler *handler, time_t timeout) override
virtual bool GetProperty(const std::string &name, std::string &value) const override
virtual XrdCl::XRootDStatus PgRead(uint64_t offset, uint32_t size, void *buffer, XrdCl::ResponseHandler *handler, time_t timeout) override
virtual XrdCl::XRootDStatus Read(uint64_t offset, uint32_t size, void *buffer, XrdCl::ResponseHandler *handler, time_t timeout) override
virtual XrdCl::XRootDStatus Stat(bool force, XrdCl::ResponseHandler *handler, time_t timeout) override
virtual XrdCl::XRootDStatus Close(XrdCl::ResponseHandler *handler, time_t timeout) override
Binary blob representation.
void Error(uint64_t topic, const char *format,...)
Report an error.
Handle an async response.
bool FromString(const std::string &url)
Parse a string and fill the URL fields.
std::string GetURL() const
Get the URL.
const uint64_t kLogXrdClS3
const uint16_t errInvalidAddr
const uint16_t stError
An error occurred that could potentially be retried.
const uint16_t errInvalidOp
std::vector< ChunkInfo > ChunkList
List of chunks.
Flags
Open flags, may be or'd when appropriate.
bool IsOK() const
We're fine.