בעיות נפוצות ובאגים בדיווח

כשנתקלים בבעיה בדחיפה של אינטרנט, יכול להיות קשה לנפות את הבאגים שגרמו לבעיה או לקבל עזרה. במאמר הזה נפרט כמה מהבעיות הנפוצות, ומה צריך לעשות אם מצאתם באג ב-Chrome או ב-Firefox.

לפני שאנחנו מתחילים בדחיפה לניפוי באגים, יכול להיות שאתם נתקלים בבעיות בניפוי באגים ב-Service Workers עצמם, שהקובץ לא מתעדכן, לא מצליח לבצע רישום או סתם התנהגות חריגה. יש מסמך מדהים על ניפוי באגים ב-Service Workers מומלץ מאוד לבדוק אם אתם רק התחלתם לפתח קובצי שירות (service worker).

יש שני שלבים נפרדים שצריך לסמן כשמפתחים ובודקים את דחיפת האינטרנט. לכל אחד מהם יש קבוצה משלו של בעיות נפוצות:

  • שליחת הודעה: מוודאים ששליחת ההודעות מתבצעת בהצלחה. אתם אמורים לקבל קוד HTTP מסוג 201. אם לא :
    • חיפוש שגיאות הרשאה: אם קיבלתם הודעת שגיאה להרשאה, עיינו בקטע 'בעיות בהרשאות'.
    • שגיאות API אחרות: אם קיבלתם תגובה של קוד סטטוס שאינו 201, עיינו בקטע קודי סטטוס HTTP כדי לקבל הנחיות לגבי הגורם לבעיה.
  • קבלת הודעה: אם הצלחתם לשלוח הודעה אבל ההודעה לא התקבלה בדפדפן:

אם אתם לא מצליחים לשלוח ולקבל הודעות בדחיפה, והקטעים הרלוונטיים במסמך הזה לא עוזרים לנפות את הבאגים שגרמו לבעיה, ייתכן שמצאתם באג במנגנון הדחיפה עצמו. במקרה כזה, כדאי לעיין בקטע העלאת דוחות על באגים ולהגיש דוח על באג עם כל המידע הנדרש כדי לזרז את תהליך תיקון הבאגים.

אחד הדברים שאני רוצה לציין לפני שנתחיל הוא ש-Firefox ו-Mozilla AutoPush Service כוללים הודעות שגיאה נהדרות. אם נתקעתם ולא בטוחים מה הבעיה, נסו לבדוק ב-Firefox אם קיבלתם הודעת שגיאה מועילה יותר.

בעיות בהרשאות

בעיות הרשאה הן אחת מהבעיות הנפוצות ביותר שמפתחים נתקלים בהן כשהם מתחילים לעבוד עם Web Push. בדרך כלל זו בעיה בהגדרת מפתחות שרת האפליקציות (שנקראים גם מפתחות VAPID) באתר.

הדרך הקלה ביותר לתמוך בדחיפה גם ב-Firefox וגם ב-Chrome היא לספק applicationServerKey בקריאה ל-subscribe(). החיסרון הוא שאי-התאמה בין המפתחות של ממשק הקצה לבין המפתחות של השרת תוביל לשגיאת הרשאה.

ב-Chrome וב-FCM

ב-Chrome, שמשתמש ב-FCM כשירות דחיפה, תקבל את התשובה UnauthorizedRegistration מ-FCM למגוון של שגיאות שונות, כולן הקשורות למפתחות של שרת האפליקציות.

הודעת השגיאה UnauthorizedRegistration תופיע בכל אחד מהמקרים הבאים:

  • אם הכותרת Authorization לא מוגדרת בבקשה ל-FCM.
  • מפתח האפליקציה שמשמש להרשמה של המשתמש לא תואם למפתח שמשמש לחתימה על הכותרת Authorization.
  • התפוגה לא חוקית ב-JWT, כלומר התוקף שלה חורג מ-24 שעות או שהתוקף של ה-JWT פג.
  • ה-JWT לא תקין או שיש בו ערכים לא חוקיים.

תגובת השגיאה המלאה נראית כך:

<html>
  <head>
    <title>UnauthorizedRegistration</title>
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    <h1>UnauthorizedRegistration</h1>

    <h2>Error 400</h2>
  </body>
</html>

אם הודעת השגיאה הזו מופיעה ב-Chrome, כדאי לבדוק ב-Firefox אם הוא יספק תובנות נוספות לבעיה.

דחיפה אוטומטית של Firefox ו-Mozilla

Firefox ו-Mozilla AutoPush מספקים קבוצה ידידותית של הודעות שגיאה לבעיות עם Authorization.

אם הכותרת Authorization לא כלולה בבקשת ה-Push, תקבלו גם את תגובת השגיאה Unauthorized מ-Mozilla AutoPush.

{
  "errno": 109,
  "message": "Request did not validate missing authorization header",
  "code": 401,
  "more_info": "http://autopush.readthedocs.io/en/latest/http.html#error-codes",
  "error": "Unauthorized"
}

אם פג התוקף של ה-JWT, תופיע גם שגיאה Unauthorized עם הודעה שתוקף האסימון פג.

{
  "code": 401,
  "errno": 109,
  "error": "Unauthorized",
  "more_info": "http://autopush.readthedocs.io/en/latest/http.html#error-codes",
  "message": "Request did not validate Invalid bearer token: Auth expired"
}

אם מפתחות שרת האפליקציות שונים בין מועד ההרשמה של המשתמש לבין מועד החתימה של כותרת ההרשאה, תוחזר השגיאה Not Found:

{
  "errno": 102,
  "message": "Request did not validate invalid token",
  "code": 404,
  "more_info": "http://autopush.readthedocs.io/en/latest/http.html#error-codes",
  "error": "Not Found"
}

לסיום, אם יש לך ערך לא חוקי ב-JWT (לדוגמה, אם הערך "alg" הוא ערך בלתי צפוי), תקבל את השגיאה הבאה מ-Mozilla AutoPush:

{
  "code": 401,
  "errno": 109,
  "error": "Unauthorized",
  "more_info": "http://autopush.readthedocs.io/en/latest/http.html#error-codes",
  "message": "Request did not validate Invalid Authorization Header"
}

קודי מצב HTTP

יש מגוון בעיות שעלולות לגרום לקוד תגובה שאינו 201 משירות Push. בהמשך מופיעה רשימה של קודי מצבים של HTTP והמשמעות שלהם בהקשר של Web Push.

קוד סטטוס תיאור
429 יותר מדי בקשות. שרת האפליקציות הגיע למגבלת הקצב של יצירת הבקשות באמצעות שירות Push. התשובה מהשירות צריכה לכלול את הכותרת 'Retry-After' כדי לציין את משך הזמן לפני שאפשר יהיה לשלוח בקשה נוספת.
400 בקשה לא חוקית. אחת מהכותרות לא חוקית או בפורמט שגוי.
404 לא נמצא במקרה כזה, עליך למחוק את ה-PushSubscription מהקצה העורפי ולהמתין להזדמנות כדי לרשום מחדש את המשתמש.
410 נעלם. המינוי כבר לא בתוקף וצריך להסיר אותו מהצד שלך. אפשר לשחזר את הערך הזה באמצעות קריאה ל-'unsubscribe() ' ב-'PushSubscription'.
413 המטען הייעודי גדול מדי. המטען הייעודי (payload) המינימלי ששירות דחיפה צריך לתמוך בו הוא 4,096 בייטים (או 4kb). כל גודל גדול יותר יכול לגרום לשגיאה הזו.

אם קוד הסטטוס של HTTP לא מופיע ברשימה הזו והודעת השגיאה לא מועילה, בדקו את המפרט של פרוטוקול Web Push Protocol כדי לראות אם יש הפניה לקוד הסטטוס יחד עם תרחיש שבו אפשר להשתמש בקוד הסטטוס הזה.

בעיה בהצפנת מטען ייעודי (payload)

אם הצלחתם להפעיל הודעת Push (כלומר, לשלוח הודעה לשירות Push מהאפליקציה ולקבל קוד תגובה 201), אבל אירוע ה-Push לא מופעל אף פעם ב-Service Worker, המשמעות היא בדרך כלל שהדפדפן לא הצליח לפענח את ההודעה שהתקבלה.

במקרה כזה, אמורה להופיע הודעת שגיאה במסוף כלי הפיתוח של Firefox, כך:

כלי הפיתוח ב-Firefox עם הודעת פענוח.

כדי לבדוק אם זו הבעיה ב-Chrome, מבצעים את הפעולות הבאות:

  1. עבור אל about://gcm-internals ולחץ על הלחצן "התחל הקלטה".

רשומה פנימית של Chrome GCM.

  1. מפעילים הודעת Push ובודקים את הקטע 'יומן כישלונות של פענוח הודעות'.

יומן פענוח פנימי של GCM.

אם יש בעיה בפענוח של המטען הייעודי (payload), תופיע שגיאה שדומה לזו שמוצגת למעלה. (שימו לב להודעה AES-GCM decryption failed בעמודת הפרטים).

יש כמה כלים שיכולים לעזור לנפות באגים בהצפנה אם זו הבעיה:

בעיות בחיבור

אם לא מתקבל אירוע Push ב-Service Worker ולא מופיעות שגיאות פענוח, ייתכן שהדפדפן לא מצליח להתחבר לשירות Push.

ב-Chrome, כדי לבדוק אם הדפדפן מקבל הודעות, אפשר לבדוק את 'קבלת יומן הודעות' (sic) ב-about://gcm-internals.

גורמים פנימיים של GCM מקבלים יומן הודעות.

אם ההודעה לא מגיעה בזמן, כדאי לוודא שסטטוס החיבור של הדפדפן הוא CONNECTED:

מצב חיבור פנימי של GCM.

אם הוא לא 'מחובר', ייתכן שתצטרכו למחוק את הפרופיל הנוכחי וליצור פרופיל חדש. אם הבעיה עדיין לא נפתרה, כדאי לשלוח דוח על באג כמו שמתואר בהמשך.

העלאת דוחות על באגים

אם אף אחת מהאפשרויות שלמעלה לא עוזרת לפתור את הבעיה, ואין סימן לבעיה, אפשר לפרט לגבי הדפדפן שבו נתקלת בבעיה:

ב-Chrome, צריך להעלות את הבעיה כאן: https://bugs.chromium.org/p/chromium/issues/list ב-Firefox, מומלץ להעלות את הבעיה בכתובת https://bugzilla.mozilla.org/

כדי לספק דוח טוב על באג, עליך לספק את הפרטים הבאים:

  • דפדפנים שבדקתם (למשל, Chrome גרסה 50, גרסה 51 של Chrome, Firefox גרסה 50, גרסה 51 של Firefox).
  • דוגמה PushSubscription שממחישה את הבעיה.
  • כוללים בקשות לדוגמה (כלומר תוכן של בקשות רשת לשירות דחיפה, כולל כותרות).
  • יש לכלול גם תגובות לדוגמה מבקשות רשת.

אם אפשר לספק דוגמה שחוזרת על עצמה, קוד מקור או אתר אינטרנט מתארח, לרוב היא מזרזת את האבחון והפתרון של הבעיה.

השלבים הבאים

שיעורי Lab