{"record":{"id":"fd841b452df8ced3","repo":"kataras/iris","slug":"context-read-body-cannot-bind-multipart-related","errorCode":null,"errorMessage":"context: read body: cannot bind multipart/related: use ReadMultipartRelated instead","messagePattern":"context: read body: cannot bind multipart/related: use ReadMultipartRelated instead","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"error","filePath":"context/context.go","lineNumber":3304,"sourceCode":"\n\t\t// otherwise use the ReadForm,\n\t\t// it's actually the same except\n\t\t// ReadQuery will not fire errors on:\n\t\t// 1. unknown or empty url query parameters\n\t\t// 2. empty query or form (if FireEmptyFormError is enabled).\n\t\treturn ctx.ReadForm(ptr)\n\t}\n\n\tswitch ctx.GetContentTypeRequested() {\n\tcase ContentXMLHeaderValue, ContentXMLUnreadableHeaderValue:\n\t\treturn ctx.ReadXML(ptr)\n\t\t// \"%v reflect.Indirect(reflect.ValueOf(ptr)).Interface())\n\tcase ContentYAMLHeaderValue, ContentYAMLTextHeaderValue:\n\t\treturn ctx.ReadYAML(ptr)\n\tcase ContentFormHeaderValue, ContentFormMultipartHeaderValue:\n\t\treturn ctx.ReadForm(ptr)\n\tcase ContentMultipartRelatedHeaderValue:\n\t\treturn fmt.Errorf(\"context: read body: cannot bind multipart/related: use ReadMultipartRelated instead\")\n\tcase ContentJSONHeaderValue:\n\t\treturn ctx.ReadJSON(ptr)\n\tcase ContentProtobufHeaderValue:\n\t\tmsg, ok := ptr.(proto.Message)\n\t\tif !ok {\n\t\t\treturn ErrContentNotSupported\n\t\t}\n\n\t\treturn ctx.ReadProtobuf(msg)\n\tcase ContentMsgPackHeaderValue, ContentMsgPack2HeaderValue:\n\t\treturn ctx.ReadMsgPack(ptr)\n\tdefault:\n\t\tif ctx.Request().URL.RawQuery != \"\" {\n\t\t\t// try read from query.\n\t\t\treturn ctx.ReadQuery(ptr)\n\t\t}\n\n\t\t// otherwise default to JSON.","sourceCodeStart":3286,"sourceCodeEnd":3322,"githubUrl":"https://github.com/kataras/iris/blob/7bedaf55a0b64bbb2248a5845a2c60d81a30996a/context/context.go#L3286-L3322","documentation":"Returned by Context.ReadBody (content-type based auto-binding) when the request's Content-Type is multipart/related. This format has no generic struct binding: it must be decoded with the dedicated ReadMultipartRelated API, so the library refuses to bind and tells you which method to use instead. It is a deliberate routing error, not data corruption.","triggerScenarios":"Calling ctx.ReadBody(ptr) on a request whose Content-Type is multipart/related (e.g. MTOM/XOP SOAP payloads).","commonSituations":"SOAP MTOM endpoints consumed through a generic JSON/YAML/form read helper; middleware that blindly calls ReadBody on every request; migrating generic handlers to accept file-bearing payloads.","solutions":["Switch the handler to ctx.ReadMultipartRelated() for multipart/related requests.","Branch on ctx.GetContentType() before calling ReadBody.","Parse with mime/multipart yourself if you need custom semantics.","Send a 415 Unsupported Media Type if the endpoint does not intend to accept multipart/related."],"exampleFix":"// before\nvar req Payload\nif err := ctx.ReadBody(&req); err != nil { return err }\n// after\nswitch ctx.GetContentType() {\ncase context.ContentMultipartRelatedHeaderValue:\n    mr, err := ctx.ReadMultipartRelated()\n    if err != nil { return err }\n    // handle parts\ndefault:\n    var req Payload\n    return ctx.ReadBody(&req)\n}","handlingStrategy":"type-guard","validationCode":"if strings.HasPrefix(ctx.GetContentType(), \"multipart/related\") {\n    mr, err := ctx.ReadMultipartRelated()\n    _ = mr // handle parts\n    _ = err\n    return\n}","typeGuard":"func isMultipartRelatedRequest(ctx *context.Context) bool {\n    return strings.HasPrefix(ctx.GetContentType(), context.ContentMultipartRelatedHeaderValue)\n}","tryCatchPattern":"var req Payload\nif err := ctx.ReadBody(&req); err != nil {\n    if strings.Contains(err.Error(), \"multipart/related\") {\n        return ctx.ReadMultipartRelated() // route to dedicated API\n    }\n    return err\n}","preventionTips":["Dispatch on Content-Type before any generic ReadBody call","Never use ReadBody as a universal binder for all media types","Return 415 with the accepted content types when rejecting multipart/related"],"tags":["go","iris","content-type","multipart","api-misuse"],"backgroundTag":"unsupported-content-type-binding","analyzedSha":"7bedaf55a0b64bbb2248a5845a2c60d81a30996a","analyzedAt":"2026-08-30T20:38:16.250Z","schemaVersion":2},"datasetVersion":"2026-08-30T23:17:21.991Z"}