HeaderName from bytes unchecked support
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
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- 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.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của hyperium/http
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
-
Độ khó 3/5 1-2 ngày Mức phù hợp với người mới 62/100
-
Độ khó 3/5 1-2 ngày Mức phù hợp với người mới 58/100
-
Độ khó 3/5 1-2 ngày Mức phù hợp với người mới 62/100
-
Độ khó 5/5 Hơn một tuần Mức phù hợp với người mới 30/100
Tất cả issue của hyperium/http
Issue tương tự
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 62/100
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 66/100
Maintainer thường phản hồi trong vòng 5 ngày
-
✨ enhancement needs-discussion
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 85/100
-
virtio-fs (Linux passthrough): debug log in do_lookup panics the fs worker on non-UTF-8 file namesCó thể đã có người làm @zcl-g5 đã nhận hôm nay. Đang mở
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 85/100
Maintainer thường phản hồi trong vòng 2 ngày
-
docs(openclaw): RTK_REWRITE_HOST relaxes every default ask, not only commands no rule matchedĐang mởarea:docs documentation good first issue priority:low
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
rtk-ai/rtk#4500 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày