31 #ifndef CPL_AWS_INCLUDED_H
32 #define CPL_AWS_INCLUDED_H
42 #include <curl/curl.h>
45 CPLString CPLGetLowerCaseHexSHA256(
const void *pabyData,
size_t nBytes );
46 CPLString CPLGetLowerCaseHexSHA256(
const CPLString& osStr );
48 CPLString CPLGetAWS_SIGN4_Timestamp();
50 CPLString CPLAWSURLEncode(
const CPLString& osURL,
bool bEncodeSlash =
true);
52 CPLString CPLAWSGetHeaderVal(
const struct curl_slist* psExistingHeaders,
56 CPLGetAWS_SIGN4_Signature(
const CPLString& osSecretAccessKey,
57 const CPLString& osAccessToken,
58 const CPLString& osRegion,
59 const CPLString& osRequestPayer,
60 const CPLString& osService,
61 const CPLString& osVerb,
62 const struct curl_slist* psExistingHeaders,
63 const CPLString& osHost,
64 const CPLString& osCanonicalURI,
65 const CPLString& osCanonicalQueryString,
66 const CPLString& osXAMZContentSHA256,
67 const CPLString& osTimestamp,
68 CPLString& osSignedHeaders );
70 CPLString CPLGetAWS_SIGN4_Authorization(
const CPLString& osSecretAccessKey,
71 const CPLString& osAccessKeyId,
72 const CPLString& osAccessToken,
73 const CPLString& osRegion,
74 const CPLString& osRequestPayer,
75 const CPLString& osService,
76 const CPLString& osVerb,
77 const struct curl_slist* psExistingHeaders,
78 const CPLString& osHost,
79 const CPLString& osCanonicalURI,
80 const CPLString& osCanonicalQueryString,
81 const CPLString& osXAMZContentSHA256,
82 const CPLString& osTimestamp);
84 class IVSIS3LikeHandleHelper
87 std::map<CPLString, CPLString> m_oMapQueryParameters;
89 virtual void RebuildURL() = 0;
90 CPLString GetQueryString(
bool bAddEmptyValueAfterEqual)
const;
93 IVSIS3LikeHandleHelper() {}
94 virtual ~IVSIS3LikeHandleHelper() {}
96 void ResetQueryParameters();
97 void AddQueryParameter(
const CPLString& osKey,
const CPLString& osValue);
99 virtual struct curl_slist* GetCurlHeaders(
const CPLString& osVerb,
100 const struct curl_slist* psExistingHeaders,
101 const void *pabyDataContent =
nullptr,
102 size_t nBytesContent = 0)
const = 0;
104 virtual bool AllowAutomaticRedirection() {
return true; }
105 virtual bool CanRestartOnError(
const char*,
const char* ,
106 bool ,
bool* =
nullptr) {
return false;}
108 virtual const CPLString& GetURL()
const = 0;
110 static bool GetBucketAndObjectKey(
const char* pszURI,
111 const char* pszFSPrefix,
113 CPLString &osBucketOut,
114 CPLString &osObjectKeyOut);
116 static CPLString BuildCanonicalizedHeaders(
117 std::map<CPLString, CPLString>& oSortedMapHeaders,
118 const struct curl_slist* psExistingHeaders,
119 const char* pszHeaderPrefix);
121 static CPLString GetRFC822DateTime();
124 class VSIS3HandleHelper final:
public IVSIS3LikeHandleHelper
127 CPLString m_osSecretAccessKey;
128 CPLString m_osAccessKeyId;
129 CPLString m_osSessionToken;
130 CPLString m_osEndpoint;
131 CPLString m_osRegion;
132 CPLString m_osRequestPayer;
133 CPLString m_osBucket;
134 CPLString m_osObjectKey;
136 bool m_bUseVirtualHosting;
138 void RebuildURL()
override;
140 static bool GetConfigurationFromEC2(CPLString& osSecretAccessKey,
141 CPLString& osAccessKeyId,
142 CPLString& osSessionToken);
144 static bool GetConfigurationFromAWSConfigFiles(
145 CPLString& osSecretAccessKey,
146 CPLString& osAccessKeyId,
147 CPLString& osSessionToken,
149 CPLString& osCredentials);
152 CPLString& osSecretAccessKey,
153 CPLString& osAccessKeyId,
154 CPLString& osSessionToken,
155 CPLString& osRegion);
159 VSIS3HandleHelper(
const CPLString& osSecretAccessKey,
160 const CPLString& osAccessKeyId,
161 const CPLString& osSessionToken,
162 const CPLString& osEndpoint,
163 const CPLString& osRegion,
164 const CPLString& osRequestPayer,
165 const CPLString& osBucket,
166 const CPLString& osObjectKey,
167 bool bUseHTTPS,
bool bUseVirtualHosting);
168 ~VSIS3HandleHelper();
170 static VSIS3HandleHelper* BuildFromURI(
const char* pszURI,
171 const char* pszFSPrefix,
174 static CPLString BuildURL(
const CPLString& osEndpoint,
175 const CPLString& osBucket,
176 const CPLString& osObjectKey,
177 bool bUseHTTPS,
bool bUseVirtualHosting);
179 struct curl_slist* GetCurlHeaders(
180 const CPLString& osVerb,
181 const struct curl_slist* psExistingHeaders,
182 const void *pabyDataContent =
nullptr,
183 size_t nBytesContent = 0)
const override;
185 bool AllowAutomaticRedirection()
override {
return false; }
186 bool CanRestartOnError(
const char*,
const char* pszHeaders,
188 bool* pbUpdateMap =
nullptr)
override;
190 const CPLString& GetURL()
const override {
return m_osURL; }
191 const CPLString& GetBucket()
const {
return m_osBucket; }
192 const CPLString& GetObjectKey()
const {
return m_osObjectKey; }
193 const CPLString& GetEndpoint()
const {
return m_osEndpoint; }
194 const CPLString& GetRegion()
const {
return m_osRegion; }
195 const CPLString& GetRequestPayer()
const {
return m_osRequestPayer; }
196 bool GetVirtualHosting()
const {
return m_bUseVirtualHosting; }
197 void SetEndpoint(
const CPLString &osStr);
198 void SetRegion(
const CPLString &osStr);
199 void SetRequestPayer(
const CPLString &osStr);
200 void SetVirtualHosting(
bool b);
204 static void CleanMutex();
205 static void ClearCache();
208 class VSIS3UpdateParams
211 CPLString m_osRegion;
212 CPLString m_osEndpoint;
213 CPLString m_osRequestPayer;
214 bool m_bUseVirtualHosting;
216 VSIS3UpdateParams() :
217 m_bUseVirtualHosting(false) {}
219 explicit VSIS3UpdateParams(
const VSIS3HandleHelper* poHelper) :
220 m_osRegion(poHelper->GetRegion()),
221 m_osEndpoint(poHelper->GetEndpoint()),
222 m_osRequestPayer(poHelper->GetRequestPayer()),
223 m_bUseVirtualHosting(poHelper->GetVirtualHosting()) {}
225 void UpdateHandlerHelper(VSIS3HandleHelper* poHelper) {
226 poHelper->SetRegion(m_osRegion);
227 poHelper->SetEndpoint(m_osEndpoint);
228 poHelper->SetRequestPayer(m_osRequestPayer);
229 poHelper->SetVirtualHosting(m_bUseVirtualHosting);
char ** CSLConstList
Definition: cpl_port.h:1184