leyline-http 0.1.1

HTTP client that mimics browsers on the wire
Documentation
pub(super) struct Pair<'a> {
    pub key: &'a str,
    pub val: String,
}

pub(super) fn pairs(body: &str) -> Vec<Pair<'_>> {
    let bytes = body.as_bytes();
    let mut out = Vec::new();
    let mut i = 0;
    while i < bytes.len() {
        while i < bytes.len() && (bytes[i] == b' ' || bytes[i] == b',' || bytes[i] == b'\t') {
            i += 1;
        }
        if i >= bytes.len() {
            break;
        }
        let start = i;
        while i < bytes.len() && bytes[i] != b'=' {
            i += 1;
        }
        if i >= bytes.len() {
            break;
        }
        let key = &body[start..i];
        i += 1;
        let (val, next) = value(body, i);
        i = next;
        out.push(Pair { key, val });
    }
    out
}

fn value(body: &str, i: usize) -> (String, usize) {
    let bytes = body.as_bytes();
    if i < bytes.len() && bytes[i] == b'"' {
        let start = i + 1;
        let mut j = start;
        while j < bytes.len() && bytes[j] != b'"' {
            j += 1;
        }
        let end = if j < bytes.len() { j + 1 } else { j };
        (body[start..j].to_string(), end)
    } else {
        let start = i;
        let mut j = start;
        while j < bytes.len() && bytes[j] != b',' {
            j += 1;
        }
        (body[start..j].trim().to_string(), j)
    }
}