swoole / rfc

Swoole 提案
116 stars 3 forks source link

Http\Response 增加 writeHeader 方法,可设置任意 Http Header 输出 #52

Closed matyhtf closed 5 years ago

matyhtf commented 5 years ago

现状

目前底层提供的Response::header()方法参数为Key-Value方法,并且存在一个一维数组中。因此不支持重复的 Http Header 设置

根据Http协议,Http Header是可以重复的。因此需要增加一个Http\Response::writeHeader设置任意Http Header

代码

方法接受一个字符串参数,末尾不需要加\r\n,需要进行rtrim操作,避免用户代码添加额外的CRLF导致协议错误。

应用层应当自行对字符进行 URL 编码,底层仅拼接字符串并输出。

$http = new Swoole\Http\Server("127.0.0.1", 9501);
$http->on('request', function ($request, $response) {
    $response->writeHeader("X-Info: PHP");
    $response->writeHeader("X-Info: Swoole");
    $response->end("<h1>Hello Swoole. #".rand(1000, 9999)."</h1>");
});
$http->start();

对端浏览器将收到一个重复的X-Info头。

HTTP/2.0 200 OK
Server: nginx/1.10.3 (Ubuntu)
Date: Sun, 21 Apr 2019 13:43:16 GMT
X-Info: PHP
X-Info: Swoole

实现

hhxsv5 commented 5 years ago

个人觉得这属于Bug修复,建议底层存储结构改为二维数组,然后Response::header()函数第二参数$value同时支持字符串数组,发版本时说明下这个变更。

matyhtf commented 5 years ago

@hhxsv5 非常好的提议。赞

matyhtf commented 5 years ago

goto https://github.com/swoole/rfc-chinese/issues/53