{"record":{"id":"f184d3392a61d5a1","repo":"seanmonstar/warp","slug":"multipart-field-is-missing-a-name","errorCode":null,"errorMessage":"Multipart field is missing a name","messagePattern":"Multipart field is missing a name","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/filters/multipart.rs","lineNumber":127,"sourceCode":"// ===== impl FormData =====\n\nimpl fmt::Debug for FormData {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        f.debug_struct(\"FormData\").finish()\n    }\n}\n\nimpl Stream for FormData {\n    type Item = Result<Part, crate::Error>;\n\n    fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {\n        match self.inner.poll_next_field(cx) {\n            Poll::Pending => Poll::Pending,\n            Poll::Ready(Ok(Some(part))) => {\n                if part.name().is_some() || part.file_name().is_some() {\n                    Poll::Ready(Some(Ok(Part { part })))\n                } else {\n                    Poll::Ready(Some(Err(crate::Error::new(MultipartFieldMissingName))))\n                }\n            }\n            Poll::Ready(Ok(None)) => Poll::Ready(None),\n            Poll::Ready(Err(err)) => Poll::Ready(Some(Err(crate::Error::new(err)))),\n        }\n    }\n}\n\n// ===== impl Part =====\n\nimpl Part {\n    /// Get the name of this part.\n    pub fn name(&self) -> &str {\n        self.part\n            .name()\n            .unwrap_or_else(|| self.part.file_name().expect(\"checked for name previously\"))\n    }\n","sourceCodeStart":109,"sourceCodeEnd":145,"githubUrl":"https://github.com/seanmonstar/warp/blob/ff34d7213ed55ec342304aa7ff6ac4b351da9e66/src/filters/multipart.rs#L109-L145","documentation":"warp's multipart filter returns a MultipartFieldMissingName error when a received multipart part has neither a name nor a file name in its Content-Disposition. Named parts are the API contract for part.part.name(); anonymous parts cannot be addressed.","triggerScenarios":"A client POSTs multipart/form-data where a part's Content-Disposition lacks both 'name=' and 'filename=' attributes; warp::multipart's Stream then yields this error on poll_next.","commonSituations":"Hand-rolled multipart bodies in tests or curl scripts missing the name attribute; misbehaving HTTP clients or proxies stripping Content-Disposition parameters.","solutions":["Fix the client/test to always send name=\"...\" in each part's Content-Disposition","Generate multipart bodies with a proper library (e.g. multer, reqwest multipart) instead of manual strings","If anonymous parts are expected, handle the error from the stream instead of unwrapping Ok"],"exampleFix":"// before\nlet body = \"--B\\r\\nContent-Type: text/plain\\r\\n\\r\\nhi\\r\\n--B--\";\n// after\nlet body = \"--B\\r\\nContent-Disposition: form-data; name=\\\"field\\\"\\r\\n\\r\\nhi\\r\\n--B--\";","handlingStrategy":"validation","validationCode":"// ensure every generated part includes a name attribute\nassert!(body.contains(\"Content-Disposition: form-data; name=\"), \"multipart part missing name\");","typeGuard":null,"tryCatchPattern":"// warp errors are Rejects: filter and map them\nlet parts = req multipart stream\n    .try_filter_map(|part| async move {\n        if part.name().is_some() { Ok(Some(part)) } else { Ok(None) }\n    });\n// or at the route: .map(|result| result.map_err(|re| ...))","preventionTips":["Always send name= in Content-Disposition when building multipart bodies","Use a multipart library to generate bodies instead of manual strings","Handle the error stream instead of assuming every part is named"],"tags":["multipart","form-data","content-disposition"],"backgroundTag":"empty-required-field","analyzedSha":"ff34d7213ed55ec342304aa7ff6ac4b351da9e66","analyzedAt":"2026-09-09T16:57:46.316Z","contentChangedAt":"2026-09-09T16:57:46.316Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}