1. ספרייה
  2. HTTP והרשת
  3. קודי סטטוס HTTP

עודכן לפני חודש

רוב שגיאות ה-HTTP מענישות אותך על מה שאמרת. זו מענישה אותך על כך שלא אמרת כלום בכלל.

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

האנטומיה של הנטישה

בקשה רגילה זורמת כך:

Client: POST /api/data HTTP/1.1
Client: Content-Type: application/json
Client: Content-Length: 1024
Client: 
Client: {"name": "example", ...}
Server: HTTP/1.1 200 OK

שגיאת 408 מתרחשת כאשר הזרימה הזו נתקעת:

Client: POST /api/data HTTP/1.1
Client: Content-Type: application/json
Client: Content-Length: 1024
Client: 
[שתיקה]
[עוד שתיקה]
Server: HTTP/1.1 408 Request Timeout
Server: Connection: close

הלקוח הבטיח 1024 בתים. השרת חיכה. הבתים לא הגיעו.

למה בקשות שותקות

הרשת נכשלת באמצע המשפט. אתה מעלה קובץ, ה-WiFi שלך מתנתק, והבקשה שנשלחה למחצה תלויה באוויר.

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

החיבור איטי מדי. העלאה של 100MB בחיבור של 56kbps עשויה לקחת יותר זמן ממה שהשרת מוכן להמתין.

הלקוח שוכח לשלוח את גוף הבקשה. הכותרות מצהירות Content-Length: 1024, אך הקוד לעולם לא שולח את אותם 1024 בתים בפועל.

קביעת הסבלנות של השרת

שרתים מגדירים כמה זמן הם מוכנים להמתין:

# Nginx
client_header_timeout 60s;   # זמן לקבלת כותרות
client_body_timeout 60s;     # זמן לקבלת גוף הבקשה
keepalive_timeout 75s;       # זמן המתנה לבקשה הבאה

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

להעלאות גדולות, צריך יותר סבלנות:

location /api/upload {
    client_body_timeout 300s;  # 5 דקות להעלאות
}

408 לעומת 504: הכיוון חשוב

שתי השגיאות הללו כרוכות בפסקי זמן, אך הכיוון הפוך:

408 Request Timeout: השרת ממתין לך שתסיים לדבר.

אתה → (שתיקה) → שרת → 408

504 Gateway Timeout: שער ממתין שהשרת הנמצא במעלה הזרם יגיב.

אתה → שער → (ממתין) → שרת עורפי
            ↓
           504

408 עוסקת בשליחה. 504 עוסקת בקבלה.

טיפול בשגיאת 408 כלקוח

בניגוד לשגיאות 4xx רבות, בטוח לנסות שוב לאחר שגיאת 408. הבעיה לא הייתה בבקשה עצמה — היא פשוט לא הגיעה. נסה שוב:

async function fetchWithRetry(url, options, maxRetries = 3) {
    for(let attempt = 0; attempt < maxRetries; attempt++) {
        const response = await fetch(url, options);
        
        if(response.status === 408 && attempt < maxRetries - 1) {
            await sleep(Math.pow(2, attempt) * 1000); // השהייה אקספוננציאלית
            continue;
        }
        
        return response;
    }
}

להעלאות גדולות, עדיף להשתמש בהזרמה במקום לטעון את כל הקובץ לזיכרון:

// אל תטעין את כל הקובץ לזיכרון
const stream = fs.createReadStream('large-file.bin');
await fetch('/api/upload', { method: 'POST', body: stream });

מתי שגיאת 408 אינה נכונה

אל תשתמש ב-408 לעיבוד איטי. אם השרת קיבל את הבקשה אך לוקח לו זמן רב לייצר תגובה, זו שגיאת 503 או 504 — לא 408.

// שגוי: השרת איטי, לא הלקוח
HTTP/1.1 408 Request Timeout

// נכון: השרת עמוס
HTTP/1.1 503 Service Unavailable

אל תשתמש ב-408 לנתונים פגומים. אם הלקוח שלח נתונים שגויים, זו שגיאת 400 Bad Request. 408 אומרת שהלקוח לא שלח מספיק, לא שמה שהוא שלח היה שגוי.

תגובת 408 תקינה

HTTP/1.1 408 Request Timeout
Connection: close
Retry-After: 60
Content-Type: application/json

{
    "error": "Request Timeout",
    "message": "The server closed the connection after waiting for your request. You can retry."
}

כותרת Connection: close חשובה. לאחר פסק זמן, מצב החיבור אינו ודאי — עדיף להתחיל מחדש.

האמת המרכזית

408 היא שגיאת ה-HTTP היחידה שעוסקת בהיעדר ולא בנוכחות. כל שגיאה אחרת מגיבה למשהו שעשית לא נכון. זו מגיבה למשהו שלא עשית כלל.

השרת חיכה. לא הגעת. הוא המשיך הלאה.

שאלות נפוצות על שגיאת 408 Request Timeout

האם אפשר לנסות שוב לאחר שגיאת 408?

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

למה ההעלאה שלי ממשיכה לפוג בזמן?

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

מה ההבדל בין פסק זמן של לקוח לבין שגיאת 408?

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

האם השרת שלי צריך להחזיר 408 אם העיבוד לוקח זמן רב מדי?

לא. 408 עוסקת ספציפית בזמן העברת הבקשה. אם השרת קיבל את הבקשה המלאה אך איטי בעיבודה, החזר 503 Service Unavailable או תן לשרת proxy להחזיר 504 Gateway Timeout.

האם דף זה היה מועיל?

😔
🤨
😃
408 Request Timeout • ספרייה • Connected