รับการตอบสนองคำขอ http โดยไม่มีเนื้อหายาวหรือไม่

ฉันมีโปรแกรมเล็ก ๆ น้อย ๆ ที่ส่งคำขอ http และรับการตอบกลับด้วยโปรโตคอล TCP

รูปแบบคำขอของฉัน

GET / HTTP/1.0
Host: somewebsite.com
{two new line}

ฉันอ่านคำตอบทีละบรรทัดจากซ็อกเก็ต (โดยใช้ NetworkStream และ StreamReader ใน c#) จนกระทั่งพบส่วนหัวความยาวเนื้อหา ฉันเก็บความยาวไว้แล้วอ่านต่อจนเจอบรรทัดว่าง จากนั้นสร้างบัฟเฟอร์ที่มีความยาวและรับการตอบสนองที่เหลือ

แต่การตอบกลับบางรายการไม่มีส่วนหัวที่มีความยาวเนื้อหา ดังนั้นแนวทางของฉันจึงล้มเหลว หากไม่รู้ว่าควรได้รับกี่ไบต์ ควรหยุดเมื่อใด?


person previous_developer    schedule 07.07.2012    source แหล่งที่มา


คำตอบ (2)


ใน HTTP/1.0 - การตอบสนองของเซิร์ฟเวอร์ที่ไม่มี content-length คือเมื่อสตรีมปิด

ใน HTTP/1.1 - การตอบสนองของเซิร์ฟเวอร์ที่ไม่มี content-length คือเมื่อการตอบสนองถูก มีการเข้ารหัสเป็นกลุ่ม

person Julian Reschke    schedule 07.07.2012
comment
จากคำตอบอื่น ๆ ปรากฏว่าเซิร์ฟเวอร์ HTTP/1.1 ยังคงสามารถทำได้โดยการปิดสตรีม... - person rogerdpack; 07.11.2019
comment
@rogerdpack ใช่มันทำได้ แต่ไม่จำเป็นอีกต่อไป - person Julian Reschke; 07.11.2019

ดูส่วนที่เกี่ยวข้องของข้อกำหนด HTTP ในกรณีเฉพาะของคุณ หากเซิร์ฟเวอร์ไม่คืนความยาวเนื้อหา เซิร์ฟเวอร์จะต้องปิดสตรีมเมื่อตอบกลับเสร็จสิ้น ไม่มีวิธีอื่นที่เชื่อถือได้สำหรับคุณ (ในฐานะลูกค้า) ที่จะรู้ ไม่ว่า HTTP จะเป็นเวอร์ชันใดก็ตาม การเข้ารหัส @Julian chunked นั้นเป็นการอัพเกรดที่ชาญฉลาดใน HTTP / 1.1 แต่ค่อนข้างเฉพาะเจาะจงสำหรับการสตรีมและไม่มีเหตุผลว่าทำไมเว็บเซิร์ฟเวอร์ "ธรรมดา" จึงจะนำไปใช้ นั่นคือเซิร์ฟเวอร์ที่ทราบความยาวของเนื้อหาก่อนเริ่มการตอบสนอง และฉันเดาว่า OP ไม่มีเซิร์ฟเวอร์อยู่ภายใต้การควบคุม ไม่เช่นนั้นเขาจะไม่คัดค้านส่วนหัว HTTP ที่ขาดหายไป

แต่ถึงแม้คุณจะได้รับส่วนหัวความยาวเนื้อหา คุณต้องไม่ไว้วางใจอย่างไม่มีเงื่อนไข ผู้ดำเนินการเซิร์ฟเวอร์ก็เป็นเพียงมนุษย์ที่ผิดพลาดเช่นกัน ใช้เป็นการตอบสนองที่ "น่าจะเป็นไปได้มากที่สุด" ซึ่งเป็นค่าเริ่มต้นของบัฟเฟอร์ที่ปรับขนาดได้ คุณยังคงต้องพร้อมที่จะรับมือให้น้อยลงและมากขึ้น (กรณีที่แย่กว่านั้น)

person Pavel Zdenek    schedule 07.07.2012
comment
นั่นทำให้เข้าใจผิดมาก หากการตอบกลับมีช่องส่วนหัวที่มีความยาวเนื้อหาและไม่ได้ใช้การเข้ารหัสแบบกลุ่ม นั่นเป็นข้อมูล เท่านั้น ที่คุณมี หากคุณได้รับเนื้อหาน้อยลง เนื้อหาควรถูกตัดให้สั้นลง หากคุณได้รับเนื้อหาเพิ่มเติม เซิร์ฟเวอร์เสียหาย หรือคุณกำลังดูคำตอบถัดไปอยู่แล้ว - person Julian Reschke; 07.07.2012
comment
ฉันขอคำอธิบายอย่างถ่อมตัวว่าการอ่านคำตอบถัดไปอาจเกิดขึ้นบนซ็อกเก็ตที่ไม่ซ้ำกันเพียงซ็อกเก็ตเดียวได้อย่างไร ในเมื่อไคลเอนต์ยังแยกวิเคราะห์ซ็อกเก็ตปัจจุบันไม่เสร็จ ดังนั้นจึงไม่น่าจะส่งคำขอถัดไปไปได้เลย ฉันอาจเข้าใจ downvote ได้ดีขึ้น มิฉะนั้นฉันไม่เห็นความขัดแย้งที่มีนัยสำคัญในเรื่องนี้ คุณจะทำอย่างไรเมื่อคุณอ่านถึงความยาวเนื้อหาที่ประกาศไว้และการอ่านซ็อกเก็ตบอกคุณว่าเหลืออีก 2 ไบต์ ในความเป็นจริง การพูดว่าเซิร์ฟเวอร์พังโง่ๆ ฉันจะไม่คุยกับคุณอีกต่อไปนั้นใช้ไม่ได้บ่อยเท่าที่โปรแกรมเมอร์ดีๆ ต้องการ - person Pavel Zdenek; 08.07.2012
comment
vtmarvin: ลูกค้าสามารถใช้การวางท่อได้ - person Julian Reschke; 08.07.2012
comment
อา วางท่อ โอเค ฉันเกือบจะประหลาดใจที่มีฟีเจอร์ HTTP ลึกลับที่ช่วยให้เซิร์ฟเวอร์ส่งการตอบกลับหลายรายการไปยังคำขอเดียว ซึ่งเป็นสิ่งที่ OP น่าจะต้องการทำมากที่สุด - person Pavel Zdenek; 09.07.2012