2015-11-23 6 views
3

Я работаю с инструментом запроса HTTP (аналогично cURL) и имеет проблему с ответом сервера. Либо это, либо мое понимание RFC для HTTP 1.1 и chunked данных.Почему некоторые серверы не используют CRLF после последней длины пакета?

Что я вижу в блочной данные должны быть в следующем формате:

4\r\n 
Wiki\r\n 
5\r\n 
pedia\r\n 
e\r\n 
in\r\n\r\nchunks.\r\n 
0\r\n 
\r\n 

то, что я на самом деле наблюдаем следующие:

4\r\n 
Wiki\r\n 
5\r\n 
pedia\r\n 
e\r\n 
in\r\n\r\nchunks.\r\n 
0 

Другими словами, несколько серверов I 'испытал с отправкой больше данных после 0 .. не CRLF, а тем более CRLFCRLF.

Как мы должны знать, что это конец фрагментированных данных без правильного формата фрагментированных тегов? Тайм-ауты случаются, глядя на CRLF после 0, и этого недостаточно.

+0

Это очень странно. Какой сервер отвечает такой ошибкой? Что у вас есть в заголовке сервера? Если бы у вас был хотя бы один CRLF после 0, вы могли бы что-то сказать, здесь вы все равно могли бы получить некоторые цифры, поэтому это явно ошибка. Или, может быть, ошибка в вашем синтаксическом коде? У вас есть tcpdump или захват проводов? – regilero

+0

Нет, у меня нет таких вещей. Это приложение сокета, которое я написал и использовал в течение многих лет. Но я столкнулся с проблемами с чередующимися данными. Кажется, что все остальное работает нормально, кроме 0 в конце (т. Е. После него нет CRLF). Я читаю байты по одному за раз, когда читаю фрагментированную длину, ища CRLF, поэтому я знаю, что это конец. Затем я конвертирую это значение из шестнадцатеричного в dec и считываю его из сокета. Это когда я прочитал последнее 0 и перечитаю еще один байт, чтобы время от времени выполняло select() в сокете, ожидая ее готовности. – bvstone

+0

, если вы уверены в поступающих данных, тогда сервер неисправен, ссылается на http://stackoverflow.com/a/2127723/550618 – regilero

ответ

-2

Используйте Content-Length, определенно каждый раз, когда я это знаю; для загрузки файлов проверка размера файла незначительна с точки зрения ресурсов. Для передачи пакетов мы не просматриваем тело сообщения для пары CRLF. Сначала он считывает указанное количество байтов, а затем считывает еще два байта, чтобы подтвердить, что они CR и LF. Если это не так, тело сообщения плохо сформировано, и либо размер был указан неправильно, либо данные были повреждены.

Для получения более подробной информации читайте RCF, который говорит

Сервер, с использованием блочной кодирования передачи в ответ НЕ ДОЛЖЕН использовать прицеп для любых полей заголовка, если по крайней мере один из следующих не верно:

a) запрос включал поле заголовка TE, которое указывает, что «прицепы» - это , приемлемые в передаточном кодировании ответа, как описано в разделе , раздел 14.39; или,

б) сервер является сервер происхождения для ответа, поля прицепа полностью состоять из необязательных метаданных, и получатель может использовать сообщений (в форме, приемлемой для сервера происхождения) без приема этого метаданные. Другими словами, исходный сервер желает принять возможность того, что поля трейлера могут быть пустыми , отброшенными по пути к клиенту.

способ определить длину тела сообщения:

Если заголовок имеет Transfer-Encoding и поблочного является окончательным кодирование, то длина тела сообщения определяется путем считывания и декодирования фрагментов данных, пока кодирование передачи не указывает на то, данные завершены.

Если заголовок имеет Transfer-Encoding, а передача каналов не является окончательным, то длина тела сообщения определяется путем считывания соединения до его закрытия сервером.

Если заголовок имеет передаточное кодирование в запросе, а передача каналов - окончательное кодирование, то длина сообщения не может быть надежно определена; сервер ДОЛЖЕН ответить с кодом состояния 400 (Bad Request), а затем закрыть соединение.

Если сообщение получено как с полем заголовка Transfer-Encoding, так и с Content-Length, Transfer-Encoding переопределяет Content-Length. Такое сообщение может указывать на попытку выполнить рассылку ответа запроса и должно быть обработано как ошибка. Отправитель ДОЛЖЕН удалить полученное поле Content-Length перед пересылкой такого сообщения вниз по течению.

+1

Я не вижу, как это ответ на вопрос. И Content-lenght - это не способ вычислить окончание передачи пакетов, конечно. – regilero

+0

@regilero, то как бы вы определили длину документа – Vineet1982

+0

По определению chunked transfer означает, что вы не имеете понятия о размере документа - вы ожидаете последний кусок--, и если у вас есть длина содержимого, * help *, какой-то сервер будет отклонять запросы, используя оба варианта, поскольку он может использоваться для атак с контрабандой http (с использованием разных размеров с двумя индикаторами в протоколе, который чрезвычайно чувствителен к размеру сообщения - например, в туннелировании http) – regilero

 Смежные вопросы

  • Нет связанных вопросов^_^