You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
עלה בעבודה על 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.
כל בקשה לא-מאומתת עם גוף מחזיקה חיבור פתוח בזמן שהשרת קורא וזורק את הגוף שלה. לקוח תקין לא מרגיש בזה. לקוח שחוזר על זה (סורק, או לקוח עם טוקן שפג ששולח שוב ושוב) מחזיק חיבורים פתוחים לחינם.
כיוון לתיקון (לא החלטה — לדיון)
מקום אחד שמכסה את שני המקורות: עטיפת ASGI חיצונית שמוסיפה connection: close לתשובת 401. ה-401 של מצב OAuth נשלח מקוד של ה-SDK, ולכן תיקון ב-unauthorized() לבד לא יכסה את הייצור.
להחליט אם הכלל הוא "כל 401", או "כל תשובה שנשלחה לפני שהגוף נקרא עד הסוף". השני מכסה גם סירובים עתידיים, והוא ההיגיון של limits.py.
עלה בעבודה על PR #3502 (בבריף, ובמדידה של הסקירה על התוכנית). מחוץ לתחום שלו, ולכן לא תוקן שם.
הבעיה במשפט אחד
כשהשרת מסרב לבקשה לפני שקרא את הגוף שלה, uvicorn 0.38.0 ממשיך לקרוא ולזרוק את מה שהלקוח שולח, והחיבור נשאר פתוח שניות; עם
Connection: closeהוא נסגר מיד (נמדד בסקירה על התוכנית של #3502, מול uvicorn 0.38.0, הגרסה בייצור). ה-401 של/mcpנשלח בלי הכותרת הזו, גם בייצור (OAuth) וגם במצב PAT.מה נבדק (main,
928addc; mcp 1.28.1)RequireAuthMiddleware._send_auth_errorב-mcp/server/auth/middleware/bearer_auth.pyשל ה-SDK. הכותרות:content-type,content-length,www-authenticate. איןconnection.PATAuthMiddleware(mcp_server/auth.py#L128-L148) מחזיר אתunauthorized()(#L47-L53), שמוסיף רקWWW-Authenticate.POST /mcpבלי טוקן ועם גוף, מול האפליקציה המלאה בשני המצבים: 401, בלי כותרתconnection.BodySizeLimitMiddlewareב-mcp_server/limits.pyכבר שולחConnection: closeבסירובים שלו, וכך גם הראוט החדשPUT /api/agent/uploadמ-feat(mcp): העלאת תוכן ארוך בלי לעבור דרך המודל — PUT /api/agent/upload ו-upload_id #3502.מה זה עושה בפועל
כל בקשה לא-מאומתת עם גוף מחזיקה חיבור פתוח בזמן שהשרת קורא וזורק את הגוף שלה. לקוח תקין לא מרגיש בזה. לקוח שחוזר על זה (סורק, או לקוח עם טוקן שפג ששולח שוב ושוב) מחזיק חיבורים פתוחים לחינם.
כיוון לתיקון (לא החלטה — לדיון)
connection: closeלתשובת 401. ה-401 של מצב OAuth נשלח מקוד של ה-SDK, ולכן תיקון ב-unauthorized()לבד לא יכסה את הייצור.limits.py.test_every_route_answers_401_without_a_token_except_a_closed_listב-tests/test_mcp_uploads.py(נכנס ב-feat(mcp): העלאת תוכן ארוך בלי לעבור דרך המודל — PUT /api/agent/upload ו-upload_id #3502) כבר עובר על כל ראוט בשני המצבים; להוסיף לו שכל 401 נושאconnection: close. ואימות אחד מול uvicorn אמיתי (כמו טסט ה-curl ב-feat(mcp): העלאת תוכן ארוך בלי לעבור דרך המודל — PUT /api/agent/upload ו-upload_id #3502) שהחיבור אכן נסגר.