MIME ParseMediaType在多部分边界上失败

时间:2017-04-20 19:01:51

标签: http go mime-types

我是Golang api,接受多部分/表单数据请求。但是,对于某些客户端,它无法解析表单,因为它不喜欢客户端使用的边界。

客户端的标题是:

Content-Type:[multipart/form-data; boundary================1648430772==]

我已将其缩小到ParseMediaType包中的mime函数。

如果我打电话:

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库中的错误吗?或者这真的是一个无效的边界?

2 个答案:

答案 0 :(得分:2)

您链接的rfc包含边界和多部分正文的BNF,它不包含Content-Type Header Field的BNF。因此,虽然边界中的config.vm.box_download_insecure=true 很好,但在=标题的parameter value中并不合适。至少没有不引用。

因此,要修复您的第一个示例,请将Content-Type更改为:

Content-Type

https://play.golang.org/p/3Iuk_ACZaQ

你的第二个例子multipart/form-data; boundary="===============1648430772=="似乎工作正常。

https://play.golang.org/p/xJWwBa_QiP

答案 1 :(得分:0)

终于找到了答案。在RFC 2045 doc(https://www.ietf.org/rfc/rfc2045.txt)中,它指出某些值不能用作import numpy as np import matplotlib.pyplot as plt import matplotlib.animation as animation fig, ax = plt.subplots() data = np.random.rand(100) def animate(i): v.set_data(data+i) # update the data return v v = ax.violinplot([]) ax.set_ylim(0,200) v_ani = animation.FuncAnimation(fig, animate, np.arange(1, 200), interval=50, blit=True) 标头中的参数值。

相关部分:

Content-Type

所以你可以使用等号,但只有当它被引用时,所以Go在解析时失败。在这种情况下,客户端正在为 tspecials := "(" / ")" / "<" / ">" / "@" / "," / ";" / ":" / "\" / <"> "/" / "[" / "]" / "?" / "=" ; Must be in quoted-string, ; to use within parameter values param发送技术上不正确的值。