2017-04-20 2 views
0

私はmultipart/form-data要求を受け入れるGolang APIです。ただし、一部のクライアントでは、クライアントが使用している境界が気に入らないため、フォームの解析に失敗します。MIME ParseMediaTypeがマルチパート境界で失敗する

クライアントからのヘッダーは次のとおりです。私はmimeパッケージ内ParseMediaType機能にこれを絞り込むまし

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

私が呼び出す場合:

bad := "multipart/form-data; boundary=1650458473" 
d, params, err := mime.ParseMediaType(v) 
if err != nil { 
    fmt.Println("err", err) 
} 
fmt.Println(d, params) 

私はERR取得:mime: invalid media parameterを。私は

multipart/form-data; boundary=3fc88aad6d1341a4921fd5ac9efe607c 

でこの呼び出しを行う場合、それは何の問題も成功していないことを

は注意してください。

https://www.w3.org/Protocols/rfc1341/7_2_Multipart.html仕様によれば、これらはすべて境界として有効な文字のように見えます。

Go Mimeライブラリのバグですか?またはこれは本当に無効な境界ですか?

+1

リクエストの外観を正確に表示できますか?どちらの例も使えます。 – JimB

答えて

2

リンク先のrfcに境界とマルチパートのボディのBNFが含まれていますが、Content-Type Header FieldのBNFは含まれていません。だから境界内の=はちょうどいいですが、Content-Typeヘッダーのparametervalueではうまくありません。少なくとも引用符で囲まれていない。

だからあなたの最初の例は、これにコンテンツタイプを変更修正する:

multipart/form-data; boundary="===============1648430772=="

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

あなたの第二の例multipart/form-data; boundary=1650458473が正常に動作するようです。

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

0

最後に答えが見つかりました。 RFC2045の文書(https://www.ietf.org/rfc/rfc2045.txt)には、特定の値をContent-Typeヘッダーのパラメータ値として使用できないと記載されています。

関連セクション:

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

Goは構文解析に失敗したので、それで、あなたは、等号を使用することができますが、それが引用されています場合にのみに。この場合、クライアントはboundaryパラメータに対して技術的に間違った値を送信しています。

関連する問題