Ο cURL handler του Guzzle: καταγραφή κεφαλίδων CONNECT του proxy
Καταγράψτε ξεχωριστά μπλοκ κεφαλίδων απόκρισης με τον cURL handler του Guzzle όταν έχουν σημασία και η απόκριση CONNECT του proxy και η απόκριση του ιστότοπου.
Ένα αίτημα HTTPS μέσω HTTP proxy μπορεί να λάβει μία απόκριση που αποδέχεται CONNECT και αργότερα μια απόκριση από τον ιστότοπο μέσα σε αυτό το τούνελ. Για την αρχική ρύθμιση της διαδρομής, δείτε την επιλογή proxy ανά αίτημα του Guzzle. Μια κεφαλίδα της πρώτης απόκρισης δεν χρειάζεται να υπάρχει στο τελικό αντικείμενο απόκρισης.
Για αναπαραγωγή με ένα HTTP endpoint που επιλέγετε εσείς, πάρτε έναν υποψήφιο από τη λίστα HTTP proxy και επιβεβαιώστε ότι δέχεται το τούνελ HTTPS. Στη διαδρομή cURL handler του Guzzle 7.10, διατηρήστε κάθε 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 να φτάνουν στο callback κεφαλίδων του cURL. Ο handler του Guzzle 7.10 δημιουργεί μια απόκριση για κάθε ολοκληρωμένο μπλοκ κεφαλίδων και καλεί το on_headers σε αυτό το όριο.
Κρατήστε τα μπλοκ σε σειρά. Οι προκλήσεις ταυτοποίησης, οι ανακατευθύνσεις και οι ενημερωτικές αποκρίσεις μπορούν να παράγουν πρόσθετα μπλοκ· μην ισοπεδώνετε όλες τις τιμές σε έναν πίνακα και μην ταξινομείτε μια απόκριση μόνο επειδή η κατάστασή της είναι 200.
Η απόκριση που επιστρέφεται αντιπροσωπεύει την απόκριση του ολοκληρωμένου αιτήματος, ενώ το blocks διατηρεί τις παρατηρήσεις που συλλέγουν τα callbacks. Αν η ρύθμιση του τούνελ ή του TLS αποτύχει, χειριστείτε την εξαίρεση μεταφοράς που ρίχνεται στην εφαρμογή κλήσης· μπορεί να μην υπάρχει τελική απόκριση του ιστότοπου.
Αυτή η συμπεριφορά συνδέεται με τον δηλωμένο cURL handler. Ένας προσαρμοσμένος handler ή handler ροής δεν υποχρεούται να εκθέτει τα ίδια callbacks της χειραψίας proxy. Αντιμετωπίστε τις καταγεγραμμένες κεφαλίδες proxy ως διαγνωστικά δεδομένα και αποφύγετε να κρατάτε άσκοπα τιμές που συνδέονται με λογαριασμό.