สไตล์การแบ่งบรรทัดส่วนหัว HTTP


161

รูปแบบการแบ่งบรรทัดแบบใดที่เหมาะสำหรับใช้ในส่วนหัว HTTP: \r\nหรือ\n, และเพราะเหตุใด

คำตอบ:


224

\r\nเนื่องจากกำหนดเป็นตัวแบ่งบรรทัดในข้อกำหนดคุณสมบัติของโปรโตคอล RFC2616 ระบุไว้ที่จุดเริ่มต้นของส่วนที่ 2.2, "กฎพื้นฐาน"ค่อนข้างชัดเจน:

CR = <US-ASCII CR, carriage return (13)>
LF = <US-ASCII LF, ตัวป้อนบรรทัด (10)>
HTTP / 1.1 กำหนดลำดับ CR LF เป็นเครื่องหมายสิ้นสุดบรรทัดสำหรับองค์ประกอบโปรโตคอลทั้งหมดยกเว้นเอนทิตี -ร่างกาย

RFC2616 ถูกจำหน่ายแล้วในทางเทคนิคโดย RFC7230 แต่มันทำให้ไม่มีการเปลี่ยนแปลงที่รุนแรงและอีกครั้งโทรออก CRLF เป็นตัวคั่นในมาตรา 3และที่อ้างอิง RFC RFC5234, เอกสารแนบ B.1เพื่อกำหนด "CRLF" %x0D %x0Aเป็น

อย่างไรก็ตามการตระหนักว่าผู้คนจะฝ่าฝืนมาตรฐานเพื่อจุดประสงค์ใดก็ตามจะมี "ข้อกำหนดการยอมรับ" ในส่วนที่ 19.3 (โปรดทราบว่าจะจัดลำดับที่ถูกต้องซ้ำอีกครั้ง):

ตัวยุติบรรทัดสำหรับฟิลด์ส่วนหัวของข้อความคือลำดับ CRLF อย่างไรก็ตามเราขอแนะนำให้แอปพลิเคชันเมื่อแยกวิเคราะห์ส่วนหัวดังกล่าวให้รู้จัก LF ตัวเดียวเป็นตัวยุติบรรทัดและละเว้น CR ชั้นนำ

ในRFC7230 ที่ใหม่กว่า§ 3.5

แม้ว่าตัวสิ้นสุดบรรทัดสำหรับฟิลด์บรรทัดเริ่มต้นและส่วนหัวคือลำดับ CRLF ผู้รับอาจจำ LF เดี่ยวเป็นเทอร์มิเนเตอร์บรรทัดและละเว้น CR ใด ๆ ก่อนหน้านี้

ดังนั้นถ้าคุณต้องการที่จะเป็นความชั่วร้ายหรือมิฉะนั้นทำลายกฎ RFC \r\nของการใช้งาน


@Fred: ไม่มีมีเป็นสิ่งเช่นความชัดเจนเกินไป - ซ้ำไม่จำเป็นและไม่จำเป็นซ้ำและเปล่าการทำซ้ำข้อมูลเดียวกันเมฆข้อความ โดยเฉพาะอย่างยิ่งเมื่ออ้างถึงสิ่งเดียวกันข้างบน - จากสเป็คไม่น้อย
Piskvor ออกจากอาคาร

2
คำตอบที่ชัดเจนดี นี่คือสิ่งที่ดีที่สุดสำหรับ StackOverflow: คำตอบที่ชัดเจนง่าย ๆ สำหรับคำถามที่ชัดเจนง่าย ๆ โดยไม่ต้องยุ่งเหยิงไม่จำเป็นและไม่จำเป็นของบล็อกและบทความ
Miles Rout

@MilesRout: ขอบคุณ :)
Piskvor ออกจากอาคาร

2
@Pacerier: ไม่ได้พูดถึงเรื่องแบบนี้เลย เนื่องจากมันระบุว่า "นี่เป็นไวยากรณ์ที่ถูกต้องเพียงอย่างเดียวสำหรับ HTTP" สิ่งอื่นใดคือไวยากรณ์ที่ไม่ถูกต้อง แน่นอนว่าคุณสามารถละเมิด RFC ได้ทุกอย่างที่คุณต้องการไม่มีใครสามารถหยุดคุณได้ แต่แล้วคุณก็ไม่ได้ใช้ไคลเอนต์ HTTP อีกต่อไปในทางเทคนิคแล้วสิ่งที่มีลักษณะคล้ายกัน;)
Piskvor ออกจากอาคาร

2
RFC7230 ซึ่งเลิกใช้แล้ว RFC2616 มีข้อความเดียวกันในส่วน 3.5
ความเศร้าโศก

22

\ r \ n เพราะ RFC 2616 บอกว่าเป็นเช่นนั้น (ส่วน 2.2, "กฎพื้นฐาน"):

HTTP / 1.1 กำหนดลำดับ CR LF เป็นเครื่องหมายสิ้นสุดของบรรทัดสำหรับ
องค์ประกอบโปรโตคอลทั้งหมดยกเว้นเอนทิตีร่างกาย (ดูภาคผนวก 19.3 สำหรับ
แอปพลิเคชันที่ยอมรับได้) ตัวทำเครื่องหมายจุดสิ้นสุดของบรรทัดภายในเอนทิตีร่างกายถูกกำหนดโดยประเภทสื่อที่เกี่ยวข้องดังที่อธิบายไว้ในส่วน 3.7

   CRLF           = CR LF

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.