Closed matyhtf closed 5 years ago
目前底层提供的Response::header()方法参数为Key-Value方法,并且存在一个一维数组中。因此不支持重复的 Http Header 设置。
Response::header()
Key-Value
根据Http协议,Http Header是可以重复的。因此需要增加一个Http\Response::writeHeader设置任意Http Header。
Http
Http Header
Http\Response::writeHeader
方法接受一个字符串参数,末尾不需要加\r\n,需要进行rtrim操作,避免用户代码添加额外的CRLF导致协议错误。
\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头。
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
Http\Response
rawHeaders
Response
headers
个人觉得这属于Bug修复,建议底层存储结构改为二维数组,然后Response::header()函数第二参数$value同时支持字符串和数组,发版本时说明下这个变更。
二维数组
$value
字符串
数组
@hhxsv5 非常好的提议。赞
goto https://github.com/swoole/rfc-chinese/issues/53
现状
目前底层提供的
Response::header()
方法参数为Key-Value
方法,并且存在一个一维数组中。因此不支持重复的 Http Header 设置。根据
Http
协议,Http Header
是可以重复的。因此需要增加一个Http\Response::writeHeader
设置任意Http Header
。代码
方法接受一个字符串参数,末尾不需要加
\r\n
,需要进行rtrim
操作,避免用户代码添加额外的CRLF
导致协议错误。应用层应当自行对字符进行 URL 编码,底层仅拼接字符串并输出。
对端浏览器将收到一个重复的
X-Info
头。实现
Http\Response
底层增加一个rawHeaders
属性Http\Response::writeHeader
操作向该属性数组中追加字符串元素Response
数据包时,在headers
之后追加rawHeaders
内容