11.4 פרוטוקול HTTP תרגול
תרגול - פרוטוקול HTTP - HTTP protocol¶
תרגול 1 - לקוח HTTP בסיסי¶
- כתבו לקוח HTTP שמקבל URL כארגומנט (hostname + path) ומדפיס את התשובה.
- הלקוח שולח בקשת GET עם הכותרות הנדרשות (Host, Connection: close).
- הפרידו את הפלט: קודם הדפיסו את הheaders, ואז את הbody בנפרד.
- הדפיסו גם את קוד המצב (200, 404 וכו').
דוגמת הרצה:
רמז: השתמשו ב-
gethostbynameכדי להמיר hostname לכתובת IP. חפשו\r\n\r\nכדי למצוא את ההפרדה בין headers ל-body.
תרגול 2 - שרת HTTP סטטי¶
- כתבו שרת HTTP שמגיש קבצים מתיקייה שמתקבלת כארגומנט.
- בקשת GET ל-
/מחזירהindex.html. - בקשת GET ל-
/filenameמחזירה את הקובץ המתאים. - אם הקובץ לא קיים, החזירו 404.
- הגדירו Content-Type נכון לפי סיומת הקובץ (html, css, js, png, jpg, txt).
- הגנו מ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¶
- קחו את השרת מתרגול 2 והוסיפו רישום של כל בקשה לקובץ לוג.
- לכל בקשה, רשמו בקובץ
access.log: - תאריך ושעה
- כתובת IP של הלקוח
- שורת הבקשה (method + path)
- קוד התשובה
- גודל התשובה בבתים
- הפורמט:
[2026-03-08 14:30:00] 192.168.1.5 GET /index.html 200 1256 - הוסיפו גם הדפסה של כל בקשה ל-stdout.
רמז: השתמשו ב-
time+localtime+strftimeלפורמט התאריך, ו-fprintfעםfflushלכתיבה לקובץ הלוג.
תרגול 4 - שרת HTTP עם תמיכה ב-POST¶
- הרחיבו את השרת כך שיתמוך גם בבקשות POST.
- כשהשרת מקבל POST ל-
/submit, הוא קורא את הbody ושומר אותו בקובץsubmissions.txt. - כשהשרת מקבל GET ל-
/submissions, הוא מחזיר את תוכןsubmissions.txt. - עבור POST, קראו את Content-Length מהheaders כדי לדעת כמה בתים לקרוא מהbody.
בדיקה עם curl:
רמז: פרסרו את הheaders כדי לחלץ את Content-Length. השתמשו ב-
strtolלהמרת המספר. שימו לב שהbody מתחיל אחרי\r\n\r\n.
תרגול 5 - מוריד קבצים - HTTP downloader¶
- כתבו תוכנית שמקבלת URL ושם קובץ, מורידה את התוכן ושומרת אותו בקובץ.
- התוכנית שולחת GET, מפרסרת את התשובה, ושומרת רק את הbody.
- הוסיפו פס התקדמות פשוט שמראה כמה אחוזים הורדו (אם Content-Length זמין).
- טפלו ב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) כדי לחזור לתחילת השורה ולעדכן את ההתקדמות בלי לרדת שורה.