Shadow_1512
Новичок
Возвращаемые заголовки в ответ на запрос методом HEAD на Windows и Unix
Суть проблемы:
есть некий софт, из которого человек может, нажав на кнопку обновить свою базу данных, для этого программа шлет сначала запрос методом HEAD на сервер, определяя имя файла, его длину, поддерживается ли докачка и пр., после чего уже шлет запрос методом GET.
На сервере эти 2 запроса обрабатываются по-разному, в ответ на первый шлются следующие заголовки:
Эта одна из функций класса, поэтому не удивляйтесь на $this. Параметром туда передается полный путь до файла.
В общем тут можно и остановиться - на Unix-машине на запрос методом HEAD сервер отвечает ровно то, что я его прошу. На Windows он отвечает в общем то же, но Content-Length заголовка просто нет. Проверял Снифферами - этот заголовок действительно сервером не посылается.
В чем соль?
Суть проблемы:
есть некий софт, из которого человек может, нажав на кнопку обновить свою базу данных, для этого программа шлет сначала запрос методом HEAD на сервер, определяя имя файла, его длину, поддерживается ли докачка и пр., после чего уже шлет запрос методом GET.
На сервере эти 2 запроса обрабатываются по-разному, в ответ на первый шлются следующие заголовки:
PHP:
function getAnswerToHead($file)
{
$fsize = filesize($file);
$range = 0;
if(file_exists($file))
{
$handle = @fopen($file, "rb");
if(getenv("HTTP_RANGE"))
{
$range = getenv("HTTP_RANGE");
$range = str_replace("bytes=", "", $range);
$range = str_replace("-", "", $range);
fseek($handle, $range);
header("HTTP/1.0 206 Partial Content\r\n");
}
else
{
header("HTTP/1.0 200 OK\r\n");
}
header("Pragma: no-cache\r\n");
header("Expires: 0\r\n");
header("Content-Type: application/force-download\r\n");
header("Cache-Control: private\r\n");
header("Content-Disposition: attachment; filename=" . basename($file) . "\r\n");
header("Content-Transfer-Encoding: binary\r\n");
header("Content-Length: ". ($fsize-$range) . "\r\n");
header("Accept-Ranges: bytes\r\n");
header("Content-Range: bytes $range-" . ($fsize-1) . "/" . $fsize . "\r\n");
fclose($handle);
}
else
{
//Файла нет.
$this->text_answer = 'Empty File Request!';
return false;
}
}
В общем тут можно и остановиться - на Unix-машине на запрос методом HEAD сервер отвечает ровно то, что я его прошу. На Windows он отвечает в общем то же, но Content-Length заголовка просто нет. Проверял Снифферами - этот заголовок действительно сервером не посылается.
В чем соль?

