我编写了一个允许我在PHP中发送HTTP GET请求的函数:
function get_HTTPS_page_with_version($url, $hostname, $use_HTTP_1_0 = false, &$headers = NULL, $follow_redirect = true, $use_SSL = true) {
$context = Array(
"http" => Array(
"method" => "GET",
"ignore_errors" => true,
"follow_location" => $follow_redirect,
"user_agent" => "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36",
"header" => "Accept-language: en")
);
if ($use_SSL) {
$context["ssl"] = Array(
"peer_name" => $hostname,
"SNI_server_name" => $hostname,
"verify_peer_name" => false,
"verify_peer" => false);
}
if (!$use_HTTP_1_0) {
$context["http"]["protocol_version"] = "1.1";
$context["http"]["header"] .= "\r\nHost: $hostname".
"\r\nConnection: close";
}
$page = file_get_contents($url, false, stream_context_create($context));
$responseCode = get_HTTP_response_code($http_response_header);
$headers = $http_response_header;
return Array($responseCode, $page);
}
问题在于,当我使用此函数获取特定文件(Verisign Certificate Revocation List)时,它会在开头附加一些字符:
6639 6361 0a0d --> f9 ca \n\r
并在文件的末尾:
0a0d 0d30 0d0a 000a --> \n\r \r0 \r\n NUL\n
我比较了使用Wget和使用此功能手动获取的文件,以及使用Wireshark在网络级别获得的文件,我可以确认服务器发送的文件在两种情况下都是相同的。
我也没有Thawte CRL
的问题有没有人知道可能导致这种行为的原因?
修改
Verisign CRL已更改,其他字节由file_get_contents添加,而不是我上面列出的那些,但结果仍然相同 - >使用此功能下载文件时,文件与手动使用wget不同。
编辑2
$use_HTTP_1_0 = true
时没有问题。Accept-Encoding: gzip,
deflate
时没有问题(除了我得到一个gz文件,我宁愿避免
这个:))Connection
更改close
时,仍然存在问题
到Keep-Alive