PHP HTTP标头结束(或检测CR LF)

时间:2012-03-21 18:44:53

标签: php http header newline

出于测试目的,我想在PHP中构建一个简单的HTTP服务器。 我知道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 个答案:

答案 0 :(得分:1)

不是答案,但评论太大/太丑了:

[\r\n|\r|\n]语法不正确。字符类([])匹配括号内的任何内容,并将它们用作搜索字符串中SINGLE字符的潜在匹配项。 |交替运算符不会像[]中那样在()内运行。 e.g。

/[abc]/读作“如果有任何单个字符是'a'或'b'或'c'”,那么它就是匹配。

/[a|b|c]/几乎相同,只是“如果它是'a'或'b'或'c'或'|'”。

(a|b|c)[abc]是等效的,但()版本也会捕获匹配项。

答案 1 :(得分:1)

谢谢Marc B。

我找不到解决此问题的方法。

我使用的工作是: - 在您喜欢的HTTP服务器上运行PHP脚本。 - 检查$ _REQUEST变量并让脚本使用该信息组成相关答案 - 将相关信息/操作记录到文件中。

这样我就可以测试一个与Web服务器交互的App。该应用程序连接到我的脚本。我知道应用程序是如何通过拖尾(tail -f)日志文件与脚本交互的。该脚本为应用程序提供了答案。