400 Bad Request - DuplicateHeader

אתם צופים במסמכי התיעוד של Apigee Edge.
כדאי לעיין במסמכי התיעוד של Apigee X.
מידע

תיאור הבעיה

אפליקציית הלקוח מקבלת קוד סטטוס של HTTP‏ 400 Bad Request עם קוד שגיאה protocol.http.DuplicateHeader כתגובה לקריאות ל-API.

הודעת שגיאה

אפליקציית הלקוח מקבלת את קוד התגובה הבא:

HTTP/1.1 400 Bad Request

בנוסף, יכול להיות שתופיע הודעת שגיאה דומה לזו שמוצגת למטה:

{
   "fault":{
      "faultstring":"Duplicate Header \"Expires\"",
      "detail":{
         "errorcode":"protocol.http.DuplicateHeader"
      }
   }
}

גורמים אפשריים

השגיאה הזו מתרחשת אם כותרת HTTP ספציפית שאסור להכיל כפילויות ב-Apigee Edge מופיעה יותר מפעם אחת עם ערכים זהים או שונים כחלק מבקשת ה-HTTP שנשלחת מהלקוח אל Apigee Edge.

לפי RFC 7230, סעיף 3.2.2: סדר השדות, השולח לא יכול ליצור כמה שדות כותרת עם אותו שם שדה בהודעה, אלא אם ערך השדה המלא של שדה הכותרת הזה מוגדר כרשימה מופרדת בפסיקים, [כלומר, ‫#(values)] או ששדה הכותרת הוא חריגה מוכרת. אם Apigee Edge מוצא כותרת ספציפית שאסור להכיל כפילויות, יותר מפעם אחת בבקשת ה-HTTP שנשלחת על ידי הלקוח, הוא מגיב עם 400 Bad Request וקוד השגיאה protocol.http.DuplicateHeader.

אלה הסיבות האפשריות לשגיאה הזו:

סיבה תיאור הוראות לפתרון בעיות שרלוונטיות ל
כותרת כפולה בבקשה בקשת ה-HTTP מאפליקציית הלקוח אל Apigee מכילה כותרות כפולות. משתמשים ב-Edge Public Cloud וב-Edge Private Cloud

שלבים נפוצים לאבחון

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

API Monitoring

כדי לאבחן את השגיאה באמצעות הכלי 'מעקב אחר API':

  1. נכנסים לממשק המשתמש של Apigee Edge בתור משתמש עם תפקיד מתאים.
  2. עוברים לארגון שבו רוצים לבדוק את הבעיה.

  3. עוברים לדף Analyze > API Monitoring > Investigate.
  4. בוחרים את מסגרת הזמן הספציפית שבה נתקלת בשגיאות.
  5. מוודאים שהמסנן Proxy מוגדר לAll.
  6. משרטטים את קוד התקלה מול הזמן.
  7. בוחרים תא עם קוד השגיאה protocol.http.DuplicateHeader כמו בדוגמה הבאה:

  8. המידע על קוד התקלה protocol.http.DuplicateHeader מוצג כמו בדוגמה הבאה:

  9. לוחצים על הצגת יומנים ומרחיבים את השורה של הבקשה שנכשלה.
  10. בחלון יומנים, רושמים את הפרטים הבאים:
    1. קוד סטטוס: 400
    2. מקור התקלה: apigee
    3. קוד שגיאה: protocol.http.DuplicateHeader.
  11. אם הערך של Fault Source הוא apigee או MP והערך של Fault Code הוא protocol.http.DuplicateHeader, המשמעות היא שבקשת ה-HTTP מהלקוח הכילה כותרות כפולות.

כלי המעקב

NGINX

כדי לאבחן את השגיאה באמצעות יומני הגישה של NGINX:

  1. אם אתם משתמשי Private Cloud, אתם יכולים להשתמש ביומני הגישה של NGINX כדי לקבוע את פרטי המפתח לגבי שגיאות HTTP 400.
  2. בודקים את יומני הגישה של NGINX:

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    הערה: מחליפים את ORG,‏ ENV ו-PORT# בערכים האמיתיים.

  3. מחפשים כדי לראות אם יש 400 שגיאות במהלך פרק זמן מסוים (אם הבעיה התרחשה בעבר) או אם יש בקשות שעדיין נכשלות עם 400.
  4. אם מופיעות שגיאות 400 עם הערך של X-Apigee-fault-code שזהה לערך של protocol.http.DuplicateHeader, צריך לקבוע את הערך של X-Apigee-fault-source.

    דוגמה לשגיאה 400 מיומן הגישה של NGINX:

    בדוגמה שלמעלה מתוך יומן הגישה של NGINX, הערכים של X-Apigee- fault-code ושל X-Apigee-fault-source: הם:

    כותרות תגובה ערך
    X-Apigee-fault-code protocol.http.DuplicateHeader
    X-Apigee-fault-source MP

הסיבה: כותרת כפולה בבקשה

אבחון

  1. כדי לזהות את קוד השגיאה ואת מקור השגיאה של השגיאה שנצפתה, אפשר להשתמש ב'מעקב אחר קריאות ל-API' או ביומני הגישה של NGINX, כמו שמוסבר בשלבים הנפוצים לאבחון.
  2. אם הערך של Fault Source הוא apigee או MP, המשמעות היא שהבקשה שנשלחה מאפליקציית הלקוח אל Apigee מכילה כותרות כפולות.
  3. כדי לראות את הכותרת בפועל שנשלחת יותר מפעם אחת כחלק מהבקשה, אפשר להשתמש באחת מהשיטות הבאות:

    הודעת שגיאה

    איך משתמשים בהודעת השגיאה

    1. אם יש לכם גישה להודעת השגיאה המלאה שהתקבלה מ-Apigee Edge, תוכלו לעיין בfaultstring. הכותרת faultstring מכילה את שם הכותרת שנשלח יותר מפעם אחת.

      הודעת שגיאה לדוגמה:

      "faultstring":"Duplicate Header \"Expires\""
    2. בהודעת השגיאה שלמעלה, אפשר לראות שהכותרת Expires נשלחת יותר מפעם אחת, כפי שמוצג ב-faultstring.

    הבקשה בפועל

    שימוש בבקשה בפועל

    1. אם יש לכם גישה לבקשה בפועל שנשלחה על ידי אפליקציית הלקוח, צריך לבצע את השלבים הבאים:

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

      בקשה לדוגמה:

      curl https://HOST_ALIAS/duplicateheadertest -v -H "Expires: Mon, 21 June 2021 07:28:00 GMT" -H "Expires: Mon, 21 June 2021 07:28:00 GMT"
      

      בדוגמה של הבקשה שלמעלה, הכותרת Expires נשלחת יותר מפעם אחת. לכן, הבקשה הזו נכשלת עם השגיאה 400 Bad Request וקוד השגיאה: protocol.http.DuplicateHeader.

    2. לחלופין, אם יש לכם גישה ליומני הלקוח, תוכלו לבדוק אם יש בהם מידע על הבקשה בפועל שנשלחה אל Apigee Edge ולקבוע את הכותרת שנשלחה יותר מפעם אחת.

רזולוציה

פתרון בעיות שקשורות לשכפול

אפשרות 1 [האפשרות המומלצת] תיקון אפליקציית הלקוח כדי שלא תכלול כותרות כפולות

  1. מנתחים את הסיבה לכך שהלקוח הספציפי שולח כותרת כפולה. לדוגמה, Expires במקרה שלמעלה. מוודאים שאין בעיה ששרתי ה-API proxy יקבלו את הכותרת הכפולה. בדרך כלל, לא מומלץ להשתמש בשיטה הזו לפי מפרט HTTP‏ RFC7230.
  2. אם זה לא רצוי, צריך לשנות את אפליקציית הלקוח כך שלא יישלחו כותרות כפולות.

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

    curl https://HOST_ALIAS/duplicateheadertest -v -H "Expires: Mon, 21 June 2021 07:28:00 GMT"
    
  3. אם רוצים לאפשר את הכותרות הכפולות, אפשר לעבור אל אפשרות 2: שימוש בנכס CwC.

CwC

אפשרות 2: שימוש בנכס CwC

‫Apigee מספק מאפיין CwCHTTPHeader.<HeaderName> ,שמאפשר לאפליקציות לקוח ולשרתי יעד לשלוח כותרות כפולות ל-API proxies ב-Apigee Edge.

נכס CwC ערכים
HTTPHeader.<HeaderName> allowDuplicates,multivalued

לדוגמה, אפשר להגדיר את המאפיין הבא במעבדי ההודעות כדי לאפשר כפילויות וכמה ערכים בכותרת Expires.

HTTPHeader.Expires=allowDuplicates, multiValued
  1. אם אתם משתמשים ב-Private Cloud, אתם יכולים להגדיר את המאפיין כדי למנוע מ-Apigee Edge להציג שגיאת 400 Bad Request, גם אם הבקשה מכילה כותרות כפולות. לשם כך, תוכלו להיעזר במדריך הגדרת מעבדי הודעות לשימוש בכותרות כפולות.
  2. אם אתם משתמשים ב-Public Cloud, אתם יכולים לפנות אל התמיכה של Apigee Edge כדי להגדיר את המאפיין הזה לארגון שלכם.

מפרט

מערכת Apigee מצפה שאפליקציית הלקוח לא תשלח כותרות כפולות כחלק מהבקשה, בהתאם למפרטים הבאים של RFC:

מפרט
RFC 7230, section 3.2.2: Field Order
RFC 7230, section 3.2 Header Fields

אם עדיין דרושה לך עזרה מצוות התמיכה של Apigee, אפשר לעבור אל איסוף מידע לצורך אבחון.

צריך לאסוף פרטי אבחון

אוספים את נתוני האבחון הבאים ופונים אל התמיכה של Apigee Edge.

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

  • שם הארגון
  • שם הסביבה
  • שם ה-proxy ל-API
  • הפקודה curl שבה השתמשת כדי לשחזר את השגיאה 400
  • קובץ מעקב לבקשות ה-API

אם אתם משתמשים ב-Private Cloud, עליכם לספק את הפרטים הבאים:

  • הודעת השגיאה המלאה שזוהתה בבקשות שנכשלו
  • שם הסביבה
  • חבילת proxy ל-API
  • מלאו את הפקודה curl שבה השתמשתם כדי לשחזר את השגיאה 400
  • קובץ מעקב לבקשות ה-API
  • יומני גישה של NGINX:

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    הסבר: מחליפים את ORG, ‏ ENV ו-PORT# בערכים האמיתיים.

  • יומני מערכת של מעבד ההודעות /opt/apigee/var/log/edge-message-processor/logs/system.log