31 #ifndef CPL_AWS_INCLUDED_H
32 #define CPL_AWS_INCLUDED_H
43 #include <curl/curl.h>
46 CPLString CPLGetLowerCaseHexSHA256(
const void *pabyData,
size_t nBytes );
53 CPLString CPLAWSGetHeaderVal(
const struct curl_slist* psExistingHeaders,
57 CPLGetAWS_SIGN4_Signature(
const CPLString& osSecretAccessKey,
63 const struct curl_slist* psExistingHeaders,
78 const struct curl_slist* psExistingHeaders,
85 class 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();
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;
114 virtual CPLString GetCopySourceHeader()
const {
return std::string(); }
116 static bool GetBucketAndObjectKey(
const char* pszURI,
117 const char* pszFSPrefix,
122 static CPLString BuildCanonicalizedHeaders(
123 std::map<CPLString, CPLString>& oSortedMapHeaders,
124 const struct curl_slist* psExistingHeaders,
125 const char* pszHeaderPrefix);
130 class VSIS3HandleHelper final:
public IVSIS3LikeHandleHelper
143 bool m_bUseHTTPS =
false;
144 bool m_bUseVirtualHosting =
false;
145 bool m_bFromEC2 =
false;
147 void RebuildURL()
override;
149 static bool GetConfigurationFromEC2(
CPLString& osSecretAccessKey,
153 static bool GetConfigurationFromAWSConfigFiles(
169 VSIS3HandleHelper(
const CPLString& osSecretAccessKey,
177 bool bUseHTTPS,
bool bUseVirtualHosting,
bool bFromEC2);
178 ~VSIS3HandleHelper();
180 static VSIS3HandleHelper* BuildFromURI(
const char* pszURI,
181 const char* pszFSPrefix,
187 bool bUseHTTPS,
bool bUseVirtualHosting);
189 struct curl_slist* GetCurlHeaders(
191 const struct curl_slist* psExistingHeaders,
192 const void *pabyDataContent =
nullptr,
193 size_t nBytesContent = 0)
const override;
195 bool AllowAutomaticRedirection()
override {
return false; }
196 bool CanRestartOnError(
const char*,
const char* pszHeaders,
198 bool* pbUpdateMap =
nullptr)
override;
200 const CPLString& GetURL()
const override {
return m_osURL; }
201 const CPLString& GetBucket()
const {
return m_osBucket; }
202 const CPLString& GetObjectKey()
const {
return m_osObjectKey; }
203 const CPLString& GetEndpoint()
const {
return m_osEndpoint; }
204 const CPLString& GetRegion()
const {
return m_osRegion; }
205 const CPLString& GetRequestPayer()
const {
return m_osRequestPayer; }
206 bool GetVirtualHosting()
const {
return m_bUseVirtualHosting; }
207 void SetEndpoint(
const CPLString &osStr);
209 void SetRequestPayer(
const CPLString &osStr);
210 void SetVirtualHosting(
bool b);
212 CPLString GetCopySourceHeader()
const override {
return "x-amz-copy-source"; }
216 static void CleanMutex();
217 static void ClearCache();
220 class VSIS3UpdateParams
226 bool m_bUseVirtualHosting =
false;
228 VSIS3UpdateParams() =
default;
230 explicit VSIS3UpdateParams(
const VSIS3HandleHelper* poHelper) :
231 m_osRegion(poHelper->GetRegion()),
232 m_osEndpoint(poHelper->GetEndpoint()),
233 m_osRequestPayer(poHelper->GetRequestPayer()),
234 m_bUseVirtualHosting(poHelper->GetVirtualHosting()) {}
236 void UpdateHandlerHelper(VSIS3HandleHelper* poHelper) {
237 poHelper->SetRegion(m_osRegion);
238 poHelper->SetEndpoint(m_osEndpoint);
239 poHelper->SetRequestPayer(m_osRequestPayer);
240 poHelper->SetVirtualHosting(m_bUseVirtualHosting);
243 static std::mutex gsMutex;
244 static std::map< CPLString, VSIS3UpdateParams > goMapBucketsToS3Params;
245 static void UpdateMapFromHandle( IVSIS3LikeHandleHelper* poHandleHelper );
246 static void UpdateHandleFromMap( IVSIS3LikeHandleHelper* poHandleHelper );
247 static void ClearCache();