Help with http header request

Help with http header request

היי,
כתבתי תוכנה שיודעת ליצור תקשורת עם השרת בפרוטוקול HTTP.
העניין הוא שחלק מהשרתים שאני מנסה להתחבר אליהם עובדים עם התוכנה שלי בצורה טובה מאוד. כלומר אני מצליח לקבל את כל הנתונים ולא מפספס כלום.
אבל יש אתרים שמשום מה לא נותנים לי את כל הדטא או לחילופין לא נתונים לי בכלל דטא. כלומר אני מבצע תקשורת ואז התקשורת מצליחה ומסתיימת בהצלחה אבל משום מה או שכל הדף לא מגיע אלי במלואו, או שאין בכלל שום תשובה (recvbuf ריק).

אין קשר לאופן קליטת הנתונים מכיוון שאני רואה כמה בתים נשלחים אלי בדיוק (שוב קצר הרבה יותר ממה שצריך או לחילופין ריק). חשוב לי להדגיש שכל התקשורת עצמה עם השרת עוברת בצורה חלקה וללא בעיות, ניתוקים או שגיאות. וכאמור עם חלק מהשרתים מתקשר מצוין ומחזיר את כל המידע, ובחלקק אחר לא או לחלוטין לא.
לדעתי, משהו ב-Http Request Header שלי לא תקין. אשמח לעזרה. להלן הבקשה שאני שולח לאתר sport5.co.il ומקבל מידע חלקי (אם אני אנסה לאתר mako למשל אני אקבל מידע ריק):
GET / HTTP/1.1\r\nHost: www.sport5.co.il\r\n
Content-Type: text/plain\r\n
Accept: image/webp,*/*;q=0.8\r\nAccept-Encoding: gzip, deflate, sdch\r\nAccept-Language: en-US,en;q=0.8,he;q=0.6\r\nReferer: http://www.sport5.co.il\r\nUser-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36\r\n\r\n
 

פרסאוס

New member
כמה אפשרויות

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

אני עובד עם הספריות winsock2, ws2tcpip
ועושה link ל: Ws2_32.lib, Mswsock.lib, and Advapi32.lib

ואין שום בקשה לשינוי מיקום, לא ב-sport5 (status 200) ולא ב-mako (לא מקבל כלום. recvbuf ריק)
 

nocgod

New member
תתן בבקשה דוגמא לresponse

לצורך העניין עבור הבקשה:
GET [URL]http://www.mako.co.il/[/URL] HTTP/1.1User-Agent: Fiddler
Host: www.mako.co.il

הresponse היה http://pastebin.com/yQPB8LjB

עבור הבקשה שאתה ציינת
GET [URL]http://www.sport5.co.il/[/URL] HTTP/1.1Host: www.sport5.co.il
Content-Type: text/plain
Accept: image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdchAccept-Language: en-US,en;q=0.8,he;q=0.6Referer: http://www.sport5.co.ilUser-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36
באמצעות fiddler (אגב אחד הכלים הכי טובים שאי פעם נפגשתי איתם כדי לדבג HTTP) קיבלתי את הresponse הבא http://pastebin.com/EUwFAu8G

אם אתה לא מכיר את fiddler אז כדאי לך לנסות לדבג את התעבורת http שלך באמצעותו, כדי לראות מה באמת נשלח ממך ומה מתקבל בחזרה. ככה תוכל לבדוק:
א. אם אתה שולח את המידע לא טוב
ב. אם אתה מפרסר את המידע לא טוב
 
Response

כשאני שולח ל-SPORT5 זה מה שאני מקבל:
http://pastebin.com/mKCBR8zu
(שים לב שבאיזשהו שלב ב-HTML הוא כאילו מפסיק).

לגבי mako אני פשוט לא מקבל כלום (שום דבר אפילו לא ברמת ה-status).

זה מוזר מאוד. מצד אחד עם השרתים שלי או אתרים אחרים הכל עובד בצורה מושלמת.
מצד שני, אתרים כמו sport5,mako עושים בעיות (בטוח יש עוד כדוגמתם).

אני לא כ"כ מצליח להבין האם הבעיה היא ברמת הקוד או ברמת ה-HTTP?
כי מצד אחד עם אתרים מסוימים הכל עובד חלק (כלומר ה-http header request תקין לכאורה).
מצד שני, אתה אומר שהרצת את ה-http שלי והכל דרך fiddler ועבד תקין (אני כבר מתכון להתקין).
לא כ"כ מבין איפה לשים את האצבע.
 

nocgod

New member
תתקין fiddler ותראה מה הוא תופס...

יש מצב אתה מפספס משהו בקריאה של הresponse וקורא רק חלק ממנו?
 

nocgod

New member
תנסה לעשות את הבקשות שלי בלי כל הheaders

אתה לא באמת צריך אותם כרגע
GET [URL]http://www.sport5.co.il/[/URL] HTTP/1.1Host: www.sport5.co.il
תנסה לשלוח את בקשה הזאת דרך פידלר ואז דרך האפליקציה שכתבת.

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

אני קורא לפונקציה recv כל עוד היא גדולה מאפס.
כלומר:
while( iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0)) { ... }
רק כאשר iResult הוא 0, אני סוגר את ה-connection, כי אין לי יותר packet-ים לקבל...

אגב, הרצתי בינתיים את ה-http hreader ש-nocgod נתן לי ועדין קיבלתי את אותו response....
(אגיע הביתה ואוריד fiddler כדי לדבג, אבל כרגע זה המצב)
 

selalerer

New member
התוכן של התשובה מכווץ ב-gzip.

היום כמעט כל http server מקונפג לשלוח חזרה תוכן מכווץ תחת שני תנאים:
* התוכן הוא מעל גודל מסויים (1KB או 2KB זה נהוג).
* הלקוח הצהיר שהוא מוכן לקבל תוכן מכווץ.
&nbsp
אתה הצהרת שאתה מוכן לקבל תוכן מכווץ ב-header הזה:
&nbsp
Accept-Encoding: gzip, deflate, sdch\r\n
&nbsp
&nbsp
והשרת הצהיר שהוא מחזיר לך את התוכן מכווץ ב-header הזה:
&nbsp
Content-Encoding: gzip
&nbsp
&nbsp
 
עדין לא יורד לסוף דעתך...

מספר הבתים שאני מקבל (4,286) קטן משמעותית מגודל ה-content-length של הקובץ המבוקש (123,438).
לכן אני לא חושב שיש כאן קשר בכלל לקידוד...
כי קודם כל אני צריך לקבל את כל הבתים במלואם - אבל זה לא קורה עם האתר הזה.

 

eladts

New member
זה בהחלט אפשרי

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

selalerer

New member
צודק. אתה אמור לקבל את כל התוכן.

תבדוק SOCKET_ERROR כמו שכתבתי למעלה. שים לב גם שנראה שהמקומות שיש לך בעיות איתם זה דפים שאתה מקבל מאיזה cache server בדרך ולא מהשרת האמיתי של האתר. נראה שהבעיה היא משהו שקשור בזה.
 

nocgod

New member
אגב אם זה באמת בעיית קאש

אולי אפשר להוסיף query ריק רק כדי שלא יהיה hit
 

selalerer

New member
זה כבר תלוי בקונפיגורציה של ה-cache server.

יש כאלו שעבור אותו ה-path מחזירים תמיד את אותו הקובץ בלי להתחשב ב-query string.
 
למעלה