如果您仔细阅读RFC 7233,
附录A将
RFC 2046第5.1节用于HTTP正文中MIME数据的实际格式:
当206(部分内容)响应消息包括多个范围的内容时,它们作为多部分消息体([RFC2046],第5.1节)中的主体部分传输,其媒体类型为“multipart / byteranges”。
RFC 2046第5.1节定义了“多部分”媒体类型的正式定义以及如何格式化和解析其边界。
为了回答您的问题,以下是来自RFC 2046的正式语法:
边界分隔符必须出现在一行的开头,即在CRLF之后,并且初始的CRLF被视为附加到边界分隔符行而不是前面部分的一部分。边界可以后跟零个或多个线性空格字符。然后,它由另一个CRLF和下一部分的标头字段终止,或者由两个CRLF终止,在这种情况下,下一部分没有标头字段。如果不存在Content-Type字段,则假定在“multipart/digest”中为“message/rfc822”,否则为“text/plain”。
注意:边界分隔符行之前的CRLF在概念上附加到边界,因此可能存在不以CRLF(换行符)结尾的部分。因此,必须将必须考虑为以换行符结束的正文部分具有两个CRLF,第一个是前面部分的一部分,第二个是封装边界的一部分。
...
最后一个正文部分后面的边界分隔符行是一个特殊的分隔符,表示不会再有更多的正文部分跟随。这样的分隔符行与之前的分隔符行相同,只是在边界参数值后面添加了两个连字符。
--gc0pJq0M:08jU534c0p--
实现者注意:边界字符串比较必须将边界值与每个候选行的开头进行比较。不需要完全匹配整个候选行;只要边界完整地出现在CRLF之后即可。
...
“multipart” 媒体类型的唯一必需全局参数是边界参数,该参数由一组已知通过电子邮件网关非常健壮的1到70个字符组成,并且不以空格结束。(如果边界分隔符行似乎以空格结尾,则必须假定是网关添加的空格,并将其删除。)它由以下 BNF 正式指定:
boundary:=0*69bcharsnospace
bchars:=bcharsnospace/" "
bcharsnospace:=DIGIT/ALPHA/"'"/"("/")"/"+"/"_"/","/"-"/"."/
"/" / ":" / "=" / "?"
总体而言,“multipart” 实体的正文可以指定如下:
dash-boundary:="--" boundary
;boundary 取自 Content-Type 字段的 boundary 参数。
multipart-body:=[preamble CRLF]
dash-boundary transport-padding CRLF
body-part *encapsulation
close-delimiter transport-padding
[CRLF epilogue]
transport-padding:=*LWSP-char
; 作曲家不得生成长度非零的传输填充,
; 但接收器必须能够处理消息传输添加的填充。
encapsulation:=delimiter transport-padding
CRLF body-part
delimiter:=CRLF dash-boundary
close-delimiter:=delimiter "--"
preamble:=discard-text
epilogue:=discard-text
discard-text:=*(*text CRLF) *text
; 可被忽略或丢弃。
body-part:=MIME-part-headers [CRLF *OCTET]
; 正文部分中的行不得以指定的 dash-boundary 开头,
; 并且分隔符不能出现在正文部分的任何位置。
; 请注意,body-part 的语义与消息的语义不同,
; 如本文所述。
OCTET:=
每个新部分开头的分界符都以CRLF结尾,任何紧接着分界符之前的CRLF都被解析为边界的一部分而不是前一个部分的数据。然而,在最后一个结束边界上没有CRLF,除非有一个epilogue出现(在电子邮件中很少使用,在HTTP中我从未见过它被使用,因为没有办法确定epilogue何时结束,除非有一个有效的Content-Length头存在,这不应该与类似MIME的自终止内容类型一起使用)。