* Fetch a document from an url and return in a string. * @param pszURL Url to fetch document from web. * @param papszOptions Option list as a NULL-terminated array of strings. * Available keys see in CPLHTTPFetch. * @param pfnProgress Callback for reporting algorithm progress matching the * GDALProgressFunc() semantics. May be NULL. * @param pProgressArg Callback argument passed t
| 1270 | * CPLHTTPDestroyResult(), or NULL if libcurl support is disabled. |
| 1271 | */ |
| 1272 | CPLHTTPResult *CPLHTTPFetchEx(const char *pszURL, CSLConstList papszOptions, |
| 1273 | GDALProgressFunc pfnProgress, void *pProgressArg, |
| 1274 | CPLHTTPFetchWriteFunc pfnWrite, void *pWriteArg) |
| 1275 | |
| 1276 | { |
| 1277 | if (STARTS_WITH(pszURL, "/vsimem/") && |
| 1278 | // Disabled by default for potential security issues. |
| 1279 | CPLTestBool(CPLGetConfigOption("CPL_CURL_ENABLE_VSIMEM", "FALSE"))) |
| 1280 | { |
| 1281 | CPLString osURL(pszURL); |
| 1282 | const char *pszCustomRequest = |
| 1283 | CSLFetchNameValue(papszOptions, "CUSTOMREQUEST"); |
| 1284 | if (pszCustomRequest != nullptr) |
| 1285 | { |
| 1286 | osURL += "&CUSTOMREQUEST="; |
| 1287 | osURL += pszCustomRequest; |
| 1288 | } |
| 1289 | const char *pszUserPwd = CSLFetchNameValue(papszOptions, "USERPWD"); |
| 1290 | if (pszUserPwd != nullptr) |
| 1291 | { |
| 1292 | osURL += "&USERPWD="; |
| 1293 | osURL += pszUserPwd; |
| 1294 | } |
| 1295 | const char *pszPost = CSLFetchNameValue(papszOptions, "POSTFIELDS"); |
| 1296 | if (pszPost != nullptr) // Hack: We append post content to filename. |
| 1297 | { |
| 1298 | osURL += "&POSTFIELDS="; |
| 1299 | osURL += pszPost; |
| 1300 | } |
| 1301 | const char *pszHeaders = CSLFetchNameValue(papszOptions, "HEADERS"); |
| 1302 | if (pszHeaders != nullptr && |
| 1303 | CPLTestBool( |
| 1304 | CPLGetConfigOption("CPL_CURL_VSIMEM_PRINT_HEADERS", "FALSE"))) |
| 1305 | { |
| 1306 | osURL += "&HEADERS="; |
| 1307 | osURL += pszHeaders; |
| 1308 | } |
| 1309 | vsi_l_offset nLength = 0; |
| 1310 | CPLHTTPResult *psResult = |
| 1311 | static_cast<CPLHTTPResult *>(CPLCalloc(1, sizeof(CPLHTTPResult))); |
| 1312 | GByte *pabyData = VSIGetMemFileBuffer(osURL, &nLength, FALSE); |
| 1313 | if (pabyData == nullptr) |
| 1314 | { |
| 1315 | CPLDebug("HTTP", "Cannot find %s", osURL.c_str()); |
| 1316 | psResult->nStatus = 1; |
| 1317 | psResult->pszErrBuf = |
| 1318 | CPLStrdup(CPLSPrintf("HTTP error code : %d", 404)); |
| 1319 | CPLError(CE_Failure, CPLE_AppDefined, "%s", psResult->pszErrBuf); |
| 1320 | } |
| 1321 | else if (nLength != 0) |
| 1322 | { |
| 1323 | psResult->nDataLen = static_cast<int>(nLength); |
| 1324 | psResult->pabyData = static_cast<GByte *>( |
| 1325 | CPLMalloc(static_cast<size_t>(nLength) + 1)); |
| 1326 | memcpy(psResult->pabyData, pabyData, static_cast<size_t>(nLength)); |
| 1327 | psResult->pabyData[static_cast<size_t>(nLength)] = 0; |
| 1328 | } |
| 1329 |