MIME ParseMediaType 在多部分边界上失败
MIME ParseMediaType fails on multipart boundary
我是一个接受 multipart/form-data 请求的 Golang api。但是,对于某些客户端,它无法解析表单,因为它不喜欢客户端使用的边界。
来自客户端的header是:
Content-Type:[multipart/form-data; boundary================1648430772==]
我已将其缩小到 mime
包中的 ParseMediaType
函数。
如果我打电话:
bad := "multipart/form-data; boundary=1650458473"
d, params, err := mime.ParseMediaType(v)
if err != nil {
fmt.Println("err", err)
}
fmt.Println(d, params)
我得到错误:mime: invalid media parameter
。
请注意,如果我使用
进行此调用
multipart/form-data; boundary=3fc88aad6d1341a4921fd5ac9efe607c
成功没问题
根据 https://www.w3.org/Protocols/rfc1341/7_2_Multipart.html 规范,在我看来这些都是边界的有效字符。
这是 Go mime 库中的错误吗?或者这真的是一个无效的边界?
您链接的 rfc 包含边界和多部分 body 的 BNF,它不包含 Content-Type Header Field 的 BNF。因此,虽然边界中的 =
很好,但在 Content-Type
header 的 parameter
value
中就不行了。至少没有被引用。
因此,要修复您的第一个示例,请将 Content-Type 更改为:
multipart/form-data; boundary="===============1648430772=="
https://play.golang.org/p/3Iuk_ACZaQ
你的第二个例子 multipart/form-data; boundary=1650458473
似乎工作正常。
终于找到答案了。在 RFC 2045 文档 (https://www.ietf.org/rfc/rfc2045.txt) 中声明某些值不能用作 Content-Type
header.
中的参数值
相关部分:
tspecials := "(" / ")" / "<" / ">" / "@" /
"," / ";" / ":" / "\" / <">
"/" / "[" / "]" / "?" / "="
; Must be in quoted-string,
; to use within parameter values
所以你可以使用等号,但前提是它被引用,所以 Go 解析失败。在这种情况下,客户端正在为 boundary
参数发送一个 technically-incorrect 值。
我是一个接受 multipart/form-data 请求的 Golang api。但是,对于某些客户端,它无法解析表单,因为它不喜欢客户端使用的边界。
来自客户端的header是:
Content-Type:[multipart/form-data; boundary================1648430772==]
我已将其缩小到 mime
包中的 ParseMediaType
函数。
如果我打电话:
bad := "multipart/form-data; boundary=1650458473"
d, params, err := mime.ParseMediaType(v)
if err != nil {
fmt.Println("err", err)
}
fmt.Println(d, params)
我得到错误:mime: invalid media parameter
。
请注意,如果我使用
进行此调用multipart/form-data; boundary=3fc88aad6d1341a4921fd5ac9efe607c
成功没问题
根据 https://www.w3.org/Protocols/rfc1341/7_2_Multipart.html 规范,在我看来这些都是边界的有效字符。
这是 Go mime 库中的错误吗?或者这真的是一个无效的边界?
您链接的 rfc 包含边界和多部分 body 的 BNF,它不包含 Content-Type Header Field 的 BNF。因此,虽然边界中的 =
很好,但在 Content-Type
header 的 parameter
value
中就不行了。至少没有被引用。
因此,要修复您的第一个示例,请将 Content-Type 更改为:
multipart/form-data; boundary="===============1648430772=="
https://play.golang.org/p/3Iuk_ACZaQ
你的第二个例子 multipart/form-data; boundary=1650458473
似乎工作正常。
终于找到答案了。在 RFC 2045 文档 (https://www.ietf.org/rfc/rfc2045.txt) 中声明某些值不能用作 Content-Type
header.
相关部分:
tspecials := "(" / ")" / "<" / ">" / "@" /
"," / ";" / ":" / "\" / <">
"/" / "[" / "]" / "?" / "="
; Must be in quoted-string,
; to use within parameter values
所以你可以使用等号,但前提是它被引用,所以 Go 解析失败。在这种情况下,客户端正在为 boundary
参数发送一个 technically-incorrect 值。