Запросы Javascript Dojo AJAX (XHR) с пользовательскими заголовками в Firefox - PullRequest
2 голосов
/ 28 января 2010

Я пытаюсь сделать запрос, используя dojo.xhrGet , чтобы получить некоторые данные XML с сервера. Я использую додзе 1.4.0.

Сервер требует, чтобы я передавал учетные данные через специальный заголовок HTTP с именем Myauthtoken.

В Safari все отлично работает. Код открывает диалоговое окно, показывающее [object Document]. Но в Firefox диалог показывает null. В какой-то момент процесса пользовательский заголовок удаляется или поврежден, и сервер его не принимает.

Соответствующий код выглядит примерно так:

dojo.xhrGet({
  url: 'https://host.com/path/to/thing?param1=one&param2=two',
  headers: {
    'Myauthtoken': 'username:password'
  },
  handleAs: 'xml',
  load: function(response) {
    alert(response);
  },
  error: function(e) {
    alert("error: " + e);
  }
});

В Firefox Firebug отображает следующие заголовки запроса:

Хост: host.com
User-Agent: Mozilla / 5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv: 1.9.1.7) Gecko / 20091221 Firefox / 3.5.7
Примите: текст / html, приложение / xhtml + xml, приложение / xml; q = 0,9, / ; q = 0,8
Accept-Language: en-us, en; q = 0,5
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-1, utf-8; q = 0,7, *; q = 0,7
Keep-Alive: 300
Соединение: keep-alive
Происхождение: ноль
Метод контроля доступа-запроса: GET
Заголовки-Access-Control-Request-*: myauthtoken, х-запрос-с

Сервер отвечает 403 (запрещено) и эти заголовки ответа:

Дата: Четверг, 28 января 2010 г. 20:02:47 GMT
Сервер: Noelios-Restlet-Engine / 1.0.6
Тип содержимого: text / html; кодировка = ISO-8859-1
Длина содержимого: 337
Соединение: закрыть


Обновление! Я занимался исследованиями, и похоже, что проблема в том, что Firefox пытается предварительно выполнить запрос из-за пользовательских заголовков , а Safari - нет, а вместо этого просто отправляет пользовательские заголовки без предварительной проверки. если они действительны.

Я тоже разобрался как посмотреть запрос в Safari :

Cache-Control: max-age = 0
Тип содержимого: application / x-www-form-urlencoded
Myauthtoken: имя пользователя: пароль
User-Agent: Mozilla / 5.0 (Macintosh; U; Intel Mac OS X 10_5_8; ru-ru) AppleWebKit / 531.21.8 (KHTML, как Gecko) Версия / 4.0.4 Safari / 531.21.10

И заголовки ответа:

Cache-Control: без магазина
Соединение: закрыть
Длина содержимого: 236391
Тип содержимого: application / xml; кодировка = ISO-8859-1
Дата: Пт, 29 января 2010 23:02:22 GMT
Сервер: Noelios-Restlet-Engine / 1.0.6

Основным отличием является Content-Length: 235391

К сожалению, я все еще не намного ближе к тому, чтобы найти решение - все еще ищу какие-то хорошие идеи или вообще какие-то идеи.

Есть мысли о том, что происходит и как я могу обойти это?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 06 февраля 2010

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

Firefox отправляет myauthtoken, а сервер ожидает Myauthtoken.

В конце концов, все сводилось к фрагменту кода, в котором мы использовали getFirstValue(String name), который по умолчанию учитывает регистр вместо getFirstValue(String name, boolean ignoreCase).

Остерегайтесь чувствительных к регистру заголовков!

0 голосов
/ 30 января 2010

Я полагаю, что для пользовательских заголовков вам нужно использовать префикс X-:

X-Myauthtoken: имя пользователя: пароль

  headers: {
    'X-Myauthtoken': 'username:password'
  },

Сервер также должен принять его, поскольку это нестандартный заголовок.

...