GDAL
cpl_http.h
Go to the documentation of this file.
1 /******************************************************************************
2  * $Id$
3  *
4  * Project: Common Portability Library
5  * Purpose: Function wrapper for libcurl HTTP access.
6  * Author: Frank Warmerdam, warmerdam@pobox.com
7  *
8  ******************************************************************************
9  * Copyright (c) 2006, Frank Warmerdam
10  * Copyright (c) 2009, Even Rouault <even dot rouault at spatialys.com>
11  *
12  * Permission is hereby granted, free of charge, to any person obtaining a
13  * copy of this software and associated documentation files (the "Software"),
14  * to deal in the Software without restriction, including without limitation
15  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
16  * and/or sell copies of the Software, and to permit persons to whom the
17  * Software is furnished to do so, subject to the following conditions:
18  *
19  * The above copyright notice and this permission notice shall be included
20  * in all copies or substantial portions of the Software.
21  *
22  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
23  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
25  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
26  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
27  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
28  * DEALINGS IN THE SOFTWARE.
29  ****************************************************************************/
30 
31 #ifndef CPL_HTTP_H_INCLUDED
32 #define CPL_HTTP_H_INCLUDED
33 
34 #include "cpl_conv.h"
35 #include "cpl_string.h"
36 #include "cpl_progress.h"
37 #include "cpl_vsi.h"
38 
46 #ifndef CPL_HTTP_MAX_RETRY
47 #define CPL_HTTP_MAX_RETRY 0
48 #endif
49 
50 #ifndef CPL_HTTP_RETRY_DELAY
51 #define CPL_HTTP_RETRY_DELAY 30.0
52 #endif
56 
58 typedef struct
59 { char **papszHeaders;
61  GByte *pabyData; int nDataLen;
64 } CPLMimePart;
65 
67 typedef struct
68 {
70  int nStatus;
71 
74 
76  char *pszErrBuf;
77 
79  int nDataLen;
82 
85 
87  char **papszHeaders;
88 
91 
94 
96 
98 typedef size_t (*CPLHTTPFetchWriteFunc)(void *pBuffer, size_t nSize,
99  size_t nMemb, void *pWriteArg);
102 int CPL_DLL CPLHTTPEnabled(void);
103 CPLHTTPResult CPL_DLL *CPLHTTPFetch(const char *pszURL,
104  CSLConstList papszOptions);
105 CPLHTTPResult CPL_DLL *
106 CPLHTTPFetchEx(const char *pszURL, CSLConstList papszOptions,
107  GDALProgressFunc pfnProgress, void *pProgressArg,
108  CPLHTTPFetchWriteFunc pfnWrite, void *pWriteArg);
109 CPLHTTPResult CPL_DLL **CPLHTTPMultiFetch(const char *const *papszURL,
110  int nURLCount, int nMaxSimultaneous,
111  CSLConstList papszOptions);
112 
113 void CPL_DLL CPLHTTPCleanup(void);
114 void CPL_DLL CPLHTTPDestroyResult(CPLHTTPResult *psResult);
115 void CPL_DLL CPLHTTPDestroyMultiResult(CPLHTTPResult **papsResults, int nCount);
116 int CPL_DLL CPLHTTPParseMultipartMime(CPLHTTPResult *psResult);
117 
118 void CPL_DLL CPLHTTPSetDefaultUserAgent(const char *pszUserAgent);
119 
120 /* -------------------------------------------------------------------- */
121 /* To install an alternate network layer to the default Curl one */
122 /* -------------------------------------------------------------------- */
141 typedef CPLHTTPResult *(*CPLHTTPFetchCallbackFunc)(
142  const char *pszURL, CSLConstList papszOptions, GDALProgressFunc pfnProgress,
143  void *pProgressArg, CPLHTTPFetchWriteFunc pfnWrite, void *pWriteArg,
144  void *pUserData);
145 
147  void *pUserData);
148 
150  void *pUserData);
151 int CPL_DLL CPLHTTPPopFetchCallback(void);
152 
153 /* -------------------------------------------------------------------- */
154 /* The following is related to OAuth2 authorization around */
155 /* google services like fusion tables, and potentially others */
156 /* in the future. Code in cpl_google_oauth2.cpp. */
157 /* */
158 /* These services are built on CPL HTTP services. */
159 /* -------------------------------------------------------------------- */
160 
161 char CPL_DLL *GOA2GetAuthorizationURL(const char *pszScope);
162 char CPL_DLL *GOA2GetRefreshToken(const char *pszAuthToken,
163  const char *pszScope);
164 char CPL_DLL *GOA2GetAccessToken(const char *pszRefreshToken,
165  const char *pszScope);
166 
168  const char *pszPrivateKey, const char *pszClientEmail, const char *pszScope,
169  CSLConstList papszAdditionalClaims, CSLConstList papszOptions);
170 
171 char CPL_DLL **GOA2GetAccessTokenFromCloudEngineVM(CSLConstList papszOptions);
172 
173 CPL_C_END
174 
175 #if defined(__cplusplus) && !defined(CPL_SUPRESS_CPLUSPLUS)
177 // Not sure if this belong here, used in cpl_http.cpp, cpl_vsil_curl.cpp and
178 // frmts/wms/gdalhttp.cpp
179 void CPL_DLL *CPLHTTPSetOptions(void *pcurl, const char *pszURL,
180  const char *const *papszOptions);
181 char **CPLHTTPGetOptionsFromEnv(const char *pszFilename);
182 
184 struct CPLHTTPRetryParameters
185 {
186  int nMaxRetry = CPL_HTTP_MAX_RETRY;
187  double dfInitialDelay = CPL_HTTP_RETRY_DELAY;
188  std::string osRetryCodes{};
189 
190  CPLHTTPRetryParameters() = default;
191  explicit CPLHTTPRetryParameters(const CPLStringList &aosHTTPOptions);
192 };
193 
195 class CPLHTTPRetryContext
196 {
197  public:
198  explicit CPLHTTPRetryContext(const CPLHTTPRetryParameters &oParams);
199 
200  bool CanRetry(int response_code, const char *pszErrBuf,
201  const char *pszCurlError);
202  bool CanRetry();
203 
205  double GetCurrentDelay() const;
206 
208  void ResetCounter()
209  {
210  m_nRetryCount = 0;
211  }
212 
213  private:
214  CPLHTTPRetryParameters m_oParameters{};
215  int m_nRetryCount = 0;
216  double m_dfCurDelay = 0.0;
217  double m_dfNextDelay = 0.0;
218 };
219 
220 void CPL_DLL *CPLHTTPIgnoreSigPipe();
221 void CPL_DLL CPLHTTPRestoreSigPipeHandler(void *old_handler);
222 bool CPLMultiPerformWait(void *hCurlMultiHandle, int &repeats);
227 
236 {
237  public:
239 
241  typedef enum
242  {
243  NONE,
244  GCE,
245  ACCESS_TOKEN_FROM_REFRESH,
246  SERVICE_ACCOUNT
247  } AuthMethod;
248 
249  bool SetAuthFromGCE(CSLConstList papszOptions);
250  bool SetAuthFromRefreshToken(const char *pszRefreshToken,
251  const char *pszClientId,
252  const char *pszClientSecret,
253  CSLConstList papszOptions);
254  bool SetAuthFromServiceAccount(const char *pszPrivateKey,
255  const char *pszClientEmail,
256  const char *pszScope,
257  CSLConstList papszAdditionalClaims,
258  CSLConstList papszOptions);
259 
262  {
263  return m_eMethod;
264  }
265 
266  const char *GetBearer() const;
267 
269  const CPLString &GetPrivateKey() const
270  {
271  return m_osPrivateKey;
272  }
273 
275  const CPLString &GetClientEmail() const
276  {
277  return m_osClientEmail;
278  }
279 
280  private:
281  mutable CPLString m_osCurrentBearer{};
282  mutable time_t m_nExpirationTime = 0;
283  AuthMethod m_eMethod = NONE;
284 
285  // for ACCESS_TOKEN_FROM_REFRESH
286  CPLString m_osClientId{};
287  CPLString m_osClientSecret{};
288  CPLString m_osRefreshToken{};
289 
290  // for SERVICE_ACCOUNT
291  CPLString m_osPrivateKey{};
292  CPLString m_osClientEmail{};
293  CPLString m_osScope{};
294  CPLStringList m_aosAdditionalClaims{};
295 
296  CPLStringList m_aosOptions{};
297 };
298 
299 #endif // __cplusplus
300 
301 #endif /* ndef CPL_HTTP_H_INCLUDED */
String list class designed around our use of C "char**" string lists.
Definition: cpl_string.h:449
Convenient string class based on std::string.
Definition: cpl_string.h:320
Manager of Google OAuth2 authentication.
Definition: cpl_http.h:236
GOA2Manager()
Constructor.
AuthMethod GetAuthMethod() const
Returns the authentication method.
Definition: cpl_http.h:261
bool SetAuthFromRefreshToken(const char *pszRefreshToken, const char *pszClientId, const char *pszClientSecret, CSLConstList papszOptions)
Specifies that the authentication will be done using the OAuth2 client id method.
Definition: cpl_google_oauth2.cpp:564
const CPLString & GetClientEmail() const
Returns client email for SERVICE_ACCOUNT method.
Definition: cpl_http.h:275
bool SetAuthFromServiceAccount(const char *pszPrivateKey, const char *pszClientEmail, const char *pszScope, CSLConstList papszAdditionalClaims, CSLConstList papszOptions)
Specifies that the authentication will be done using the OAuth2 service account method.
Definition: cpl_google_oauth2.cpp:599
const CPLString & GetPrivateKey() const
Returns private key for SERVICE_ACCOUNT method.
Definition: cpl_http.h:269
const char * GetBearer() const
Return the access token.
Definition: cpl_google_oauth2.cpp:642
bool SetAuthFromGCE(CSLConstList papszOptions)
Specifies that the authentication will be done using the local credentials of the current Google Comp...
Definition: cpl_google_oauth2.cpp:540
AuthMethod
Authentication method.
Definition: cpl_http.h:242
Various convenience functions for CPL.
int CPLHTTPPopFetchCallback(void)
Uninstalls a callback set by CPLHTTPPushFetchCallback().
Definition: cpl_http.cpp:992
char ** GOA2GetAccessTokenFromServiceAccount(const char *pszPrivateKey, const char *pszClientEmail, const char *pszScope, CSLConstList papszAdditionalClaims, CSLConstList papszOptions)
Fetch access token using Service Account OAuth2.
Definition: cpl_google_oauth2.cpp:426
int CPLHTTPPushFetchCallback(CPLHTTPFetchCallbackFunc pFunc, void *pUserData)
Installs an alternate callback to the default implementation of CPLHTTPFetchEx().
Definition: cpl_http.cpp:972
void CPLHTTPCleanup(void)
Cleanup function to call at application termination.
Definition: cpl_http.cpp:2728
bool CPLIsMachinePotentiallyGCEInstance()
Returns whether the current machine is potentially a Google Compute Engine instance.
Definition: cpl_google_cloud.cpp:111
CPLHTTPResult * CPLHTTPFetch(const char *pszURL, CSLConstList papszOptions)
Fetch a document from an url and return in a string.
Definition: cpl_http.cpp:1227
bool CPLIsMachineForSureGCEInstance()
Returns whether the current machine is surely a Google Compute Engine instance.
Definition: cpl_google_cloud.cpp:57
void CPLHTTPSetFetchCallback(CPLHTTPFetchCallbackFunc pFunc, void *pUserData)
Installs an alternate callback to the default implementation of CPLHTTPFetchEx().
Definition: cpl_http.cpp:949
CPLHTTPResult * CPLHTTPFetchEx(const char *pszURL, CSLConstList papszOptions, GDALProgressFunc pfnProgress, void *pProgressArg, CPLHTTPFetchWriteFunc pfnWrite, void *pWriteArg)
Fetch a document from an url and return in a string.
Definition: cpl_http.cpp:1247
char ** GOA2GetAccessTokenFromCloudEngineVM(CSLConstList papszOptions)
Fetch access token using Cloud Engine internal REST API.
Definition: cpl_google_oauth2.cpp:386
CPLHTTPResult ** CPLHTTPMultiFetch(const char *const *papszURL, int nURLCount, int nMaxSimultaneous, CSLConstList papszOptions)
Fetch several documents at once.
Definition: cpl_http.cpp:1753
char * GOA2GetAuthorizationURL(const char *pszScope)
Return authorization url for a given scope.
Definition: cpl_google_oauth2.cpp:88
int CPLHTTPEnabled(void)
Return if CPLHTTP services can be useful.
Definition: cpl_http.cpp:2711
char * GOA2GetRefreshToken(const char *pszAuthToken, const char *pszScope)
Turn Auth Token into a Refresh Token.
Definition: cpl_google_oauth2.cpp:123
char * GOA2GetAccessToken(const char *pszRefreshToken, const char *pszScope)
Fetch access token using refresh token.
Definition: cpl_google_oauth2.cpp:355
void CPLHTTPDestroyResult(CPLHTTPResult *psResult)
Clean the memory associated with the return value of CPLHTTPFetch()
Definition: cpl_http.cpp:2784
CPLHTTPResult *(* CPLHTTPFetchCallbackFunc)(const char *pszURL, CSLConstList papszOptions, GDALProgressFunc pfnProgress, void *pProgressArg, CPLHTTPFetchWriteFunc pfnWrite, void *pWriteArg, void *pUserData)
Callback function to process network requests.
Definition: cpl_http.h:141
void CPLHTTPDestroyMultiResult(CPLHTTPResult **papsResults, int nCount)
Clean the memory associated with the return value of CPLHTTPMultiFetch()
Definition: cpl_http.cpp:2008
void CPLHTTPSetDefaultUserAgent(const char *pszUserAgent)
Set the default user agent.
Definition: cpl_http.cpp:501
int CPLHTTPParseMultipartMime(CPLHTTPResult *psResult)
Parses a MIME multipart message.
Definition: cpl_http.cpp:2817
#define CPL_C_END
Macro to end a block of C symbols.
Definition: cpl_port.h:299
#define CPL_C_START
Macro to start a block of C symbols.
Definition: cpl_port.h:295
char ** CSLConstList
Type of a constant null-terminated list of nul terminated strings.
Definition: cpl_port.h:1183
unsigned char GByte
Unsigned byte type.
Definition: cpl_port.h:185
Various convenience functions for working with strings and string lists.
Standard C Covers.
Definition: cpl_http.h:68
GByte * pabyData
Definition: cpl_http.h:84
int nStatus
Definition: cpl_http.h:70
CPLMimePart * pasMimePart
Definition: cpl_http.h:93
char * pszContentType
Definition: cpl_http.h:73
int nDataAlloc
Definition: cpl_http.h:81
char ** papszHeaders
Definition: cpl_http.h:87
char * pszErrBuf
Definition: cpl_http.h:76
int nMimePartCount
Definition: cpl_http.h:90
int nDataLen
Definition: cpl_http.h:79
Definition: cpl_http.h:59