قرار دادن یک پروکسی صریح روی easy handle در libcurl
یک easy handle در libcurl را برای پروکسی مشخصی پیکربندی کنید و خطاهای گزینه، شکست انتقال و وضعیت HTTP را جدا کنید.
libcurl پیکربندی پروکسی را به easy handle ای که انتقال را انجام میدهد متصل میکند. نشانی واسطه را روی همان handle تنظیم کنید و CURLOPT_URL را بهعنوان URL مقصد باقی بگذارید.
قطعه زیر فرض میکند که libcurl مقداردهی اولیه شده و handle یک easy handle معتبر است:
char error[CURL_ERROR_SIZE] = {0};
CURLcode result;
result = curl_easy_setopt(handle, CURLOPT_ERRORBUFFER, error);
if (result == CURLE_OK)
result = curl_easy_setopt(handle, CURLOPT_URL,
"https://example.com/");
if (result == CURLE_OK)
result = curl_easy_setopt(handle, CURLOPT_PROXY,
"http://proxy.example:8080");
if (result == CURLE_OK)
result = curl_easy_perform(handle);
if (result != CURLE_OK)
fprintf(stderr, "%s\n", error[0] ? error
: curl_easy_strerror(result));
تا زمانی که handle به آن ارجاع میدهد، بافر خطا را زنده نگه دارید. پیش از خروج از محدودهاش، handle را پاک کنید یا اشارهگر CURLOPT_ERRORBUFFER آن را جایگزین یا پاک کنید. نام میزبان پروکسی یک جاینگهدار است؛ یک کاندیدای بدون احراز هویت از فهرست پروکسی HTTP میتواند نشانی این آزمون سایت عمومی را تأمین کند. طرح و پورت واقعی آن را به کار ببرید و بررسی کنید که آیا تونل HTTPS را مجاز میکند.
یک مقصد HTTPS میتواند از پروکسی HTTP استفاده کند. libcurl تونل آن انتقال HTTPS را مدیریت میکند. http:// در گزینه پروکسی، اتصال به واسطه را توصیف میکند. آن را فقط برای نقطه پایانی پروکسی که واقعاً TLS میپذیرد و ساخت libcurl که از آن پشتیبانی میکند به https:// تغییر دهید.
مسیر مؤثر را آگاهانه کنید
گزینه صریح پروکسی، تنظیم محیط پروکسی متناظر را نادیده میگیرد. عبور یک تصمیم جداگانه است: no_proxy بهارثرسیده هنوز میتواند مقصد را حذف کند. اگر این handle باید برای هر مقصدی که به آن داده میشود از پروکسی انتخابشده استفاده کند، CURLOPT_NOPROXY را بهعنوان رشته خالی بخشی از آن سیاست پیکربندی کنید.
برعکس، تنظیم CURLOPT_PROXY روی رشته خالی، استفاده از پروکسی را صریحاً غیرفعال میکند. تنظیم آن روی NULL تخصیص صریح را حذف میکند و رفتار مبتنی بر محیط را دوباره مجاز میسازد. این دو مقدار اهداف متفاوتی را دنبال میکنند.
یک سرصفحه ویژه هدف مانند Content-Type: text/xml پروکسی را انتخاب نمیکند. آن را فقط زمانی اضافه کنید که بدنه واقعی درخواست و API مقصد به آن نوع رسانه نیاز داشته باشند.
نتیجه HTTP را هم بخوانید
موفقیت curl_easy_perform به معنای آن نیست که وبسایت وضعیت HTTP موفق برگردانده است. CURLINFO_RESPONSE_CODE را بخوانید و مدیریت وضعیت برنامه را اعمال کنید. پاسخ CONNECT پروکسی ارزش خودش را دارد، CURLINFO_HTTP_CONNECTCODE؛ رد تونل پیش از هر پاسخ وبسایت رخ میدهد.
CURLOPT_FAILONERROR میتواند بسیاری از خطاهای HTTP را شکست تلقی کند، اما مستندات آن استثناهای احراز هویت را یادآور میشود. چالش 407 پروکسی را از وضعیت مقصد جدا نگه دارید.