Schimbarea profilelor proxy ar trebui să schimbe contul selectat, nu să adauge un alt ascultător onAuthRequired. Altfel, closures vechi pot continua să răspundă cu contul dintr-o selecție anterioară.

Înregistrați un singur ascultător numit la nivelul superior al service worker-ului. Citiți contul curent când sosește un eveniment:

function answerProxyChallenge(details, reply) {
  if (!details.isProxy) {
    reply({});
    return;
  }
  chrome.storage.session.get('selectedProxy').then(({selectedProxy: p}) => {
    if (!p || details.challenger.host !== p.host ||
        details.challenger.port !== p.port) {
      reply({});
      return;
    }
    reply({authCredentials: {username: p.username, password: p.password}});
  }).catch(() => reply({cancel: true}));
}

chrome.webRequest.onAuthRequired.addListener(
  answerProxyChallenge,
  {urls: ['<all_urls>']},
  ['asyncBlocking'],
);

Acest fragment presupune că extensia stochează deja proxy-ul HTTP selectat sub selectedProxy, cu un port numeric și contul destinat. Manifestul are nevoie de webRequest, webRequestAuthProvider, storage și permisiunile de gazdă necesare. Și selectarea proxy-ului are nevoie de permisiunea proxy.

Înregistrarea are loc sincron. Stocarea este citită în callback, după ce Chrome are un ascultător instalat către care să livreze. Înregistrarea doar după ce se rezolvă o promisiune de stocare inițială creează o lacună de trezire.

Adăugați o limită de respingere înainte de lansare

Fragmentul arată înregistrarea și selectarea contului. Adăugați o înregistrare de reîncercare limitată pentru fiecare cerere, astfel încât o parolă respinsă să nu fie trimisă la nesfârșit. Curățați acea înregistrare la finalizare sau eșec. Variabilele globale ale worker-ului pot dispărea când worker-ul se oprește, așa că păstrați starea necesară între treziri într-o zonă de stocare adecvată a extensiei.

storage.session supraviețuiește repornirilor worker-ului în cadrul sesiunii browserului; nu este stocare permanentă a contului între repornirile browserului. Definiți ce face extensia când nu există niciun cont selectat disponibil.

Verificările isProxy și challenger împiedică o provocare de la un site nelegat să primească acest cont. Dacă browserul nu livrează niciodată evenimentul, doar curățarea ascultătorului nu îl poate produce: inspectați separat cererea reală, permisiunile și comportamentul browserului.

Articole similare