Конец заголовка PHP HTTP (или обнаружение CR LF) - PullRequest
2 голосов
/ 21 марта 2012

В целях тестирования я хотел бы построить простой HTTP-сервер на PHP. Я знаю, что заголовки HTTP завершаются символом \ r \ n на пустой строке, и я хотел бы обнаружить этот шаблон, чтобы знать, когда мой сервер получил все заголовки и может ответить клиенту.

Даже если я симулирую клиента так:

$in = "HEAD / HTTP/1.1\r\n";
$in .= "Host: www.example.com\r\n";
$in .= "Connection: Close\r\n\r\n";
$out = '';

echo "Sending HTTP HEAD request...";
socket_write($socket, $in, strlen($in));

Я не могу определить конец заголовков. Должна быть проблема в моей логике мышления. Вот мой код, который пытается обнаружить шаблон:

do { 
    // read client input 
    $input = socket_read($spawn, 1024, 1) or die("Could not read input\n"); 

    if (preg_match ("/^[\r\n|\r|\n]/", $input)) {
        echo "CRLF detected!!\n";
    } else {
        if (trim($input) != "") { 
            echo "NO CRLF in: ".trim($input)."\n";
        }
    }
} while (true);

Я также пробовал:

if ($input == "\r\n"){ 

или

if (preg_match ("/[\r\n|\r|\n]{2,}/", $input))

и множество других различных комбинаций, но ни одна из опций не обнаруживает \ r \ n, который указывает конец заголовков. Любая помощь очень ценится.

Ответы [ 2 ]

1 голос
/ 24 апреля 2012

Спасибо, Марк Б.

Я не нашел решения этой проблемы.

Обходное решение, которое я использовал: - Запустите скрипт PHP на вашем любимом HTTP-сервере.- проверить переменную $ _REQUEST и позволить сценарию составить соответствующий ответ, используя эту информацию. - Записать соответствующую информацию / действия в файл.

Таким образом, я могу протестировать приложение, взаимодействующее с веб-сервером.Приложение подключается к моему сценарию.Я знаю, как приложение взаимодействует со сценарием, привязывая (tail -f) лог-файл.Сценарий предоставляет приложение с ответом.

1 голос
/ 21 марта 2012

Не ответ, но слишком большой / некрасивый для комментария:

[\r\n|\r|\n] не совсем правильный синтаксис. Соответствия классу символов ([]) берут что-либо в скобках и используют их в качестве потенциального соответствия для ОДНОГО символа в строке поиска. Оператор чередования | не работает внутри [], как в (). например, * +1008 *

/[abc]/ читается как «если есть какой-либо отдельный символ, который является« a »или« b »или« c »», то это совпадение.

/[a|b|c]/ читает почти то же самое, за исключением того, что это «если это« a », или« b », или« c », или« | »».

(a|b|c) и [abc] эквивалентны, за исключением того, что версия () также фиксирует совпадения.

...