Bộ xử lý cURL của Guzzle: Ghi lại header CONNECT của proxy
Ghi lại các khối header phản hồi riêng biệt bằng bộ xử lý cURL của Guzzle khi cả phản hồi CONNECT của proxy lẫn phản hồi của website đều quan trọng.
Một yêu cầu HTTPS đi qua proxy HTTP có thể nhận một phản hồi chấp nhận CONNECT và một phản hồi sau đó từ website bên trong đường hầm ấy. Về thiết lập tuyến ban đầu, xem tùy chọn proxy theo từng yêu cầu của Guzzle. Một header trong phản hồi đầu tiên không nhất thiết phải có trên đối tượng phản hồi cuối cùng.
Để tái lập với một endpoint HTTP do bạn tự chọn, hãy lấy một ứng viên từ danh sách proxy HTTP và xác nhận nó chấp nhận đường hầm HTTPS. Với đường xử lý cURL của Guzzle 7.10, hãy giữ mỗi header callback thành một khối riêng:
$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(),
];
},
]);Tiện ích cURL phải cung cấp CURLOPT_SUPPRESS_CONNECT_HEADERS, một tùy chọn do libcurl 7.54.0 giới thiệu. Đặt nó thành false cho phép các header CONNECT đến được header callback của cURL. Bộ xử lý của Guzzle 7.10 dựng một phản hồi cho mỗi khối header hoàn tất và gọi on_headers tại ranh giới đó.
Giữ các khối theo đúng thứ tự. Các thách thức xác thực, chuyển hướng và phản hồi thông tin có thể sinh thêm khối; đừng làm phẳng mọi giá trị vào một array hay phân loại một phản hồi chỉ vì trạng thái của nó là 200.
Phản hồi trả về đại diện cho phản hồi của yêu cầu đã hoàn tất, trong khi blocks lưu giữ các quan sát mà callback thu thập. Nếu đường hầm hoặc thiết lập TLS thất bại, hãy xử lý transfer exception được ném ra trong ứng dụng gọi; có thể không có phản hồi website cuối cùng.
Hành vi này gắn với bộ xử lý cURL đã nêu. Bộ xử lý tùy chỉnh hoặc stream không buộc phải cung cấp các proxy-handshake callback tương tự. Hãy coi các header proxy ghi được là dữ liệu chẩn đoán và tránh lưu giữ những giá trị gắn với tài khoản khi không cần thiết.