לדלג לתוכן

11.4 פרוטוקול HTTP תרגול

תרגול - פרוטוקול HTTP - HTTP protocol

תרגול 1 - לקוח HTTP בסיסי

  1. כתבו לקוח HTTP שמקבל URL כארגומנט (hostname + path) ומדפיס את התשובה.
  2. הלקוח שולח בקשת GET עם הכותרות הנדרשות (Host, Connection: close).
  3. הפרידו את הפלט: קודם הדפיסו את הheaders, ואז את הbody בנפרד.
  4. הדפיסו גם את קוד המצב (200, 404 וכו').

דוגמת הרצה:

./httpclient example.com /
status: 200 OK
headers: 9
body: 1256 bytes

<html>...

רמז: השתמשו ב-gethostbyname כדי להמיר hostname לכתובת IP. חפשו \r\n\r\n כדי למצוא את ההפרדה בין headers ל-body.


תרגול 2 - שרת HTTP סטטי

  1. כתבו שרת HTTP שמגיש קבצים מתיקייה שמתקבלת כארגומנט.
  2. בקשת GET ל-/ מחזירה index.html.
  3. בקשת GET ל-/filename מחזירה את הקובץ המתאים.
  4. אם הקובץ לא קיים, החזירו 404.
  5. הגדירו Content-Type נכון לפי סיומת הקובץ (html, css, js, png, jpg, txt).
  6. הגנו מpath traversal - אסרו נתיבים עם ...

צרו תיקיית בדיקה:

mkdir -p www
echo '<html><body><h1>Home</h1><a href="/about.html">About</a></body></html>' > www/index.html
echo '<html><body><h1>About</h1></body></html>' > www/about.html
echo 'body { color: blue; }' > www/style.css

רמז: השתמשו ב-fopen + fseek + ftell כדי למצוא את גודל הקובץ ל-Content-Length.


תרגול 3 - שרת HTTP עם רישום לוג - logging

  1. קחו את השרת מתרגול 2 והוסיפו רישום של כל בקשה לקובץ לוג.
  2. לכל בקשה, רשמו בקובץ access.log:
  3. תאריך ושעה
  4. כתובת IP של הלקוח
  5. שורת הבקשה (method + path)
  6. קוד התשובה
  7. גודל התשובה בבתים
  8. הפורמט: [2026-03-08 14:30:00] 192.168.1.5 GET /index.html 200 1256
  9. הוסיפו גם הדפסה של כל בקשה ל-stdout.

רמז: השתמשו ב-time + localtime + strftime לפורמט התאריך, ו-fprintf עם fflush לכתיבה לקובץ הלוג.


תרגול 4 - שרת HTTP עם תמיכה ב-POST

  1. הרחיבו את השרת כך שיתמוך גם בבקשות POST.
  2. כשהשרת מקבל POST ל-/submit, הוא קורא את הbody ושומר אותו בקובץ submissions.txt.
  3. כשהשרת מקבל GET ל-/submissions, הוא מחזיר את תוכן submissions.txt.
  4. עבור POST, קראו את Content-Length מהheaders כדי לדעת כמה בתים לקרוא מהbody.

בדיקה עם curl:

curl -X POST -d "Hello World" http://localhost:8080/submit
curl http://localhost:8080/submissions

רמז: פרסרו את הheaders כדי לחלץ את Content-Length. השתמשו ב-strtol להמרת המספר. שימו לב שהbody מתחיל אחרי \r\n\r\n.


תרגול 5 - מוריד קבצים - HTTP downloader

  1. כתבו תוכנית שמקבלת URL ושם קובץ, מורידה את התוכן ושומרת אותו בקובץ.
  2. התוכנית שולחת GET, מפרסרת את התשובה, ושומרת רק את הbody.
  3. הוסיפו פס התקדמות פשוט שמראה כמה אחוזים הורדו (אם Content-Length זמין).
  4. טפלו בredirects (301/302): אם קוד המצב הוא 301 או 302, חפשו את הכותרת Location, והפנו לכתובת החדשה (עד 5 הפניות).

דוגמת הרצה:

./httpdownload example.com /index.html output.html
downloading /index.html from example.com...
[============================] 100% (1256 bytes)
saved to output.html

רמז: לprogress bar, השתמשו ב-\r (carriage return) כדי לחזור לתחילת השורה ולעדכן את ההתקדמות בלי לרדת שורה.