GDAL
cpl_http.h
Go to the documentation of this file.
1/******************************************************************************
2 * $Id: cpl_http.h 0aaf941e652f4950616aff612169985b6fd66cdd 2021-10-24 14:24:39 +0200 Even Rouault $
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
44
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
54
56
58typedef struct { char **papszHeaders;
64
66typedef struct {
69
72
74 char *pszErrBuf;
75
80
83
86
89
92
94
96typedef size_t (*CPLHTTPFetchWriteFunc)(void *pBuffer, size_t nSize, size_t nMemb, void *pWriteArg);
98
99int CPL_DLL CPLHTTPEnabled( void );
100CPLHTTPResult CPL_DLL *CPLHTTPFetch( const char *pszURL, CSLConstList papszOptions);
101CPLHTTPResult CPL_DLL *CPLHTTPFetchEx( const char *pszURL,CSLConstList papszOptions,
102 GDALProgressFunc pfnProgress,
103 void *pProgressArg,
104 CPLHTTPFetchWriteFunc pfnWrite,
105 void *pWriteArg);
106CPLHTTPResult CPL_DLL **CPLHTTPMultiFetch( const char * const * papszURL,
107 int nURLCount,
108 int nMaxSimultaneous,
109 CSLConstList papszOptions);
110
111void CPL_DLL CPLHTTPCleanup( void );
112void CPL_DLL CPLHTTPDestroyResult( CPLHTTPResult *psResult );
113void CPL_DLL CPLHTTPDestroyMultiResult( CPLHTTPResult **papsResults, int nCount );
114int CPL_DLL CPLHTTPParseMultipartMime( CPLHTTPResult *psResult );
115
116/* -------------------------------------------------------------------- */
117/* To install an alternate network layer to the default Curl one */
118/* -------------------------------------------------------------------- */
134typedef CPLHTTPResult* (*CPLHTTPFetchCallbackFunc)( const char *pszURL,
135 CSLConstList papszOptions,
136 GDALProgressFunc pfnProgress,
137 void *pProgressArg,
138 CPLHTTPFetchWriteFunc pfnWrite,
139 void *pWriteArg,
140 void* pUserData );
141
143 void* pUserData );
144
146 void* pUserData );
147int CPL_DLL CPLHTTPPopFetchCallback(void);
148
149/* -------------------------------------------------------------------- */
150/* The following is related to OAuth2 authorization around */
151/* google services like fusion tables, and potentially others */
152/* in the future. Code in cpl_google_oauth2.cpp. */
153/* */
154/* These services are built on CPL HTTP services. */
155/* -------------------------------------------------------------------- */
156
157char CPL_DLL *GOA2GetAuthorizationURL( const char *pszScope );
158char CPL_DLL *GOA2GetRefreshToken( const char *pszAuthToken,
159 const char *pszScope );
160char CPL_DLL *GOA2GetAccessToken( const char *pszRefreshToken,
161 const char *pszScope );
162
164 const char* pszPrivateKey,
165 const char* pszClientEmail,
166 const char* pszScope,
167 CSLConstList papszAdditionalClaims,
168 CSLConstList papszOptions);
169
170char CPL_DLL **GOA2GetAccessTokenFromCloudEngineVM( CSLConstList papszOptions );
171
173
174#if defined(__cplusplus) && !defined(CPL_SUPRESS_CPLUSPLUS)
176// Not sure if this belong here, used in cpl_http.cpp, cpl_vsil_curl.cpp and frmts/wms/gdalhttp.cpp
177void CPL_DLL* CPLHTTPSetOptions(void *pcurl, const char *pszURL, const char * const* papszOptions);
178char** CPLHTTPGetOptionsFromEnv();
179double CPLHTTPGetNewRetryDelay(int response_code, double dfOldDelay,
180 const char* pszErrBuf, const char* pszCurlError);
181void CPL_DLL* CPLHTTPIgnoreSigPipe();
182void CPL_DLL CPLHTTPRestoreSigPipeHandler(void* old_handler);
183bool CPLMultiPerformWait(void* hCurlMultiHandle, int& repeats);
185
188
197{
198 public:
199
201
203 typedef enum
204 {
205 NONE,
206 GCE,
207 ACCESS_TOKEN_FROM_REFRESH,
208 SERVICE_ACCOUNT
209 } AuthMethod;
210
211 bool SetAuthFromGCE( CSLConstList papszOptions );
212 bool SetAuthFromRefreshToken( const char* pszRefreshToken,
213 const char* pszClientId,
214 const char* pszClientSecret,
215 CSLConstList papszOptions );
216 bool SetAuthFromServiceAccount(const char* pszPrivateKey,
217 const char* pszClientEmail,
218 const char* pszScope,
219 CSLConstList papszAdditionalClaims,
220 CSLConstList papszOptions );
221
223 AuthMethod GetAuthMethod() const { return m_eMethod; }
224
225 const char* GetBearer() const;
226
228 const CPLString& GetPrivateKey() const { return m_osPrivateKey; }
229
231 const CPLString& GetClientEmail() const { return m_osClientEmail; }
232
233 private:
234
235 mutable CPLString m_osCurrentBearer{};
236 mutable time_t m_nExpirationTime = 0;
237 AuthMethod m_eMethod = NONE;
238
239 // for ACCESS_TOKEN_FROM_REFRESH
240 CPLString m_osClientId{};
241 CPLString m_osClientSecret{};
242 CPLString m_osRefreshToken{};
243
244 // for SERVICE_ACCOUNT
245 CPLString m_osPrivateKey{};
246 CPLString m_osClientEmail{};
247 CPLString m_osScope{};
248 CPLStringList m_aosAdditionalClaims{};
249
250 CPLStringList m_aosOptions{};
251};
252
253
254#endif // __cplusplus
255
256#endif /* ndef CPL_HTTP_H_INCLUDED */
Convenient string class based on std::string.
Definition cpl_string.h:333
const CPLString & GetClientEmail() const
Returns client email for SERVICE_ACCOUNT method.
Definition cpl_http.h:231
GOA2Manager()
Constructor.
AuthMethod GetAuthMethod() const
Returns the authentication method.
Definition cpl_http.h:223
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:605
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:641
const CPLString & GetPrivateKey() const
Returns private key for SERVICE_ACCOUNT method.
Definition cpl_http.h:228
const char * GetBearer() const
Return the access token.
Definition cpl_google_oauth2.cpp:687
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:580
AuthMethod
Authentication method.
Definition cpl_http.h:204
Various convenience functions for CPL.
int CPLHTTPPopFetchCallback(void)
Uninstalls a callback set by CPLHTTPPushFetchCallback().
Definition cpl_http.cpp:873
CPLHTTPResult ** CPLHTTPMultiFetch(const char *const *papszURL, int nURLCount, int nMaxSimultaneous, CSLConstList papszOptions)
Fetch several documents at once.
Definition cpl_http.cpp:1528
char * GOA2GetRefreshToken(const char *pszAuthToken, const char *pszScope)
Turn Auth Token into a Refresh Token.
Definition cpl_google_oauth2.cpp:164
int CPLHTTPPushFetchCallback(CPLHTTPFetchCallbackFunc pFunc, void *pUserData)
Installs an alternate callback to the default implementation of CPLHTTPFetchEx().
Definition cpl_http.cpp:853
void CPLHTTPCleanup(void)
Cleanup function to call at application termination.
Definition cpl_http.cpp:2339
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:469
bool CPLIsMachinePotentiallyGCEInstance()
Returns whether the current machine is potentially a Google Compute Engine instance.
Definition cpl_google_cloud.cpp:110
CPLHTTPResult * CPLHTTPFetch(const char *pszURL, CSLConstList papszOptions)
Fetch a document from an url and return in a string.
Definition cpl_http.cpp:982
char ** GOA2GetAccessTokenFromCloudEngineVM(CSLConstList papszOptions)
Fetch access token using Cloud Engine internal REST API.
Definition cpl_google_oauth2.cpp:428
bool CPLIsMachineForSureGCEInstance()
Returns whether the current machine is surely a Google Compute Engine instance.
Definition cpl_google_cloud.cpp:58
void CPLHTTPSetFetchCallback(CPLHTTPFetchCallbackFunc pFunc, void *pUserData)
Installs an alternate callback to the default implementation of CPLHTTPFetchEx().
Definition cpl_http.cpp:831
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:134
char * GOA2GetAuthorizationURL(const char *pszScope)
Return authorization url for a given scope.
Definition cpl_google_oauth2.cpp:127
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:998
char * GOA2GetAccessToken(const char *pszRefreshToken, const char *pszScope)
Fetch access token using refresh token.
Definition cpl_google_oauth2.cpp:397
int CPLHTTPEnabled(void)
Return if CPLHTTP services can be useful.
Definition cpl_http.cpp:2322
void CPLHTTPDestroyResult(CPLHTTPResult *psResult)
Clean the memory associated with the return value of CPLHTTPFetch()
Definition cpl_http.cpp:2395
void CPLHTTPDestroyMultiResult(CPLHTTPResult **papsResults, int nCount)
Clean the memory associated with the return value of CPLHTTPMultiFetch()
Definition cpl_http.cpp:1775
int CPLHTTPParseMultipartMime(CPLHTTPResult *psResult)
Parses a MIME multipart message.
Definition cpl_http.cpp:2428
#define CPL_C_END
Macro to end a block of C symbols.
Definition cpl_port.h:331
#define CPL_C_START
Macro to start a block of C symbols.
Definition cpl_port.h:329
char ** CSLConstList
Type of a constant null-terminated list of nul terminated strings.
Definition cpl_port.h:1169
unsigned char GByte
Unsigned byte type.
Definition cpl_port.h:215
Various convenience functions for working with strings and string lists.
Standard C Covers.
Definition cpl_http.h:66
GByte * pabyData
Definition cpl_http.h:82
int nStatus
Definition cpl_http.h:68
CPLMimePart * pasMimePart
Definition cpl_http.h:91
char * pszContentType
Definition cpl_http.h:71
int nDataAlloc
Definition cpl_http.h:79
char ** papszHeaders
Definition cpl_http.h:85
char * pszErrBuf
Definition cpl_http.h:74
int nMimePartCount
Definition cpl_http.h:88
int nDataLen
Definition cpl_http.h:77
Definition cpl_http.h:58
char ** papszHeaders
Definition cpl_http.h:59
int nDataLen
Definition cpl_http.h:62
GByte * pabyData
Definition cpl_http.h:61