# data[].attributes.body
האף שלי גדול מאוד, אסטרונומי. הוא גם עקום ב65 מעלות שמאלה. כל הגולגולת שלי בנויה כמו מצולע ואני מזוקן כמו הומלס

# data[].attributes.headline
לירון ספקטור

# data[].attributes.subject
לירון ספקטור

# data[].attributes.body
אני ערס

# data[].attributes.headline
איתי קבנובסקי ורון לוינר

# data[].attributes.subject
איתי קבנובסקי ורון לוינר

# data[].attributes.body
1.- פתיחה של הקובץ כ "r" ולא כ "rb"  - גרמה לאיבוד מידע בתהליך ה decoding

2.-  לא סגרנו את החיבור בסוקט לאחר שהקליינט התנתק ולכן נגרמו שגיאות.

3.- לא שמנו /r/n/r/n בסוף ה header אלא שמנו רק פעם אחת. גרם לפרוטוקל לא לזהות את המפריד ובכך תפעול לא נכון של השרת.

# data[].attributes.headline
מתן נועם ועומר

# data[].attributes.subject
מתן נועם ועומר

# data[].attributes.body
1. אם הdata -  הוא לא מסוג בייט אז הפונקציה handle_client_request לא תעבוד מפני שלא ניתן
לשלוח מחרוזות דרך סוקט (יש להמיר אותן לבייטים).

2. בפונקציה validate_http_request יש לבדוק מקרי קצה.
למשל, לא מספיק לבדוק רק אם ("list1[2].startswith("HTTP/1.1\r\n אלא יש לבדוק גם מקרה שבו
("list1[2].startswith("HTTP/1.0\r\n

3. בפונקציה handle_client יש לסגור את הסוקט.

4. בפונקציה handle_client_request יש לבדוק קודם את התנאים של הסעיפים לפני שבודקים אם
ה - url קיים.

# data[].attributes.headline
עידו נועם ואגם

# data[].attributes.subject
עידו נועם ואגם

# data[].attributes.body
1. לא שמנו לב שפונקציה מסוימת לא קיבלה משתנה ולכן הקוד קרס בזמן ריצה.
2. בלבול בין עבודה עם בייטים לעבודה עם סטרינגים
3. כיכוב לא נכון של קוד.
4. קריאה לפונקציות ברצף א-לוגי
5. לא כיסינו את כל המקרים האפשריים ולכן הקוד קרס

# data[].attributes.headline
טיפול בקבלת פרמטר מטיפוס 

# data[].attributes.body
טיפול בקבלת פרמטר מטיפוס לא נכון, טיפול במקרי קצה

# data[].attributes.body
ניגר ניגר ניגר ניגר ניגר ניגר ניגר

# data[].attributes.headline
יונתן קדים, איתי פדרובסקי, גיא אביב, דן נמש

# data[].attributes.subject
יונתן קדים, איתי פדרובסקי, גיא אביב, דן נמש

# data[].attributes.body
לופ בתוך MAIN ובתוך handle client שגרם לקוד לא לעבוד מדי פעם.

המספר ב-client_socket.recv נמוך מדי ולכן אין מספיק בייטים כדי לקבל את התמונה.

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

לא סגרנו את הsocket לאחר השימוש

חוסר תמיכה בfiletypes מסוגים שונים(jpeg, PNG, jpg)

# data[].attributes.headline
עומר רביב, אופק ויונתן זונטג

# data[].attributes.subject
עומר רביב, אופק ויונתן זונטג

# data[].attributes.body
שגיאה1:

while len_content < content_length - 2048:  # get all of the remaining data
    content_data = client_socket.recv(2048)
    file.write(content_data)
    len_content += len(content_data)
try:
    content_data = client_socket.recv(2048)
    file.write(content_data)
except:
    pass
finally:
    file.close()

שמנו לב שלפעמים המידע של הקובץ לא עובר בשלמותו. לכן, השתמשנו בtry ו excpet כדי להתחמק מהשגיאה של לנסות להכניס מידע שלא קיים.
שגיאה 2:

if field.startswith('Content-Length'.encode()):

    content_length = int(field.split(':')[1].replace(" ", ""))

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

def handle_client(client_socket):
       :param client_socket: the sockets
     Handles client requests: verifies client's requests are legal HTTP, calls function to handle the requests
     """
     while True:
         print('Client connected')
         # get client request
         client_request = client_socket.recv(2048)  # recieve from client the data
         valid_http, resource = validate_http_request(client_request)
         if valid_http:
             print('Got a valid HTTP request')
             handle_client_request(resource, client_socket, client_request)
         else:
             print('Error: Not a valid HTTP request')
             header_500 = "HTTP/1.1 500 \r\n\r\n".encode()
             client_socket.send(header_500)
             break
     print('Closing connection')
     client_socket.close()


 def main():
     # Open a socket and loop forever while waiting for clients
     server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)#open a server socket
     server_socket.bind((IP, PORT))
     server_socket.listen(10)
     print("Listening for connections on port %d" % PORT)

     while True:
         client_socket, client_address = server_socket.accept()
         print('New connection received')
         client_socket.settimeout(SOCKET_TIMEOUT)#set a timeout
         try:
             handle_client(client_socket)
         except:
             print("Request did not succeed, continue.")

השגיאה בקוד פה היא שקיימים שני while true  גם בפונקציית הmain וגם בhandle_client כך שהבקשות לא יסגרו כמו שצריך, ולא נוכל לטעון את האתר כולו, בגלל עומס בקשות.
שגיאה4 :

with open(os.path.abspath("webroot/uploads") + "\\" + unquote(name_for_file), "w") as file:

פה פתחנו את הקובץ כw, ולא כwb, ומכיוון שאנו מקבלים את המידע של התמונה מהsocket  בצורה בינארית, התמונה לא תוצג בצורה טובה.

# data[].attributes.headline
בר לבובסקי ואופיר וולק

# data[].attributes.subject
בר לבובסקי ואופיר וולק

# data[].attributes.body
בטעות שכחנו לכתוב  not  בתוך if   והלולאה החזירה שגיאה כאשר היא לא הייתה אמורה
2. בלבול בין הוספת משתנה int ל string

# data[].attributes.headline
צריך עזרה בפרויקט הצפנה.😬😬😬🦍

# data[].attributes.subject
צריך עזרה בפרויקט הצפנה.😬😬😬🦍

# data[].attributes.body
שלום, אני נאלץ לכתוב פרויקט כזה גם בעצמי. בתור אנשים שכבר עשו את הפרויקט בעבר. האם אתם יכולים להעניק לי חלק מהחוכמה שלכם.

תודה מראש.

לא תקבל

# data[].attributes.headline
מיקה כהן, אורי בינרט, עמית קרן, נועם רונן

# data[].attributes.subject
מיקה כהן, אורי בינרט, עמית קרן, נועם רונן

# data[].attributes.body
בדיקת תאימות למספר בCALCULATE NEXT
בדיקת תאימות למספר ב CALCULATE AREA
EXECPTION HANDELING ספציפי במקרים יחדניים וEXPECTION HANDLE כללי לוודא סגירה מלאה של הSOCKET
בדיקה יחידנית של סוג הקובץ המועלה בPOST
החזרת שגיאות מתאימות וספציפיות לבעיות
לשים לב לENCODING מתאים

# data[].attributes.headline
שגיאות שונות- 

# data[].attributes.subject
שגיאות שונות- 

# data[].attributes.body
הקבוצה: עדי, נוגה ומאיה.

• כפילויות בקוד- יש לכתוב קוד מסודר על מנת להימנע מכפילויות.
• אי סגירה של משאבים- יש לסגור משאבים שנפתחו במידת הצורך על מנת למנוע תקיעה של הקוד.
• בנייה לא נכונה של header- לשים לב למבנה הנכון שדרוש על פי הפרוטוקול כדי שהדברים יעבדו.
• כניסה ללולאת אין סופיות- שגיאת זמן ריצה שתוקעת את הקוד. פתרון: לוודא שעבור כל מקרה בקוד בסופו של דבר יוצאים מהלולאה.
• לא הוספנו בדיקה לgif. פתרון: לשים 🤍 שישנה התייחסות בקוד לכל המקרים האפשריים והדרושים.
• סדר לא נכון של תנאים- הפתרון הוא לבדוק מה צריך להיות הסדר הנכון מבחינה לוגית של הקוד בכלל ושל תנאים מסוימים בפרט.
• טעויות syntax- הפתרון הוא לשים לב לסינטקס הנכון ולחפש באינטרנט במידת הצורך.
• קריאה למשתנים בשמות של פונקציות- לשים לב לקרוא למשתנים בשמות ייחודיים ומשמעותיים מה שיעשה גם יותר סדר בקוד.
• חוסר התייחסות למקרי קצה- יש לקחת בחשבון את כל המקרים האפשריים ולבדוק שקיימת התייחסות אליהם בקוד.

# data[].attributes.body
הטעות: חסר \r\n אחד במעטפת ההודעה
סוג השגיאה: בניית מבנה נתונים לפי הכללים (לפי הפרוטוקול)
פתרון: להתאקלם עם מבנה הנתונים הדרוש ולדאוג לבצע אותו בשלמותו ובדיוק

הטעות: שימוש ב encoding לא נכון עבור סוגי קבצים מסוימים
סוג השגיאה: אי טיפול במקרי קצה
פתרון: לבדוק שכל אחד מהמקרים מקבל טיפול נכון ומתאים לו! כל אחד הוא מיוחד במקרה שלנו מדובר בקריאה מקבצים

הטעות: הכנסת פרמטר מטיפוס לא מתאים
סוג השגיאה: טיפול בקבלת פרמטר מטיפוס לא נכון, טיפול במקרי קצה
פתרון: אין לסמוך על המשתמש הוא ינסה להכשיל את הפרוצדורה ולכן יש לשמור על הקוד מפניו!

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

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

הטעות: חוסר התאמה בין גודל תוכן ההודעה המופיע במעטפת לבין גודלה האמיתי

# data[].attributes.headline
יואב לוין ונועם הראל

# data[].attributes.subject
יואב לוין ונועם הראל

# data[].attributes.body
טעות : אי הפיכת הheader לבייטים
השפעה: חיבור של הדטה והheader במשתנה אחד לא אפשרי
מה אפשר לעשות: לשנות את הheader לבייטים כמו הדטה.

טעות:כתיבת if במקום elif
השפעה: הelse האחרון ייכנס למרות שיכול להיות מצב שהif שלפני הelse אכן נכנס
מה אפשר לעשות: לוודא שהelif נמצאים במקום הנכון לפי מטרת הקוד.

טעות:לולאת while מיותרת
השפעה: זמן טעינה ארוך מן הרצוי.
מה אפשר לעשות: לשים לב האם הלולאה הכרחיתת אם לא להוריד אותה.

טעות: כתיבת wb במקום rb
השפעה: הפעולה שאחרי פתיחת הקובץ ( file.read( לא תעבוד
מה אפשר לעשות: לדעת את סוגי פתיחות הקובץ השונות ולוודא שהן אכן מתאימות לפעילות שאנו רוצים לבצע עם הקובץ שפתחנו.

# data[].attributes.headline
טעות בניהול משאבים

# data[].attributes.subject
טעות בניהול משאבים

# data[].attributes.body
טעות: client.close לא מבוצע בכל המקרים בפעולה handle_client/
השפעה: calc-next עובד בפעם הראשונה ונכשל בפעם השנייה.
מה אפשר לעשות: יש לוודא שבכל נקודות היציאה מהפעולה מתבצע סגירה connection
אם יש מצב שתהליך נתקע ללא תגובה, יכול להיות שזה קשור למשאב תפוס/לא משוחרר.