Skip to content

תשובת 401 על /mcp נשלחת בלי Connection: close — בשני מצבי האימות #3504

Description

@amirbiron

עלה בעבודה על PR #3502 (בבריף, ובמדידה של הסקירה על התוכנית). מחוץ לתחום שלו, ולכן לא תוקן שם.

הבעיה במשפט אחד

כשהשרת מסרב לבקשה לפני שקרא את הגוף שלה, uvicorn 0.38.0 ממשיך לקרוא ולזרוק את מה שהלקוח שולח, והחיבור נשאר פתוח שניות; עם Connection: close הוא נסגר מיד (נמדד בסקירה על התוכנית של #3502, מול uvicorn 0.38.0, הגרסה בייצור). ה-401 של /mcp נשלח בלי הכותרת הזו, גם בייצור (OAuth) וגם במצב PAT.

מה נבדק (main, 928addc; mcp 1.28.1)

  • מצב OAuth (הייצור): ה-401 נשלח מ-RequireAuthMiddleware._send_auth_error ב-mcp/server/auth/middleware/bearer_auth.py של ה-SDK. הכותרות: content-type, content-length, www-authenticate. אין connection.
  • מצב PAT: PATAuthMiddleware (mcp_server/auth.py#L128-L148) מחזיר את unauthorized() (#L47-L53), שמוסיף רק WWW-Authenticate.
  • שחזור (30.09): POST /mcp בלי טוקן ועם גוף, מול האפליקציה המלאה בשני המצבים: 401, בלי כותרת connection.
  • לשם השוואה: BodySizeLimitMiddleware ב-mcp_server/limits.py כבר שולח Connection: close בסירובים שלו, וכך גם הראוט החדש PUT /api/agent/upload מ-feat(mcp): העלאת תוכן ארוך בלי לעבור דרך המודל — PUT /api/agent/upload ו-upload_id #3502.

מה זה עושה בפועל

כל בקשה לא-מאומתת עם גוף מחזיקה חיבור פתוח בזמן שהשרת קורא וזורק את הגוף שלה. לקוח תקין לא מרגיש בזה. לקוח שחוזר על זה (סורק, או לקוח עם טוקן שפג ששולח שוב ושוב) מחזיק חיבורים פתוחים לחינם.

כיוון לתיקון (לא החלטה — לדיון)

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions