Получение «Требуется проверка подлинности прокси» при выполнении XMLHttpRequest (перекрестное происхождение) в фоновом скрипте Chrome Extension - PullRequest
2 голосов
/ 01 августа 2011

Вопрос

Я получаю Error 407 'Proxy authentication required 'при выполнении перекрестного запроса XMLHttpRequest на фоновой странице моего расширения Google Chrome.

У меня Chrome настроен на использование HTTP-прокси, для которого требуется имя пользователя и пароль (обычная аутентификация).

Приведенный ниже код работает, если у меня не установлен прокси в Chrome (как и ожидалось).

Когда я впервые открываю Chrome, он запрашивает мои учетные данные прокси-сервера, которые я ввожу, и запоминает до конца сеанса.

Я предполагаю, что расширение находится в своем собственном процессе и поэтому не имеет учетных данных для прокси-сервера.

Мой вопрос: есть ли способ обойти это? Есть ли способ заставить XMLHttpRequest работать в фоновом скрипте расширения, независимо от того, какие настройки прокси установлены в браузере Chrome?

Я запускаю Chrome с chrome.exe --proxy-server=my.proxy.server:3128 в Windows, если это актуально.

Пример кода

manifest.json

{
  [...]
  "background_page": "background.html",
  "permissions": [
    "http://example.org/",
    "http://mysite.com/"
  ],
  "content_scripts": [
    {
      "matches": [
        "http://example.org/*" 
      ],
      "js": ["contentscript.js"]
    }
  ]
}

background.html-> background.js:

function getById(request, sender, sendResponse) {
  var xhr = new XMLHttpRequest();
  xhr.onreadystatechange = function(data) {
    if (xhr.readyState == 4) {
      if (xhr.status == 200) {
        sendResponse(JSON.parse(xhr.responseText));
      } 
      else {
        // xhr.status == 407 here
        sendResponse(null);
      }
    }
  }
  var url = 'http://mysite.com/script.php?id=' + request.id;
  xhr.open('GET', url, true);
  xhr.send();
}

chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
  if ( request.action == 'getById' ) {
    getById(request, sender, sendResponse);
  }
  else {
    sendResponse(null);
  }
});

contentscript.js:

chrome.extension.sendRequest({
  'action': 'getById',
  'id': 42
}, function(response) {
  alert(response)
});
...