Skip to content

Commit e29d513

Browse files
authored
connmgr: use arrayvec in server tasks (#48371)
1 parent 79697cd commit e29d513

1 file changed

Lines changed: 25 additions & 45 deletions

File tree

src/connmgr/connection.rs

Lines changed: 25 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1649,30 +1649,25 @@ async fn server_req_respond<'buf, 'st, R: AsyncRead, W: AsyncWrite>(
16491649

16501650
// Send response header
16511651

1652-
let mut headers = [http1::EMPTY_HEADER; HEADERS_MAX];
1653-
let mut headers_len = 0;
1652+
let mut headers = ArrayVec::<http1::Header, HEADERS_MAX>::new();
16541653

16551654
for h in rdata.headers.iter() {
1656-
if headers_len >= headers.len() {
1655+
if headers.remaining_capacity() == 0 {
16571656
return Err(Error::BadMessage);
16581657
}
16591658

1660-
headers[headers_len] = http1::Header {
1659+
headers.push(http1::Header {
16611660
name: h.name,
16621661
value: h.value,
1663-
};
1664-
1665-
headers_len += 1;
1662+
});
16661663
}
16671664

1668-
let headers = &headers[..headers_len];
1669-
16701665
let mut resp_take = resp.take().unwrap();
16711666

16721667
let (header, prepare_body) = match resp_take.prepare_header(
16731668
rdata.code,
16741669
rdata.reason,
1675-
headers,
1670+
&headers,
16761671
http1::BodySize::Known(rdata.body.len()),
16771672
resp_state,
16781673
) {
@@ -3573,8 +3568,7 @@ where
35733568
}
35743569

35753570
let (header, mut prepare_body) = {
3576-
let mut headers = [http1::EMPTY_HEADER; HEADERS_MAX];
3577-
let mut headers_len = 0;
3571+
let mut headers = ArrayVec::<http1::Header, HEADERS_MAX>::new();
35783572

35793573
for h in rdata.headers.iter() {
35803574
// Don't send these headers
@@ -3586,26 +3580,22 @@ where
35863580
continue;
35873581
}
35883582

3589-
if headers_len >= headers.len() {
3583+
if headers.remaining_capacity() == 0 {
35903584
return Err(Error::BadMessage);
35913585
}
35923586

3593-
headers[headers_len] = http1::Header {
3587+
headers.push(http1::Header {
35943588
name: h.name,
35953589
value: h.value,
3596-
};
3597-
3598-
headers_len += 1;
3590+
});
35993591
}
36003592

3601-
let headers = &headers[..headers_len];
3602-
36033593
let mut resp_take = resp.take().unwrap();
36043594

36053595
match resp_take.prepare_header(
36063596
rdata.code,
36073597
rdata.reason,
3608-
headers,
3598+
&headers,
36093599
http1::BodySize::Known(rdata.body.len()),
36103600
resp_state,
36113601
) {
@@ -3652,8 +3642,8 @@ where
36523642
// Send response header
36533643

36543644
let (header, mut prepare_body) = {
3655-
let mut headers = [http1::EMPTY_HEADER; HEADERS_MAX];
3656-
let mut headers_len = 0;
3645+
let mut ws_ext = ArrayVec::<u8, 512>::new();
3646+
let mut headers = ArrayVec::<http1::Header, HEADERS_MAX>::new();
36573647

36583648
let mut body_size = http1::BodySize::Unknown;
36593649

@@ -3680,67 +3670,57 @@ where
36803670
}
36813671
}
36823672

3683-
if headers_len >= headers.len() {
3673+
if headers.remaining_capacity() == 0 {
36843674
return Err(Error::BadMessage);
36853675
}
36863676

3687-
headers[headers_len] = http1::Header {
3677+
headers.push(http1::Header {
36883678
name: h.name,
36893679
value: h.value,
3690-
};
3691-
3692-
headers_len += 1;
3680+
});
36933681
}
36943682

36953683
if body_size == http1::BodySize::Unknown && !rdata.more {
36963684
body_size = http1::BodySize::Known(rdata.body.len());
36973685
}
36983686

3699-
let mut ws_ext = ArrayVec::<u8, 512>::new();
3700-
37013687
if let Some(ws_req_data) = &ws_req_data {
37023688
let accept_data = &ws_req_data.accept;
37033689

3704-
if headers_len + 4 > headers.len() {
3690+
if headers.remaining_capacity() < 4 {
37053691
return Err(Error::BadMessage);
37063692
}
37073693

3708-
headers[headers_len] = http1::Header {
3694+
headers.push(http1::Header {
37093695
name: "Upgrade",
37103696
value: b"websocket",
3711-
};
3712-
headers_len += 1;
3697+
});
37133698

3714-
headers[headers_len] = http1::Header {
3699+
headers.push(http1::Header {
37153700
name: "Connection",
37163701
value: b"Upgrade",
3717-
};
3718-
headers_len += 1;
3702+
});
37193703

3720-
headers[headers_len] = http1::Header {
3704+
headers.push(http1::Header {
37213705
name: "Sec-WebSocket-Accept",
37223706
value: accept_data.as_bytes(),
3723-
};
3724-
headers_len += 1;
3707+
});
37253708

37263709
if let Some((config, _)) = &ws_req_data.deflate_config {
37273710
if write_ws_ext_header_value(config, &mut ws_ext).is_err() {
37283711
return Err(Error::Compression);
37293712
}
37303713

3731-
headers[headers_len] = http1::Header {
3714+
headers.push(http1::Header {
37323715
name: "Sec-WebSocket-Extensions",
37333716
value: ws_ext.as_ref(),
3734-
};
3735-
headers_len += 1;
3717+
});
37363718
}
37373719
}
37383720

3739-
let headers = &headers[..headers_len];
3740-
37413721
let mut resp_take = resp.take().unwrap();
37423722

3743-
match resp_take.prepare_header(rdata.code, rdata.reason, headers, body_size, resp_state) {
3723+
match resp_take.prepare_header(rdata.code, rdata.reason, &headers, body_size, resp_state) {
37443724
Ok(ret) => ret,
37453725
Err(e) => {
37463726
*resp = Some(resp_take);

0 commit comments

Comments
 (0)