PHP HTTP header 结束(或检测 CR LF)

标签 php http header newline

出于测试目的,我想用 PHP 构建一个简单的 HTTP 服务器。 我知道 HTTP header 由空行上的\r\n 终止,我想检测该模式,以便我知道我的服务器何时收到所有 header 并可以响应客户端。

即使我也像这样模拟客户端:

$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));

我无法检测 header 的结尾。我的思维逻辑一定有问题。这是我尝试检测模式的代码:

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 表示 header 的结尾。 非常感谢任何帮助。

最佳答案

不是答案,但对于评论来说太大/丑陋:

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

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

/[a|b|c]/ 读起来几乎相同,除了它是“如果它是'a'或'b'或'c'或'|'”。

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

关于PHP HTTP header 结束(或检测 CR LF),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9810872/

相关文章:

javascript - .htaccess 隐藏 .php 文件扩展名,改为显示/(斜杠)

PHP 在非小数上显示尾随零

javascript - 如何防止用户手动访问网址,要求他们单击链接才能到达那里

java - 在请求中设置用户角色以实现基于角色的访问以保护 Jersey 中的 Web 服务

php - 我应该通过 PHP 还是 Javascript 处理重定向?

linux - 编译时出现 undefined reference 错误

php - Doctrine 生成实体命名空间问题?

java - 使用嵌入式 Spark 服务器同时使用 HTTPS 和 HTTP 的方法?

c# - .NET4.5 中异步 POST 方法的 HttpResponseMessage 异常

python - 如何使用 Python 进行简单的 http 重定向?