CHttpRequest::sendFile()

Уже исправленные репорты или принятые предложения
Закрыто
Yiivgeny
Сообщения: 80
Зарегистрирован: 2010.11.24, 10:39

CHttpRequest::sendFile()

Сообщение Yiivgeny »

Суть ошибочного поведения:
При включенной директиве "zlib.output_compression", скачка длится бесконечное число времени при использовании метода CHttpRequest::sendFile().

Причина в заголовке Content-Length, который посылается 705 строкой файла CHttpRequest.php
Выдается длина тела заведомо большая чем будет на самом деле, и в итоге браузер ждет и ждет окончания тела, которого не будет.

Код: Выделить всё

if(ini_get("output_handler")=='')
            header('Content-Length: '.(function_exists('mb_strlen') ? mb_strlen($content,'8bit') : strlen($content))); 
Имхо такая проверка некорректна, т.к.:
1) Не всегда (и даже чаще всего) OB включают не в конфигурации ini, а в коде. Это значит что даже если директива пуста, это не гарантирует того что на выходе будет совсем другой контент.
2) Не только эта директива отвечает за постобработку результата, а так же например "zlib.output_compression". Если не ошибаюсь аналоги есть для mbstring, iconv и tidy, не факт что все можно перечислить.

В итоге предлагаю делать проверку с помощью функции ob_get_status, которая выдает актуальный результат для всех перечисленных случаев, в т.ч. и для директивы "output_handler"

При наличии любой буферизации с обработкой посылать информацию о длине некорректно.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: CHttpRequest::sendFile()

Сообщение samdark »

В 1.1.8 не исправилось? Там Qiang что-то фиксил на эту тему.
Yiivgeny
Сообщения: 80
Зарегистрирован: 2010.11.24, 10:39

Re: CHttpRequest::sendFile()

Сообщение Yiivgeny »

Эм..нет.
Вложения
yii.GIF
yii.GIF (44.45 КБ) 5801 просмотр
Yiivgeny
Сообщения: 80
Зарегистрирован: 2010.11.24, 10:39

Re: CHttpRequest::sendFile()

Сообщение Yiivgeny »

Код: Выделить всё

Index: web/CHttpRequest.php
===================================================================
--- web/CHttpRequest.php        (revision 3336)
+++ web/CHttpRequest.php        (working copy)
@@ -701,7 +701,7 @@
                header('Expires: 0');
                header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
                header("Content-type: $mimeType");
-               if(ini_get("output_handler")=='')
+               if(!ob_get_status())
                        header('Content-Length: '.(function_exists('mb_strlen') ? mb_strlen($content,'8bit') : strlen($content)));
                header("Content-Disposition: attachment; filename=\"$fileName\"");
                header('Content-Transfer-Encoding: binary');
Поправьте, а? 0:-)
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: CHttpRequest::sendFile()

Сообщение samdark »

Чуть позже залью…
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: CHttpRequest::sendFile()

Сообщение samdark »

Мб имелся ввиду ob_get_length, а не ob_get_status?
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: CHttpRequest::sendFile()

Сообщение samdark »

Yiivgeny
Сообщения: 80
Зарегистрирован: 2010.11.24, 10:39

Re: CHttpRequest::sendFile()

Сообщение Yiivgeny »

Sam Dark писал(а):Мб имелся ввиду ob_get_length, а не ob_get_status?
Принципиальной разницы нет, пустой массив из ob_get_status означает что буферизация не используется, так же как и FALSE возвращаемый ob_get_length означает что буферизация отключена. Только именно для получения статуса думаю предназначена функция с таким же названием.

Спасибо. Должно работать. Проверю.
Yiivgeny
Сообщения: 80
Зарегистрирован: 2010.11.24, 10:39

Re: CHttpRequest::sendFile()

Сообщение Yiivgeny »

Проверил. Все отлично.
Закрыто