تغییر پروفایل‌های پروکسی باید حساب انتخاب‌شده را عوض کند، نه اینکه شنونده onAuthRequired دیگری اضافه کند. در غیر این صورت بستارهای قدیمی می‌توانند همچنان با حساب انتخاب قبلی پاسخ دهند.

یک شنونده نام‌دار در سطح بالای service worker ثبت کنید. هنگام رسیدن رویداد، حساب فعلی را بخوانید:

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 شنونده نصب‌شده‌ای برای ارسال داشته باشد. ثبت فقط پس از حل یک promise اولیه حافظه، شکاف بیدارشدن ایجاد می‌کند.

پیش از انتشار حد رد را اضافه کنید

قطعه ثبت و انتخاب حساب را نشان می‌دهد. برای هر درخواست یک رکورد تلاش مجدد محدود اضافه کنید تا گذرواژه ردشده بی‌پایان ارسال نشود. آن رکورد را در پایان یا شکست پاک کنید. متغیرهای سراسری worker ممکن است با توقف worker ناپدید شوند، پس وضعیت لازم بین بیدارشدن‌ها را در ناحیه ذخیره‌سازی مناسب افزونه نگه دارید.

storage.session در طول نشست مرورگر از راه‌اندازی مجدد worker جان سالم به در می‌برد؛ ذخیره‌سازی دائمی حساب بین راه‌اندازی‌های مجدد مرورگر نیست. تعریف کنید افزونه وقتی حساب انتخاب‌شده‌ای موجود نیست چه می‌کند.

بررسی‌های isProxy و challenger مانع می‌شوند چالش یک وب‌سایت نامرتبط این حساب را دریافت کند. اگر مرورگر هرگز رویداد را ارسال نکند، پاکسازی شنونده به‌تنهایی نمی‌تواند آن را تولید کند: درخواست واقعی، مجوزها و رفتار مرورگر را جداگانه بررسی کنید.

مقالات مرتبط