Hacktoberfest 2026: những issue maintainer đã đánh dấu cho tháng Mười, đang mở và phù hợp người mới. Xem issue Hacktoberfest

HeaderName from bytes unchecked support

Đang mở
#857 0 bình luận 1 reaction 0 người được giao Xem trên GitHub

Chưa có ai nhận issue này.

Đánh giá

Độ khó
4/5
Thời gian dự kiến
3-5 ngày
Mức phù hợp với người mới
45/100
Loại issue
Tính năng
Độ rõ ràng
Khá rõ ràng
Mức độ hoạt động
Ít trao đổi
Công nghệ
rust
Lĩnh vực
api, backend-api-design

Hướng nghiên cứu

Bắt đầu bằng việc xác định các API hiện có để chuyển đổi byte và phân tích HeaderName, sau đó so sánh chúng với các chữ ký được đề xuất của from_bytes_unchecked và parse_hdr_unchecked. Xem xét các yêu cầu về tính an toàn và lifetime trước khi quyết định cách tích hợp đường dẫn unchecked. Công việc được hoàn tất khi API hỗ trợ các byte tên header đã được xác thực mà không cần xác thực dư thừa, đồng thời vẫn bảo toàn các đảm bảo đã nêu đối với đầu vào không hợp lệ.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Mô tả

Hello,

I would like to request support for a function that accepts pre-validated HTTP header name tokens. This would allow parsers to skip redundant validation when bytes have already been validated upstream.

Proposed API

/// Converts a slice of bytes to an HTTP header name.
///
/// # Safety
///
/// The caller must ensure that `src` contains only valid HTTP header name tokens.
/// This allows the parser to skip validation and normalization for improved performance.
/// Passing invalid bytes will result in undefined behavior.
pub unsafe fn from_bytes_unchecked(src: &[u8]) -> Result<HeaderName, InvalidHeaderName> {
    let mut buf = uninit_u8_array();
    // SAFETY: see `from_bytes_unchecked` guarantees
    parse_hdr_unchecked(src, &mut buf)?
}

/// # Safety
///
/// The caller must ensure that `data` contains only valid HTTP header name tokens.
unsafe fn parse_hdr_unchecked<'a>(
    data: &'a [u8],
    b: &'a mut [MaybeUninit<u8>; SCRATCH_BUF_SIZE]
) -> Result<HeaderName, InvalidHeaderName> {
    match data.len() {
        0 => Err(InvalidHeaderName::new()),
        len @ 1..=SCRATCH_BUF_SIZE => {
            // Read from data into the buffer
            data.iter()
                .zip(b.iter_mut())
                .for_each(|(byte, out)| *out = MaybeUninit::new(*byte as usize));
            // SAFETY: len bytes of b were just initialized.
            let name: &'a [u8] = unsafe { slice_assume_init(&b[0..len]) };
            match StandardHeader::from_bytes(name) {
                Some(sh) => Ok(sh.into()),
                None => {
                    let buf = Bytes::copy_from_slice(name);
                    // SAFETY: see `parse_hdr_unchecked` guarantees
                    let val = unsafe { ByteStr::from_utf8_unchecked(buf) };
                    Ok(Custom(val).into())
                }
            }
        },
        SCRATCH_BUF_OVERFLOW..=super::MAX_HEADER_NAME_LEN => {
            use bytes::{BufMut};
            let mut dst = BytesMut::with_capacity(data.len());

            dst.extend_from_slice(data);

            // SAFETY: see `parse_hdr_unchecked` guarantees
            let val = unsafe { ByteStr::from_utf8_unchecked(dst.freeze()) };

            Ok(Custom(val).into())
        },
        _ => Err(InvalidHeaderName::new()),
    }
}

Motivation

Many HTTP parsers already perform validation of header name tokens during parsing. This function would allow those parsers to avoid duplicate validation by reusing the existing validation results. Additionally, the unchecked parser could return HeaderName directly, since the invariant of valid header tokens would be guaranteed by the caller.

Ngôn ngữ chính
Rust
Star
1.4k
Fork
382
Merge trung bình
10 giờ 32 phút
Pull request đã merge (30 ngày)
2

Chuẩn bị môi trường

Dự án này không cung cấp dev container, Dockerfile hay hướng dẫn đóng góp, nên bạn cần tự thiết lập môi trường: hãy bắt đầu từ README và xem hướng dẫn đóng góp lần đầu của chúng tôi để biết các bước chung.

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của hyperium/http

Tất cả issue của hyperium/http

Issue tương tự

Thêm issue về Rust

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.