|
1 | 1 | use std::fmt::{self, Write};
|
| 2 | +use std::mem; |
2 | 3 |
|
3 | 4 | use bytes::{BytesMut, Bytes};
|
4 | 5 | use http::header::{CONTENT_LENGTH, DATE, Entry, HeaderName, HeaderValue, TRANSFER_ENCODING};
|
@@ -32,12 +33,13 @@ where
|
32 | 33 | if buf.len() == 0 {
|
33 | 34 | return Ok(None);
|
34 | 35 | }
|
35 |
| - let mut headers_indices = [HeaderIndices { |
36 |
| - name: (0, 0), |
37 |
| - value: (0, 0) |
38 |
| - }; MAX_HEADERS]; |
| 36 | + // Unsafe: both headers_indices and headers are using unitialized memory, |
| 37 | + // but we *never* read any of it until after httparse has assigned |
| 38 | + // values into it. By not zeroing out the stack memory, this saves |
| 39 | + // a good ~5% on pipeline benchmarks. |
| 40 | + let mut headers_indices: [HeaderIndices; MAX_HEADERS] = unsafe { mem::uninitialized() }; |
39 | 41 | let (len, method, path, version, headers_len) = {
|
40 |
| - let mut headers = [httparse::EMPTY_HEADER; MAX_HEADERS]; |
| 42 | + let mut headers: [httparse::Header; MAX_HEADERS] = unsafe { mem::uninitialized() }; |
41 | 43 | trace!("Request.parse([Header; {}], [u8; {}])", headers.len(), buf.len());
|
42 | 44 | let mut req = httparse::Request::new(&mut headers);
|
43 | 45 | match req.parse(&buf)? {
|
@@ -262,12 +264,10 @@ where
|
262 | 264 | if buf.len() == 0 {
|
263 | 265 | return Ok(None);
|
264 | 266 | }
|
265 |
| - let mut headers_indices = [HeaderIndices { |
266 |
| - name: (0, 0), |
267 |
| - value: (0, 0) |
268 |
| - }; MAX_HEADERS]; |
| 267 | + // Unsafe: see comment in Server Http1Transaction, above. |
| 268 | + let mut headers_indices: [HeaderIndices; MAX_HEADERS] = unsafe { mem::uninitialized() }; |
269 | 269 | let (len, status, version, headers_len) = {
|
270 |
| - let mut headers = [httparse::EMPTY_HEADER; MAX_HEADERS]; |
| 270 | + let mut headers: [httparse::Header; MAX_HEADERS] = unsafe { mem::uninitialized() }; |
271 | 271 | trace!("Response.parse([Header; {}], [u8; {}])", headers.len(), buf.len());
|
272 | 272 | let mut res = httparse::Response::new(&mut headers);
|
273 | 273 | let bytes = buf.as_ref();
|
|
0 commit comments