2017-04-20 3 views
0

Ich bin eine Golang API, die Multipart/Form-Datenanforderungen akzeptieren. Bei einigen Clients kann das Formular jedoch nicht analysiert werden, da es die vom Client verwendete Grenze nicht mag.MIME ParseMediaType schlägt auf multipart Grenze

Der Header des Clients ist:

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

ich diese ParseMediaType Funktion im mime Paket auf die nach unten verengt haben.

Wenn ich nennen:

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

ich die err erhalten: mime: invalid media parameter.

Beachten Sie, dass, wenn ich diesen Aufruf zu tun mit

multipart/form-data; boundary=3fc88aad6d1341a4921fd5ac9efe607c 

es kein Problem erfolgreich ist.

Nach der https://www.w3.org/Protocols/rfc1341/7_2_Multipart.html Spezifikation, es sieht für mich aus wie diese sind alle gültigen Zeichen für eine Grenze.

Ist das ein Fehler in der Go Mime-Bibliothek? Oder ist das wirklich eine ungültige Grenze?

+1

Können Sie genau zeigen, wie die Anfrage aussieht? Beide Beispiele können funktionieren. – JimB

Antwort

2

Die RFC, mit der Sie verbunden haben, enthält BNF für den Grenz- und Multipart-Body, es enthält nicht die BNF für den Content-Type Header Field. Also während = in der Grenze ist in Ordnung, es ist nicht in Ordnung in der parametervalue der Content-Type Header. Zumindest nicht unnotiert.

So zu beheben Ihr erstes Beispiel des Content-Type Um dies zu ändern:

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

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

Ihr zweites Beispiel multipart/form-data; boundary=1650458473 scheint gut zu funktionieren.

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

0

fand schließlich die Antwort. Im RFC 2045 doc (https://www.ietf.org/rfc/rfc2045.txt) heißt es, dass bestimmte Werte nicht als Parameterwerte im Header Content-Type verwendet werden können.

Der entsprechende Abschnitt:

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

So können Sie ein Gleichheitszeichen verwenden, aber nur, wenn es zitiert, so Go auf dem Parsing fehlschlägt. Der Client sendet in diesem Fall einen technisch falschen Wert für den Parameter boundary param.

Verwandte Themen