تبديل ملفات تعريف الوكيل ينبغي أن يغيّر الحساب المحدد، لا أن يضيف مستمع onAuthRequired آخر. وإلا فقد تستمر الإغلاقات القديمة في الرد بحساب من اختيار سابق.

سجّل مستمعًا واحدًا مسمّى في المستوى الأعلى لعامل الخدمة. واقرأ الحساب الحالي عند وصول حدث:

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'],
);

يفترض هذا المقطع أن الإضافة تخزّن وكيل HTTP المحدد أصلًا تحت selectedProxy، بمنفذ رقمي وحسابه المقصود. يحتاج بيان الإضافة إلى webRequest وwebRequestAuthProvider وstorage وأذونات المضيف المطلوبة. كما يحتاج اختيار الوكيل نفسه إلى إذن proxy.

يحدث التسجيل بشكل متزامن. يُقرأ التخزين داخل رد النداء، بعد أن يصبح لدى Chrome مستمع مثبّت للإرسال إليه. التسجيل فقط بعد حلّ وعد التخزين الأولي ينشئ فجوة في الاستيقاظ.

أضف حدًا للرفض قبل النشر

يعرض المقطع التسجيل واختيار الحساب. أضف سجل إعادة محاولة محدودًا لكل طلب حتى لا تُرسل كلمة مرور مرفوضة إلى ما لا نهاية. نظّف ذلك السجل عند الإكمال أو الفشل. قد تختفي المتغيرات العامة للعامل عند توقفه، لذا احفظ الحالة اللازمة بين الاستيقاظات في منطقة تخزين مناسبة للإضافة.

يبقى storage.session عبر إعادة تشغيل العامل داخل جلسة المتصفح؛ وهو ليس تخزينًا دائمًا للحساب عبر إعادة تشغيل المتصفح. حدّد ما تفعله الإضافة عندما لا يتوفر حساب محدد.

تمنع فحوص isProxy وchallenger تحدّي موقع غير ذي صلة من تلقي هذا الحساب. إذا لم يرسل المتصفح الحدث أبدًا، فلا يمكن لتنظيف المستمع وحده أن ينتجه: افحص الطلب الفعلي والأذونات وسلوك المتصفح كلًا على حدة.

مقالات ذات صلة