CURLOPT_FOLLOWLOCATION.">
Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗cpSpHtRed 654 of 696 menu
◀ ▶

Переход по редиректу в C++

Перенаправление - ответ сервера с кодом 301 или 302 и новым адресом в заголовке "Location".

Поведение клиента задают опцией CURLOPT_FOLLOWLOCATION. Значение 0 останавливается на первом ответе, даже если пришел 301 или 302. Запишем код без следования по цепочке:

#include <iostream> #include <string> #include <curl/curl.h> size_t writeBody( char* ptr, size_t size, size_t nmemb, void* userdata ) { auto* body = static_cast<std::string*>(userdata); body->append(ptr, size * nmemb); return size * nmemb; } int main() { curl_global_init(CURL_GLOBAL_DEFAULT); CURL* curl = curl_easy_init(); std::string body; curl_easy_setopt( curl, CURLOPT_URL, "https://example.com/" ); curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 0L); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeBody); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &body); CURLcode res = curl_easy_perform(curl); if (res == CURLE_OK) { long code = 0; curl_easy_getinfo( curl, CURLINFO_RESPONSE_CODE, &code ); std::cout << code << "\n"; } curl_easy_cleanup(curl); curl_global_cleanup(); return res == CURLE_OK ? 0 : 1; }

Значение 1 разрешает libcurl повторить GET на адрес из "Location" и вернуть ответ конечной страницы. На том же URL включим следование:

#include <iostream> #include <string> #include <curl/curl.h> size_t writeBody( char* ptr, size_t size, size_t nmemb, void* userdata ) { auto* body = static_cast<std::string*>(userdata); body->append(ptr, size * nmemb); return size * nmemb; } int main() { curl_global_init(CURL_GLOBAL_DEFAULT); CURL* curl = curl_easy_init(); std::string body; curl_easy_setopt( curl, CURLOPT_URL, "https://example.com/" ); curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeBody); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &body); CURLcode res = curl_easy_perform(curl); if (res == CURLE_OK) { long code = 0; curl_easy_getinfo( curl, CURLINFO_RESPONSE_CODE, &code ); std::cout << code << "\n"; } curl_easy_cleanup(curl); curl_global_cleanup(); return res == CURLE_OK ? 0 : 1; }

Выведите код ответа для "https://example.com/", если клиент не следует перенаправлениям.

Отправьте два чтения на тот же адрес: сначала без следования редиректу, затем с обычным режимом. Напечатайте оба кода через пробел.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить