http - 如何通过字符序列分割Vec <u8>?

标签 http rust

我想将HTTP请求的有效内容提取为Vec<u8>。在请求中,有效载荷通过序列\r\n\r\n与其余部分分开,这就是为什么我要在此位置分割Vec并采用第二个元素的原因。
我当前的解决方案是使用我编写的以下函数。

fn find_payload_index(buffer: &Vec<u8>) -> usize {
    for (pos, e) in buffer.iter().enumerate() {
        if pos < 3 {
            continue
        }
        if buffer[pos - 3] == 13 && buffer[pos - 2] == 10 && buffer[pos - 1] == 13 && buffer[pos] == 10 {
            return pos + 1;
        }
    }
    0
}
13\r的ASCII值,而10\n的值。然后,我按返回的索引进行拆分。虽然此解决方案在技术上可以正常工作,但感觉却很不干净,我想知道如何以更优雅的方式做到这一点。

最佳答案

首先:

  • 函数几乎永远不应具有&Vec<_>参数。
    参见Why is it discouraged to accept a reference to a String (&String), Vec (&Vec), or Box (&Box) as a function argument?
  • 不要使用魔术值10和13,Rust支持字节字面量:b'\r'b'\n'

  • 关于您的问题:我相信您可以使用带有字节字符串文字模式的 windows matches! 使其更简单:
    fn find_payload_index(buffer: &[u8]) -> Option<usize> {
        buffer
            .windows(4)
            .enumerate()
            .find(|(_, w)| matches!(*w, b"\r\n\r\n"))
            .map(|(i, _)| i)
    }
    
    Permalink to the playground与测试用例。

    关于http - 如何通过字符序列分割Vec <u8>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64849149/

    相关文章:

    git - git push over http 出错?

    rust - 在 Rust 中调用泛型类型的方法

    rust - Rust 中有类似 nodemon 的东西吗?

    multithreading - 如何设计Mutex的可变集合?

    generics - 根据参数值返回不同类型的通用函数

    java 将 POST 表单数组转换为 JSON 对象或 POJO 或 map

    http - 是否有任何 CDN 可以让您完全控制 HTTP header ?

    javascript - ng-show 似乎不适用于全局变量

    http - Golang - 尝试 GET 请求时来自 S3 的 SignatureDoesNotMatch 错误

    rust - 在两个单独的向量中创建对 rust 字符串的引用