Протоколу HTTP нужен способ определить, когда закончился ответ. В соответствии с
4.4 Длина сообщения
Длина передачи сообщения - это длина тела сообщения в том виде, в котором оно отображается в сообщении; то есть после применения любых кодировок передачи. Когда тело сообщения включается в сообщение, длина передачи этого тела определяется одним из следующих условий (в порядке приоритета):
1. Любое ответное сообщение, которое «НЕ ДОЛЖНО» включать тело сообщения (например, ответы 1xx, 204 и 304 и любой ответ на запрос HEAD) всегда заканчивается первой пустой строкой после полей заголовка, независимо от Поля заголовка объекта, присутствующие в сообщении.
2. Если поле заголовка Transfer-Encoding (раздел 14.41) присутствует и имеет любое значение, отличное от «identity», то длина передачи определяется с использованием «фрагментированного» кодирования передачи (раздел 3.6), если только сообщение завершается закрытием соединения.
3. Если поле заголовка Content-Length (раздел 14.13) присутствует, его десятичное значение в OCTET представляет как длину объекта, так и длину передачи. Поле заголовка Content-Length НЕ ДОЛЖНО отправляться, если эти две длины различаются (например, если Transfer-Encoding
header field is present). If a message is received with both a
Transfer-Encoding header field and a Content-Length header field,
the latter MUST be ignored.
4. Если в сообщении используется тип мультимедиа «multipart / byteranges» и длина передачи не указана иначе, то этот саморазграничивающийся тип мультимедиа определяет длину передачи. Этот тип носителя НЕ ДОЛЖЕН использоваться, если отправитель не знает, что получатель может его проанализировать; присутствие в запросе заголовка Range с несколькими спецификаторами диапазона байтов от клиента 1.1 означает, что клиент может анализировать ответы multipart / byteranges.
A range header might be forwarded by a 1.0 proxy that does not
understand multipart/byteranges; in this case the server MUST
delimit the message using methods defined in items 1,3 or 5 of
this section.
5. При закрытии соединения сервером. (Закрытие соединения не может использоваться для обозначения конца тела запроса, поскольку это не оставит возможности для сервера отправить ответ.)
Для совместимости с приложениями HTTP / 1.0 запросы HTTP / 1.1, содержащие тело сообщения, ДОЛЖНЫ включать допустимое поле заголовка Content-Length, если только сервер не является совместимым с HTTP / 1.1. Если запрос содержит тело сообщения, а Content-Length не задано, серверу СЛЕДУЕТ ответить 400 (неверный запрос), если он не может определить длину сообщения, или 411 (требуется длина), если он хочет настоять на получение действительного Content-Length.
Все приложения HTTP / 1.1, которые получают объекты, ДОЛЖНЫ принимать "фрагментированное" кодирование передачи (раздел 3.6), что позволяет использовать этот механизм для сообщений, когда длина сообщения не может быть определена заранее.
Сообщения НЕ ДОЛЖНЫ включать в себя как поле заголовка Content-Length, так и неидентификационное кодирование передачи. Если сообщение действительно включает неидентификационное кодирование передачи, Content-Length ДОЛЖЕН игнорироваться.
Когда Content-Length дается в сообщении, где разрешено тело сообщения, значение его поля ДОЛЖНО точно соответствовать количеству OCTET в теле сообщения. Пользовательские агенты HTTP / 1.1 ДОЛЖНЫ уведомлять пользователя о получении и обнаружении недопустимой длины.
Вы не можете просто случайным образом добавлять заголовки и ожидать, что они будут соблюдаться (другие заголовки могут иметь приоритет). Вам необходимо в первую очередь контролировать все, возможно, переопределяющие заголовки, сгенерированные в первую очередь.
Transfer-Encoding
не отображается в заголовках ответов), и я не могу заставить его принудительно использовать HTTP / 1.0 ... - person Niet the Dark Absol   schedule 26.01.2013ob_start(); /* output json */ $content = ob_get_clean(); header('Content-Length: '.strlen($content)); print($content);
? Хотя было бы неожиданно, что ваш обратный вызовob_start
не будет выполнен, вы определенно можете ожидать чего-нибудь неожиданного от PHP. - person lanzz   schedule 27.01.2013/ajax/getdata
, файл -getdata.php
. - person Niet the Dark Absol   schedule 29.01.2013ob_start
-with-callback?) То, что он отправит любой заголовок, ноContent-Length
действительно странно. - person Ry-♦   schedule 29.01.2013curl -I <url>
? - person slm   schedule 30.01.2013