Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
else if let Some(start) = boundary_iter.next() { start + boundary.len() }
else { throw!(anyhow!("initial boundary not found")) };
else if let Some(start) = boundary_iter.next() { start + boundary.len() }
else { throw!(anyhow!("initial boundary not found")) };
- let comp = multipart::process_component
+ let comp = multipart::process_boundary
(&mut warnings, &initial[start..], PartName::m)?
.ok_or_else(|| anyhow!(r#"no "m" component"#))?;
(&mut warnings, &initial[start..], PartName::m)?
.ok_or_else(|| anyhow!(r#"no "m" component"#))?;
r#"first multipart component must be name="m""#
)) }
r#"first multipart component must be name="m""#
)) }
- let mut meta = MetadataFieldIterator::new(comp.payload_start);
+ let mut meta = MetadataFieldIterator::new(comp.payload);
let client: ClientName = meta.need_parse().context("client addr")?;
let client: ClientName = meta.need_parse().context("client addr")?;
#[derive(Debug)]
pub struct Component<'b> {
pub name: PartName,
#[derive(Debug)]
pub struct Component<'b> {
pub name: PartName,
- pub payload_start: &'b [u8],
pub type BoundaryFinder = memchr::memmem::Finder<'static>;
#[throws(AE)]
pub type BoundaryFinder = memchr::memmem::Finder<'static>;
#[throws(AE)]
-pub fn process_component<'b>(warnings: &mut Warnings,
- after_leader: &'b [u8], expected: PartName)
- -> Option<Component<'b>> {
+/// Processes the start of a component (or terminating boundary).
+///
+/// Returned payload is only the start of the payload; the next
+/// boundary has not been identified.
+pub fn process_boundary<'b>(warnings: &mut Warnings,
+ after_leader: &'b [u8], expected: PartName)
+ -> Option<Component<'b>> {
let rhs = after_leader;
let mut rhs =
if let Some(rhs) = rhs.strip_prefix(b"\r\n") { rhs }
let rhs = after_leader;
let mut rhs =
if let Some(rhs) = rhs.strip_prefix(b"\r\n") { rhs }
- Some(Component { name: part_name.unwrap_or(expected), payload_start: rhs })
+ Some(Component { name: part_name.unwrap_or(expected), payload: rhs })
}
pub struct MetadataFieldIterator<'b> {
}
pub struct MetadataFieldIterator<'b> {