Почему невозможно загрузить файл с кодом состояния 4XX и 5XX - PullRequest
0 голосов
/ 10 февраля 2019

Я заметил, что многие http-клиенты, в том числе Firefox и Chrome, не позволяют загружать файлы для кодов ответов http с 4XX и 5XX.Однако некоторые клиенты разрешают такие загрузки, например, curl и wget (с опцией --content-on-error).

И Chrome, и Firefox не предоставляют хороших сообщений об исключениях.Chrome не работает с ERR_INVALID_RESPONSE.Firefox не работает с File not found.Как указано выше для curly и wget работают для одного и того же URL.

Мне было интересно, существует ли спецификация, определяющая правильное поведение в этом случае?Существуют ли веские причины, по которым Chrome и Firefox не могут обработать запрос?Кроме того, кажется странным, что они не обеспечивают надлежащую обратную связь.

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

Например, RFC7231 состояния

Ответные сообщения со статусом ошибкикод обычно содержит полезную нагрузку, представляющую состояние ошибки, так что он описывает состояние ошибки и возможные дальнейшие шаги для его устранения.


Класс 4xx (ошибка клиента)кода состояния указывает, что клиент, похоже, ошибся.За исключением случаев ответа на запрос HEAD, сервер ДОЛЖЕН послать представление, содержащее объяснение ситуации с ошибкой, и является ли это временным или постоянным условием.Эти коды состояния применимы к любому методу запроса.Пользовательские агенты ДОЛЖНЫ отображать любое включенное представление пользователю.

Это не запрещает загрузку в случае ошибки.


Редактировать из-за первогоответ:

Я не думаю, что это поведение удобно для пользователя, и я не думаю, что дружелюбие пользователя действительно является причиной этого.Например, было бы более целесообразно показывать код ошибки и сообщение об ошибке (предоставляется в заголовке) пользователю.Или, по крайней мере, укажите ошибку с сообщением об ошибке, например «невозможно загрузить файл, потому что сервер ответил с ошибкой».Могут быть серверы, которые могут отвечать только XML или любым другим произвольным форматом файла.

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

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

4XX: Почему вы предполагаете загрузку файла, если ваш клиент сделал что-то не так?

Если мы предположим, что API имеет конечную точку, которая отвечает с определенным форматом файла,Справедливо предположить, что в этом формате также имеется сообщение об ошибке, включающее подсказку о том, что клиент сделал неправильно.Таким образом, файл может помочь исправить ошибку клиента.

Ответы [ 5 ]

0 голосов
/ 19 февраля 2019

Основываясь на ответе @ lossleader , похоже, что Chromium решила последовать решению Firefox не загружать файлы, если ответ не был успешным.

Похоже, у этой проблемы есть история.В 2005 году на веб-сайте AOL возникла проблема, которая возвращала код состояния 500, в результате чего пользователи загружали файл .exe.Существовало «исправление», которое просто возвращает 404 для ответов, которые запускают загрузку, и с ошибочными ответами.Соответствующую проблему можно найти здесь .

Существует открытая проблема от 2008 года, которая жалуется на эту ошибку и заявляет, что она вводит в заблуждение.Соответствующий вопрос можно найти здесь .

Более подробный ответ об этом я нашел на Суперпользователь .

Я все еще думаю, что это будетПравильно, по крайней мере, предложить пользователю выбор загрузить файл или, по крайней мере, показать более значимую страницу с ошибкой.С другой стороны, в большинстве случаев загрузка кода ответа != 2XX является непреднамеренной и указывает на ошибку сервера.Поэтому кажется, что эта проблема имеет низкий приоритет для поставщиков браузеров и, похоже, "не стоит проблем".

0 голосов
/ 19 февраля 2019

Похоже, что все эти ответы обошли фундаментальное здесь: вы пытаетесь интерпретировать ошибку в вашем коде с помощью браузера.С моей точки зрения, во всех связанных случаях ваш код каким-то образом завершается сбоем без обработки ошибок.

4xx error?Вы отправили неверный запрос на сервер, согласно правилам , которые вы определили.Технически, это не вина браузера.

5xx ошибка? Ваш сервер упал и не выдал симпатичную ошибку.На некоторых типах серверов (Django) ошибка 500 будет набором отладочной информации, которую вы, вероятно, не должны показывать пользователю.

Таким образом, то, что вы запрашиваете, странно с архитектурной точки зрения;Вы хотите скрыть тот факт, что вы облажались, изменив ответ браузера, а не исправляя свой код так, чтобы он отвечал соответствующим образом.

0 голосов
/ 18 февраля 2019

Глядя на ручку хрома, а не на 2xx мы видим:

  // The response code indicates that this is an error page, but we don't
  // know how to display the content.  We follow Firefox here and show our
  // own error page instead of intercepting the request as a stream or a
  // download.

Итак, Chrome последовал Firefox, и оба полностью соответствуют RFC, браузер знает этоПолезная нагрузка - это неопознанные данные, относящиеся к состоянию ошибки, поэтому сохранить их как рассматриваемый файл не вариант.Поскольку он загружается, предположительно, браузер не может отображать полезную нагрузку, но в любом случае было указано, что нет, поэтому его отображение в контексте ошибки не является безопасным вариантом.Поскольку это ошибка, существует также высокая вероятность того, что отправитель объединил частичный ответ с кодом ошибки, означающим, что содержимое полезной нагрузки может быть неполным или поврежденным представлением данных из ответа 2xx / и т. Д.

Если вы оглянетесь назад на wget, --content-on-error - это особый вариант, потому что его нельзя использовать в качестве обычного браузера.Клиентская сторона, которая работает с типом полезной нагрузки, может проверять ошибки, когда она напрямую взаимодействует с сервером, а wget предоставляет только варианты, которые помогут вам отладить такое взаимодействие.В обычном браузере меньше возможностей для эмуляции других клиентов для отладки, чем в текстовом CLI, поскольку текстовый CLI существует главным образом для эмуляции другого клиента во время отладки.

0 голосов
/ 19 февраля 2019

Мне было интересно, есть ли спецификация, которая определяет правильное поведение в этом случае?Существуют ли веские причины, по которым Chrome и Firefox не могут обработать запрос?Кроме того, кажется странным, что они не обеспечивают надлежащую обратную связь.

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

Ответ от участника проекта Chromium:"Эта проблема была доступна более года. Если она более не важна или кажется маловероятной, что ее можно устранить, рассмотрите возможность ее закрытия . Если это важно, пожалуйста, выполните повторную сортировкупроблема."

Приносим извинения за неудобства, если ошибка действительно должна быть оставлена ​​как Доступно .

enter image description here

Вы можете проверить более подробную информацию здесь Выпуск 479265

Что происходит под поверхностью?

Я также проверил исходный код chromium, чтобы выяснить, что на самом деле происходит, и обнаружил, что для любого состояния, отличного от 200 для загрузок, они просто выдают ошибку ERR_INVALID_RESPONSE (неверный ответ сервера).

enter image description here

Короче говоря, Вы должны жить с этим поведением браузера , оно не будет улучшено.

0 голосов
/ 18 февраля 2019

Я не знаю ни одной спецификации по этой теме.Поведение должно быть максимально удобным для пользователя.

4XX: Почему вы предполагаете загрузку файла, если ваш клиент сделал что-то не так?Кроме того, клиентское программное обеспечение не может различаться в случае неправильного использования (например, неверный URL) и обработки загрузки файла.

5xx: Как вы указали, большинство API предоставляют информацию об ошибках, но вытакже не может отличаться в случае загрузки и, например, внутренней ошибки при предоставлении файла.

Вы можете использовать такое поведение с wget и curl, как вы упомянули, но это не удобно и не практично для использования такого API программно.

Имеющаяся в виду информация выше, Chrome и firefox просто стараются быть удобными для пользователя.

Я надеюсь, что смогу как-то ответить на ваш вопрос или оспорить идею, стоящую за этим.:)

...