`/src/Protocols/Http.php` `Content-Length` 疑问
tianyiw2013 opened this issue · 8 comments
if ($pos = stripos($header, "\r\nContent-Length: ")) {
$length += (int)substr($header, $pos + 18, 10);
$hasContentLength = true;
}
$length += (int)substr($header, $pos + 18, 10);
第三个参数为什么是固定数字10呢?是有特别的原因吗?
我觉得应该改成
$length += substr($header, $pos + 18, strpos($header, "\r\n", $pos + 18) - $pos - 18);
感觉你写的更加合理点。
- 你这代码看似完整性,但功能来说他那个没问题的,你失去了可读性。
- 如何解决这问题,添加一行英文注释说明下10的含义就行了。
- 你这代码看似完整性,但功能来说他那个没问题的,你失去了可读性。
- 如何解决这问题,添加一行英文注释说明下10的含义就行了。
源代码是$length += (int)substr($header, $pos + 18, 10);
截取了10个字符长度,应该不正确,不一定是10个字符长度呢,然后强制转换为int,如果不强制转换的话,有可能截取到的结果是999\nxxx
workerman/src/Protocols/Http.php
Lines 133 to 139 in 1c24fe4
两个判断重复,第一个强制截取了10个字节,第二个好像永远不会执行。
- 你这代码看似完整性,但功能来说他那个没问题的,你失去了可读性。
- 如何解决这问题,添加一行英文注释说明下10的含义就行了。
源代码是
$length += (int)substr($header, $pos + 18, 10);
截取了10个字符长度,应该不正确,不一定是10个字符长度呢,然后强制转换为int,如果不强制转换的话,有可能截取到的结果是999\nxxx
int 32 位最大才多少,他这个极限是999999999字节,你见过这么大的网页文本(9G)?
截取到字符串的情况,强制转换int类型他不是已经处理这情况了?(int) substr(xxx);
- 你这代码看似完整性,但功能来说他那个没问题的,你失去了可读性。
- 如何解决这问题,添加一行英文注释说明下10的含义就行了。
源代码是
$length += (int)substr($header, $pos + 18, 10);
截取了10个字符长度,应该不正确,不一定是10个字符长度呢,然后强制转换为int,如果不强制转换的话,有可能截取到的结果是999\nxxx
int 32 位最大才多少,他这个极限是999999999字节,你见过这么大的网页文本(9G)? 截取到字符串的情况,强制转换int类型他不是已经处理这情况了?(int) substr(xxx);
你这么说确实没问题,但我忘记是因为什么发现的这个bug了,这行代码报过错~_~
- 你这代码看似完整性,但功能来说他那个没问题的,你失去了可读性。
- 如何解决这问题,添加一行英文注释说明下10的含义就行了。
源代码是
$length += (int)substr($header, $pos + 18, 10);
截取了10个字符长度,应该不正确,不一定是10个字符长度呢,然后强制转换为int,如果不强制转换的话,有可能截取到的结果是999\nxxx
复现问题给作者,然后pr修复一下。你这样写作者应该不会采取的(增加开销不说,可读性差太多了。)
标准http报文测试没有问题
<?php
$header = "HTTP/1.1 200 OK \r\nAccess-Control-Allow-Methods: POST, GET \r\nAccess-Control-Allow-Origin: https://www.baidu.com"." \r\nContent-Length: 105 \r\nContent-Type: application/json; charset=utf-8\r\n\r\n";
$pos = strpos($header, "\r\nContent-Length: ");
$value = substr($header, $pos + 18, 10);
$length = (int)$value;
var_dump($value, $length, $length === 105);
输出结果:
string(10) "105
Cont"
int(105)
bool(true)
有些看似不合理的代码,实则很巧妙,当然你的出发点也是没错的,更加严谨。