in core/src/raw/http_util/multipart.rs [442:523]
fn parse(s: &str) -> Result<Self> {
let parts = s.splitn(2, "\r\n\r\n").collect::<Vec<&str>>();
let part_headers_content = parts[0];
let http_response = parts.get(1).unwrap_or(&"");
let mut part_headers = HeaderMap::new();
for line in part_headers_content.lines() {
let parts = line.splitn(2, ": ").collect::<Vec<&str>>();
if parts.len() == 2 {
let header_name = HeaderName::from_str(parts[0]).map_err(|err| {
Error::new(
ErrorKind::Unexpected,
"multipart response contains invalid part header name",
)
.set_source(err)
})?;
let header_value = parts[1].parse().map_err(|err| {
Error::new(
ErrorKind::Unexpected,
"multipart response contains invalid part header value",
)
.set_source(err)
})?;
part_headers.insert(header_name, header_value);
}
}
let parts = http_response.split("\r\n\r\n").collect::<Vec<&str>>();
let headers_content = parts[0];
let body_content = parts.get(1).unwrap_or(&"");
let body_bytes = Buffer::from(body_content.to_string());
let status_line = headers_content.lines().next().unwrap_or("");
let status_code = status_line
.split_whitespace()
.nth(1)
.unwrap_or("")
.parse::<u16>()
.unwrap_or(200);
let mut headers = HeaderMap::new();
for line in headers_content.lines().skip(1) {
let parts = line.splitn(2, ": ").collect::<Vec<&str>>();
if parts.len() == 2 {
let header_name = HeaderName::from_str(parts[0]).map_err(|err| {
Error::new(
ErrorKind::Unexpected,
"multipart response contains invalid part header name",
)
.set_source(err)
})?;
let header_value = parts[1].parse().map_err(|err| {
Error::new(
ErrorKind::Unexpected,
"multipart response contains invalid part header value",
)
.set_source(err)
})?;
headers.insert(header_name, header_value);
}
}
Ok(Self {
part_headers,
version: Version::HTTP_11,
headers,
content: body_bytes,
method: None,
uri: None,
status_code: Some(StatusCode::from_u16(status_code).map_err(|err| {
Error::new(
ErrorKind::Unexpected,
"multipart response contains invalid status code",
)
.set_source(err)
})?),
})
}