Я пишу специализированный прокси-сервер PHP и попал в тупик с помощью функции cURL.
Если установлены следующие значения:
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, true );
curl_setopt( $ch, CURLOPT_HEADER, true );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
cURL правильно обрабатывает перенаправления, но возвращает ВСЕ заголовки страниц, а не только конечную (не перенаправляемую) страницу, например
HTTP/1.1 302 Found
Location: http://otherpage
Set-Cookie: someCookie=foo
Content-Length: 198
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 3241
<!DOCTYPE HTML>
...rest of content
Обратите внимание, что CURLOPT_HEADER установлен, потому что мне нужно прочитать и скопировать части исходного заголовка в заголовок прокси-сервера.
Я понимаю, почему он возвращает все эти заголовки (например, мой прокси-код должен обнаруживать любые файлы cookie, установленные в заголовке 302, и передавать их). ОДНАКО, это также делает невозможным обнаружение, когда заголовки заканчиваются и начинается контент. Как правило, с одним заголовком мы могли бы просто сделать простой раскол:
$split = preg_split('/\r\n\r\n/', $fullPage, 2)
Но это явно не сработает. Гектометр Мы могли бы попробовать что-то, что только расщепляется, если выглядит, что следующая строка является частью заголовка:
$split = preg_split('/\r\n\r\nHTML\/(1\.0|1\.1) \\d+ \\w+/', $fullPage)
// matches patterns such a "\r\n\r\nHTML/1.1 302 Found"
который будет работать почти все время, но задыхается, если на их странице есть следующее:
...and for all you readers out there, here is an example HTTP header:
<PRE>
HTTP/1.1 200 OK
ШАРЫ!
Мы действительно хотим, чтобы раскол прекратил сопоставление, как только он встретит любой шаблон \r\n\r\n
, за которым сразу не следует HTML/1.x
- есть ли способ сделать это с помощью PHP RegExs? Даже это решение может захлебываться (довольно редкой) ситуацией, когда кто-то помещает HTTP-заголовок прямо в начале своего контента. Есть ли способ в cURL получить все возвращенные страницы в виде массива?