PHP HTTP头端(或检测CR LF)


PHP HTTP Header end (or detect CR LF)

出于测试目的,我想用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指示标头结尾的。非常感谢您的帮助。

不是一个答案,但对于评论来说太大/太难看了:

['r'n|'r|'n]并不是真正正确的语法。字符类([])匹配采用括号内的任何内容,并将其用作搜索字符串中单个字符的潜在匹配。|交替运算符在[]中的作用与在()中的作用不同。例如

/[abc]/读作"如果有任何一个字符是‘a’、‘b’或‘c’",则它是匹配的。

/[a|b|c]/读起来几乎相同,只是它是"如果它是‘a’或‘b’或‘c’或‘|’"。

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

谢谢Marc B.

我没有找到解决这个问题的办法。

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

通过这种方式,我可以测试一个与网络服务器交互的应用程序。该应用程序连接到我的脚本。我知道应用程序是如何通过尾随(tail-f)日志文件来与脚本交互的。脚本为应用程序提供了答案。