go mime: 解析媒体类型时,对于不带引号但包含空格的值报告错误,

63lcw9qa  于 4个月前  发布在  Go
关注(0)|答案(7)|浏览(53)

你正在使用的Go版本是什么( go version )?

$ go version 1.15

这个问题在最新版本中是否重现?

是的

你正在使用什么操作系统和处理器架构( go env )?

GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/Users/candeemis/Library/Caches/go-build"
GOENV="/Users/candeemis/Library/Application Support/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOINSECURE=""
GOMODCACHE="/Users/candeemis/go/pkg/mod"
GONOPROXY=""
GONOSUMDB=""
GOOS="darwin"
GOPATH="/Users/candeemis/go"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/usr/local/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/darwin_amd64"
GCCGO="gccgo"
AR="ar"
CC="clang"
CXX="clang++"
CGO_ENABLED="1"
GOMOD="/Users/candeemis/play-ground/go-mime-parser/go.mod"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/z9/3q3874k11pd_h45kz05lngr40000gn/T/go-build706623001=/tmp/go-build -gno-record-gcc-switches -fno-common"

你做了什么?

经过几个小时的调试,我发现 mime/mediatype.go 模块中的 ParseMediaType 函数在解析内容类型作为 application/pdf; x-unix-mode=0644; name=RG Mellowmessage 4.12.20.pdf 的内容类型时,从媒体类型中抛出以下错误。错误:
Failed to ReadParts: mime: invalid media parameter
ParseMediaType 函数内部调用另一个函数 consumeMediaParam 来解析单个媒体类型,例如上面提到的内容类型 x-unix-modename(附加文件的名称)是两种不同的类型。如果 consumeMediaParam 包含任何空格,就会错误地解析媒体类型值。例如,上面的内容类型 name 中就包含了空格。因此,它只将 RG 作为 name 键的值分配,并继续尝试解析剩余部分。然而,在剩余部分中,没有用 = 符号分隔的键。这就是为什么它会抛出上述错误的原因。

你期望看到什么?

它应该将 RG Mellowmessage 4.12.20.pdf 作为 name 键的值进行解析。这意味着它应该忽略值中的空格。

你看到了什么?

以下错误:
Failed to ReadParts: mime: invalid media parameter

iezvtpos

iezvtpos1#

基于RFC 2045第5.1节

parameter := attribute "=" value

 attribute := token
              ; Matching of attributes
              ; is ALWAYS case-insensitive.

 value := token / quoted-string

 token := 1*<any (US-ASCII) CHAR except SPACE, CTLs,
             or tspecials>

这看起来像一个格式错误的头部

vmdwslir

vmdwslir2#

但是以下内容并没有排除值中的空格,对吗?🤔

value := token / quoted-string

     token := 1*<any (US-ASCII) CHAR except SPACE, CTLs,
                 or tspecials>

     tspecials :=  "(" / ")" / "<" / ">" / "@" /
                   "," / ";" / ":" / "\" / <">
                   "/" / "[" / "]" / "?" / "="
                   ; Must be in quoted-string,
                   ; to use within parameter values
iyfjxgzm

iyfjxgzm3#

它可以包含空格,但在引用字符串中,而不是您展示的裸令牌。

z4bn682m

z4bn682m5#

@candeemis 你是否同意mime.ParseMediaType在输入上报告错误的行为的正确性,即它符合规范?

6psbrbz9

6psbrbz96#

@dmitshur

好的,我可以说当前的实现满足了RFC规范。同时,我仍然认为有改进的空间,可以进行更进一步的不同实现。这不仅会满足规范,还会忽略像在问题中提到的那样的小问题。我正在研究这个概念,但由于时间限制,可能需要一些时间。

dfty9e19

dfty9e197#

@candeemis 你是说像观察Postel定律那样吗?

相关问题