Возможно ли уловить ошибки CORS?

Этот вопрос связан с совместным использованием ресурсов Cross-Origin (CORS, http://www.w3.org/TR/cors/).

Если при выполнении запроса CORS возникла ошибка, Chrome (и другие браузеры AFAIK) регистрирует ошибку на консоли ошибок. Пример сообщения может выглядеть следующим образом:

XMLHttpRequest не может загрузить http://domain2.example. Происхождение http://domain1.example не допускается с помощью Access-Control-Allow-Origin.

Мне интересно, есть ли способ программно получить это сообщение об ошибке? Я попытался обернуть мой вызов xhr.send() в try/catch, я также попытался добавить обработчик события onerror(). Ни один из которых не получает сообщение об ошибке.

Ответ 1

См:

... а также заметки в XHR Level 2 о CORS:

Информация намеренно отфильтровывается.

Редактируйте много месяцев спустя: Следующий комментарий здесь спросил "почему"; на якоре в первой ссылке отсутствовало несколько символов, из-за чего было трудно увидеть, в какой части документа я имел в виду.

Это средство безопасности - попытка избежать раскрытия информации в заголовках HTTP, которые могут быть чувствительными. Ссылка W3C о CORS говорит:

Пользовательские агенты должны отфильтровывать все заголовки ответов, отличные от тех, которые являются простыми заголовками ответов, или имя поля не соответствует значению ASCII для одного из значений заголовков Access-Control-Expose Headers (если любой), прежде чем подвергать заголовки ответов API-интерфейсам, определенным в спецификациях API CORS.

Этот отрывок содержит ссылки для "простого заголовка ответа", в котором перечислены Cache-Control, Content-Language, Content-Type, Expires, Last-Modified и Pragma. Так что те передаются. Заголовок заголовка "Access-Control-Expose-Headers" позволяет удаленному серверу выставлять другие заголовки, перечисляя их там. Для получения дополнительной информации см. Документацию W3C.

Помните, что у вас есть одно происхождение - скажем, что веб-страница, которую вы загрузили в своем браузере, запустила некоторый бит JavaScript - и script отправляет запрос другому источнику, что обычно не разрешено, поскольку вредоносное ПО может сделать неприятные вещи таким образом. Таким образом, браузер, запускающий script и выполняющий HTTP-запросы от своего имени, действует как гейткипер.

Браузер смотрит на ответ с этого сервера "другого происхождения", и, если он не кажется "принимающим участие" в CORS, требуемые заголовки отсутствуют или искажены - тогда мы не в состоянии доверять. Мы не можем быть уверены, что локальная работа script работает добросовестно, поскольку, похоже, она пытается связаться с серверами, которые не ожидали, что вас свяжут таким образом. Браузеру, конечно же, не следует "утекать" какую-либо конфиденциальную информацию с этого удаленного сервера, просто передав весь ответ на script без фильтрации, что в основном позволит разрешить запрос на перекрестный поиск. Будет обнаружена уязвимость, связанная с раскрытием информации.

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