31#ifndef CPL_AWS_INCLUDED_H
32#define CPL_AWS_INCLUDED_H
46CPLString CPLGetLowerCaseHexSHA256(
const void *pabyData,
size_t nBytes );
53CPLString CPLAWSGetHeaderVal(
const struct curl_slist* psExistingHeaders,
57CPLGetAWS_SIGN4_Signature(
const CPLString& osSecretAccessKey,
63 const struct curl_slist* psExistingHeaders,
78 const struct curl_slist* psExistingHeaders,
85class IVSIS3LikeHandleHelper
90 std::map<CPLString, CPLString> m_oMapQueryParameters{};
92 virtual void RebuildURL() = 0;
93 CPLString GetQueryString(
bool bAddEmptyValueAfterEqual)
const;
96 IVSIS3LikeHandleHelper() =
default;
97 virtual ~IVSIS3LikeHandleHelper() =
default;
99 void ResetQueryParameters();
100 void AddQueryParameter(
const CPLString& osKey,
const CPLString& osValue);
102 virtual struct curl_slist* GetCurlHeaders(
const CPLString& osVerb,
103 const struct curl_slist* psExistingHeaders,
104 const void *pabyDataContent =
nullptr,
105 size_t nBytesContent = 0)
const = 0;
107 virtual bool AllowAutomaticRedirection() {
return true; }
108 virtual bool CanRestartOnError(
const char*,
const char* ,
109 bool ,
bool* =
nullptr) {
return false;}
111 virtual const CPLString& GetURL()
const = 0;
112 CPLString GetURLNoKVP()
const;
114 virtual CPLString GetCopySourceHeader()
const {
return std::string(); }
115 virtual const char* GetMetadataDirectiveREPLACE()
const {
return ""; }
117 static bool GetBucketAndObjectKey(
const char* pszURI,
118 const char* pszFSPrefix,
120 CPLString &osBucketOut,
121 CPLString &osObjectKeyOut);
123 static CPLString BuildCanonicalizedHeaders(
124 std::map<CPLString, CPLString>& oSortedMapHeaders,
125 const struct curl_slist* psExistingHeaders,
126 const char* pszHeaderPrefix);
128 static CPLString GetRFC822DateTime();
131class VSIS3HandleHelper final:
public IVSIS3LikeHandleHelper
136 mutable CPLString m_osSecretAccessKey{};
137 mutable CPLString m_osAccessKeyId{};
138 mutable CPLString m_osSessionToken{};
139 CPLString m_osEndpoint{};
140 CPLString m_osRegion{};
141 CPLString m_osRequestPayer{};
142 CPLString m_osBucket{};
143 CPLString m_osObjectKey{};
144 bool m_bUseHTTPS =
false;
145 bool m_bUseVirtualHosting =
false;
146 bool m_bFromEC2 =
false;
148 void RebuildURL()
override;
150 static bool GetConfigurationFromEC2(CPLString& osSecretAccessKey,
151 CPLString& osAccessKeyId,
152 CPLString& osSessionToken);
154 static bool GetConfigurationFromAWSConfigFiles(
155 CPLString& osSecretAccessKey,
156 CPLString& osAccessKeyId,
157 CPLString& osSessionToken,
159 CPLString& osCredentials);
162 CPLString& osSecretAccessKey,
163 CPLString& osAccessKeyId,
164 CPLString& osSessionToken,
170 VSIS3HandleHelper(
const CPLString& osSecretAccessKey,
171 const CPLString& osAccessKeyId,
172 const CPLString& osSessionToken,
173 const CPLString& osEndpoint,
174 const CPLString& osRegion,
175 const CPLString& osRequestPayer,
176 const CPLString& osBucket,
177 const CPLString& osObjectKey,
178 bool bUseHTTPS,
bool bUseVirtualHosting,
bool bFromEC2);
179 ~VSIS3HandleHelper();
181 static VSIS3HandleHelper* BuildFromURI(
const char* pszURI,
182 const char* pszFSPrefix,
185 static CPLString BuildURL(
const CPLString& osEndpoint,
186 const CPLString& osBucket,
187 const CPLString& osObjectKey,
188 bool bUseHTTPS,
bool bUseVirtualHosting);
190 struct curl_slist* GetCurlHeaders(
191 const CPLString& osVerb,
192 const struct curl_slist* psExistingHeaders,
193 const void *pabyDataContent =
nullptr,
194 size_t nBytesContent = 0)
const override;
196 bool AllowAutomaticRedirection()
override {
return false; }
197 bool CanRestartOnError(
const char*,
const char* pszHeaders,
199 bool* pbUpdateMap =
nullptr)
override;
201 const CPLString& GetURL()
const override {
return m_osURL; }
202 const CPLString& GetBucket()
const {
return m_osBucket; }
203 const CPLString& GetObjectKey()
const {
return m_osObjectKey; }
204 const CPLString& GetEndpoint()
const {
return m_osEndpoint; }
205 const CPLString& GetRegion()
const {
return m_osRegion; }
206 const CPLString& GetRequestPayer()
const {
return m_osRequestPayer; }
207 bool GetVirtualHosting()
const {
return m_bUseVirtualHosting; }
208 void SetEndpoint(
const CPLString &osStr);
209 void SetRegion(
const CPLString &osStr);
210 void SetRequestPayer(
const CPLString &osStr);
211 void SetVirtualHosting(
bool b);
213 CPLString GetCopySourceHeader()
const override {
return "x-amz-copy-source"; }
214 const char* GetMetadataDirectiveREPLACE()
const override {
return "x-amz-metadata-directive: REPLACE"; }
218 static void CleanMutex();
219 static void ClearCache();
222class VSIS3UpdateParams
225 CPLString m_osRegion{};
226 CPLString m_osEndpoint{};
227 CPLString m_osRequestPayer{};
228 bool m_bUseVirtualHosting =
false;
230 VSIS3UpdateParams() =
default;
232 explicit VSIS3UpdateParams(
const VSIS3HandleHelper* poHelper) :
233 m_osRegion(poHelper->GetRegion()),
234 m_osEndpoint(poHelper->GetEndpoint()),
235 m_osRequestPayer(poHelper->GetRequestPayer()),
236 m_bUseVirtualHosting(poHelper->GetVirtualHosting()) {}
238 void UpdateHandlerHelper(VSIS3HandleHelper* poHelper) {
239 poHelper->SetRegion(m_osRegion);
240 poHelper->SetEndpoint(m_osEndpoint);
241 poHelper->SetRequestPayer(m_osRequestPayer);
242 poHelper->SetVirtualHosting(m_bUseVirtualHosting);
245 static std::mutex gsMutex;
246 static std::map< CPLString, VSIS3UpdateParams > goMapBucketsToS3Params;
247 static void UpdateMapFromHandle( IVSIS3LikeHandleHelper* poHandleHelper );
248 static void UpdateHandleFromMap( IVSIS3LikeHandleHelper* poHandleHelper );
249 static void ClearCache();
Convenient string class based on std::string.
Definition cpl_string.h:333
#define CPL_DISALLOW_COPY_ASSIGN(ClassName)
Helper to remove the copy and assignment constructors so that the compiler will not generate the defa...
Definition cpl_port.h:955
char ** CSLConstList
Type of a constant null-terminated list of nul terminated strings.
Definition cpl_port.h:1169
Various convenience functions for working with strings and string lists.