ตัวจัดการ cURL ของ Guzzle: เก็บหัวข้อ CONNECT ของพร็อกซี
เก็บบล็อกหัวข้อการตอบกลับแยกกันด้วยตัวจัดการ cURL ของ Guzzle เมื่อทั้งการตอบกลับ CONNECT ของพร็อกซีและการตอบกลับของเว็บไซต์มีความสำคัญ
คำขอ HTTPS ผ่านพร็อกซี HTTP อาจได้รับการตอบกลับหนึ่งรายการที่ยอมรับ CONNECT และการตอบกลับภายหลังจากเว็บไซต์ภายในอุโมงค์นั้น สำหรับการตั้งค่าเส้นทางเริ่มต้น ดูตัวเลือกพร็อกซีต่อคำขอของ Guzzle หัวข้อในการตอบกลับแรกไม่จำเป็นต้องมีอยู่ในออบเจกต์การตอบกลับสุดท้าย
สำหรับการทำซ้ำโดยใช้ปลายทาง HTTP ที่คุณเลือกเอง ให้นำผู้สมัครจากรายการพร็อกซี HTTPและยืนยันว่ายอมรับอุโมงค์ HTTPS สำหรับเส้นทางตัวจัดการ cURL ของ Guzzle 7.10 ให้เก็บ header callback แต่ละตัวเป็นบล็อกแยก:
$blocks = [];
$client = new \GuzzleHttp\Client([
'handler' => \GuzzleHttp\HandlerStack::create(
new \GuzzleHttp\Handler\CurlHandler()
),
]);
$response = $client->get('https://www.example.com/', [
'proxy' => 'http://proxy.example:8080',
'curl' => [CURLOPT_SUPPRESS_CONNECT_HEADERS => false],
'on_headers' => function (
\Psr\Http\Message\ResponseInterface $part
) use (&$blocks) {
$blocks[] = [
'status' => $part->getStatusCode(),
'reason' => $part->getReasonPhrase(),
'headers' => $part->getHeaders(),
];
},
]);ส่วนขยาย cURL ต้องเปิดเผย CURLOPT_SUPPRESS_CONNECT_HEADERS ซึ่งเป็นตัวเลือกที่ libcurl 7.54.0 นำเข้ามา การตั้งค่าเป็น false ทำให้หัวข้อ CONNECT ไปถึง header callback ของ cURL ตัวจัดการ Guzzle 7.10 สร้างการตอบกลับสำหรับแต่ละบล็อกหัวข้อที่เสร็จสมบูรณ์และเรียก on_headers ที่ขอบเขตนั้น
เก็บบล็อกตามลำดับ การท้าทายการยืนยันตัวตน การเปลี่ยนเส้นทาง และการตอบกลับแบบให้ข้อมูลอาจสร้างบล็อกเพิ่มเติม อย่ารวมค่าทั้งหมดเป็นอาร์เรย์เดียว และอย่าจำแนกการตอบกลับเพียงเพราะสถานะเป็น 200
การตอบกลับที่ส่งคืนแสดงถึงการตอบกลับของคำขอที่เสร็จสมบูรณ์ ขณะที่ blocks เก็บสิ่งที่ callback สังเกตได้ หากอุโมงค์หรือการตั้งค่า TLS ล้มเหลว ให้จัดการ transfer exception ที่ถูกโยนในแอปพลิเคชันที่เรียก การตอบกลับสุดท้ายของเว็บไซต์อาจไม่มีอยู่
พฤติกรรมนี้ผูกกับตัวจัดการ cURL ที่ระบุ ตัวจัดการแบบกำหนดเองหรือ stream ไม่จำเป็นต้องเปิดเผย proxy-handshake callback เดียวกัน ให้ถือหัวข้อพร็อกซีที่เก็บได้เป็นข้อมูลวินิจฉัย และหลีกเลี่ยงการเก็บค่าที่ผูกกับบัญชีโดยไม่จำเป็น