Skip to content

Commit 3dfc571

Browse files
committed
fix: log backend send error and fixing unit tests
1 parent 8495180 commit 3dfc571

File tree

6 files changed

+40
-46
lines changed

6 files changed

+40
-46
lines changed

.github/workflows/ci.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ jobs:
3535
run: cargo build --all-features
3636

3737
- name: Unit Tests
38-
run: cargo test --all --exclude http-backend
38+
run: cargo test --all
3939

4040
- name: Check formatting
4141
run: cargo fmt --all -- --check

crates/http-backend/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,4 @@ smol_str = {workspace = true}
2222
[dev-dependencies]
2323
claims = "0.8"
2424
tracing-test = "0.2"
25-
mock-http-connector = "0.3"
25+
mock-http-connector = { git = "https://github.com/nmoutschen/mock-http-connector.git", branch = "hyper-1.0", default-features = false, features = ["hyper_1"]}

crates/http-backend/src/lib.rs

+29-37
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ use hyper_util::client::legacy::connect::{Connect, HttpConnector};
1313
use hyper_util::client::legacy::Client;
1414
use hyper_util::rt::TokioExecutor;
1515
use pin_project::pin_project;
16-
use smol_str::{SmolStr, ToSmolStr};
1716
use tokio::net::TcpStream;
1817
use tower_service::Service;
1918
use tracing::{debug, trace, warn};
@@ -24,7 +23,7 @@ use reactor::gcore::fastedge::{
2423
http_client::Host,
2524
};
2625

27-
type HeaderNameList = Vec<SmolStr>;
26+
type HeaderNameList = Vec<HeaderName>;
2827

2928
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
3029
pub enum BackendStrategy {
@@ -112,8 +111,8 @@ impl<C> Backend<C> {
112111
self.uri.to_owned()
113112
}
114113

115-
pub fn propagate_header_names(&self) -> Vec<SmolStr> {
116-
self.propagate_header_names.to_owned()
114+
pub fn propagate_header_names(&self) -> HeaderNameList {
115+
self.propagate_header_names.clone()
117116
}
118117

119118
/// Propagate filtered headers from original requests
@@ -132,7 +131,7 @@ impl<C> Backend<C> {
132131
}
133132
let headers = headers.into_iter().filter(|(k, _)| {
134133
if let Some(name) = k {
135-
self.propagate_header_names.contains(&name.to_smolstr())
134+
self.propagate_header_names.contains(name)
136135
} else {
137136
false
138137
}
@@ -227,7 +226,7 @@ impl<C> Backend<C> {
227226
!self
228227
.propagate_header_names
229228
.iter()
230-
.any(|name| name.eq_ignore_ascii_case(k))
229+
.any(|name| name.eq(k.as_str()))
231230
})
232231
.collect::<Vec<(String, String)>>();
233232

@@ -279,14 +278,14 @@ where
279278
self.max_sub_requests -= 1;
280279
}
281280

282-
let request = self
283-
.make_request(req)
284-
.map_err(|_| HttpError::RequestError)?;
285-
let res = self
286-
.client
287-
.request(request)
288-
.await
289-
.map_err(|_| HttpError::RequestError)?;
281+
let request = self.make_request(req).map_err(|error| {
282+
warn!(cause=?error, "making request to backend");
283+
HttpError::RequestError
284+
})?;
285+
let res = self.client.request(request).await.map_err(|error| {
286+
warn!(cause=?error, "sending request to backend");
287+
HttpError::RequestError
288+
})?;
290289

291290
let status = res.status().as_u16();
292291
let (parts, body) = res.into_parts();
@@ -311,7 +310,10 @@ where
311310
let body_bytes = body
312311
.collect()
313312
.await
314-
.map_err(|_| HttpError::RequestError)?
313+
.map_err(|error| {
314+
warn!(cause=?error, "receiving body from backend");
315+
HttpError::RequestError
316+
})?
315317
.to_bytes();
316318
let body = Some(body_bytes.to_vec());
317319

@@ -494,15 +496,14 @@ mod tests {
494496
.build(connector);
495497
let mut headers = HeaderMap::new();
496498
headers.insert("Server_name", claims::assert_ok!("server".try_into()));
497-
claims::assert_ok!(backend.propagate_headers(&headers));
499+
claims::assert_ok!(backend.propagate_headers(headers));
498500
let req = Request {
499501
method: Method::Get,
500502
uri: "http://example.com/path".to_string(),
501503
headers: vec![("header01".to_string(), "01".to_string())],
502504
body: None,
503505
};
504506
let res = claims::assert_ok!(backend.send_request(req).await);
505-
let res = claims::assert_ok!(res);
506507
assert_eq!(http::StatusCode::OK, res.status);
507508
}
508509

@@ -527,15 +528,14 @@ mod tests {
527528
.build(connector);
528529
let mut headers = HeaderMap::new();
529530
headers.insert("Server_name", claims::assert_ok!("server".try_into()));
530-
claims::assert_ok!(backend.propagate_headers(&headers));
531+
claims::assert_ok!(backend.propagate_headers(headers));
531532
let req = Request {
532533
method: Method::Get,
533534
uri: "http://example.com/path".to_string(),
534535
headers: vec![("header01".to_string(), "01".to_string())],
535536
body: None,
536537
};
537538
let res = claims::assert_ok!(backend.send_request(req).await);
538-
let res = claims::assert_ok!(res);
539539
assert_eq!(http::StatusCode::REQUEST_TIMEOUT, res.status);
540540
}
541541

@@ -560,7 +560,7 @@ mod tests {
560560
.build(connector);
561561
let mut headers = HeaderMap::new();
562562
headers.insert("Server_name", claims::assert_ok!("server".try_into()));
563-
claims::assert_ok!(backend.propagate_headers(&headers));
563+
claims::assert_ok!(backend.propagate_headers(headers));
564564
let req = Request {
565565
method: Method::Get,
566566
uri: "/path".to_string(),
@@ -571,7 +571,6 @@ mod tests {
571571
body: None,
572572
};
573573
let res = claims::assert_ok!(backend.send_request(req).await);
574-
let res = claims::assert_ok!(res);
575574
assert_eq!(http::StatusCode::OK, res.status);
576575
}
577576

@@ -599,7 +598,6 @@ mod tests {
599598
body: None,
600599
};
601600
let res = claims::assert_ok!(backend.send_request(req).await);
602-
let res = claims::assert_ok!(res);
603601
assert_eq!(http::StatusCode::OK, res.status);
604602
}
605603

@@ -623,7 +621,7 @@ mod tests {
623621
.build(connector);
624622
let mut headers = HeaderMap::new();
625623
headers.insert("Server_name", claims::assert_ok!("server".try_into()));
626-
claims::assert_ok!(backend.propagate_headers(&headers));
624+
claims::assert_ok!(backend.propagate_headers(headers));
627625
let req = Request {
628626
method: Method::Get,
629627
uri: "http://rust-lang.org".to_string(),
@@ -638,7 +636,6 @@ mod tests {
638636
body: None,
639637
};
640638
let res = claims::assert_ok!(backend.send_request(req).await);
641-
let res = claims::assert_ok!(res);
642639
assert_eq!(http::StatusCode::OK, res.status);
643640
}
644641

@@ -661,7 +658,7 @@ mod tests {
661658
let connector = builder.build();
662659
let mut backend =
663660
Backend::<mock_http_connector::Connector>::builder(BackendStrategy::FastEdge)
664-
.propagate_headers_names(vec!["Propagate-Header".to_string()])
661+
.propagate_headers_names(vec!["Propagate-Header".parse().unwrap()])
665662
.build(connector);
666663
let mut headers = HeaderMap::new();
667664
headers.insert("Server_name", claims::assert_ok!("server".try_into()));
@@ -670,15 +667,14 @@ mod tests {
670667
claims::assert_ok!("VALUE".try_into()),
671668
);
672669
headers.insert("Propagate-Header", claims::assert_ok!("VALUE".try_into()));
673-
claims::assert_ok!(backend.propagate_headers(&headers));
670+
claims::assert_ok!(backend.propagate_headers(headers));
674671
let req = Request {
675672
method: Method::Get,
676673
uri: "http://example.com".to_string(),
677674
headers: vec![("header01".to_string(), "01".to_string())],
678675
body: None,
679676
};
680677
let res = claims::assert_ok!(backend.send_request(req).await);
681-
let res = claims::assert_ok!(res);
682678
assert_eq!(http::StatusCode::OK, res.status);
683679
}
684680

@@ -700,21 +696,20 @@ mod tests {
700696
let connector = builder.build();
701697
let mut backend =
702698
Backend::<mock_http_connector::Connector>::builder(BackendStrategy::FastEdge)
703-
.propagate_headers_names(vec!["Propagate-Header".to_string()])
699+
.propagate_headers_names(vec!["Propagate-Header".parse().unwrap()])
704700
.uri(assert_ok!("http://be.server/backend_path/".parse()))
705701
.build(connector);
706702
let mut headers = HeaderMap::new();
707703
headers.insert("Server_name", claims::assert_ok!("server".try_into()));
708704

709-
claims::assert_ok!(backend.propagate_headers(&headers));
705+
claims::assert_ok!(backend.propagate_headers(headers));
710706
let req = Request {
711707
method: Method::Get,
712708
uri: "http://example.com/path/".to_string(),
713709
headers: vec![("header01".to_string(), "01".to_string())],
714710
body: None,
715711
};
716712
let res = claims::assert_ok!(backend.send_request(req).await);
717-
let res = claims::assert_ok!(res);
718713
assert_eq!(http::StatusCode::OK, res.status);
719714
}
720715

@@ -736,29 +731,26 @@ mod tests {
736731
let connector = builder.build();
737732
let mut backend =
738733
Backend::<mock_http_connector::Connector>::builder(BackendStrategy::FastEdge)
739-
.propagate_headers_names(vec!["Propagate-Header".to_string()])
734+
.propagate_headers_names(vec!["Propagate-Header".parse().unwrap()])
740735
.max_sub_requests(2)
741736
.build(connector);
742737
let mut headers = HeaderMap::new();
743738
headers.insert("Server_name", claims::assert_ok!("server".try_into()));
744739

745-
claims::assert_ok!(backend.propagate_headers(&headers));
740+
claims::assert_ok!(backend.propagate_headers(headers));
746741
let req = Request {
747742
method: Method::Get,
748743
uri: "http://example.com/".to_string(),
749744
headers: vec![("header01".to_string(), "01".to_string())],
750745
body: None,
751746
};
752747
let res = claims::assert_ok!(backend.send_request(req.clone()).await);
753-
let res = claims::assert_ok!(res);
754748
assert_eq!(http::StatusCode::OK, res.status);
755749

756750
let res = claims::assert_ok!(backend.send_request(req.clone()).await);
757-
let res = claims::assert_ok!(res);
758751
assert_eq!(http::StatusCode::OK, res.status);
759752

760-
let res = claims::assert_ok!(backend.send_request(req).await);
761-
let res = claims::assert_err!(res);
762-
assert_eq!("too-many-requests", res.name());
753+
let error = claims::assert_err!(backend.send_request(req).await);
754+
assert_eq!("too-many-requests", error.name());
763755
}
764756
}

crates/http-service/src/executor/wasi_http.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ use http_body_util::{BodyExt, Full};
1313
use hyper::body::Body;
1414
use runtime::{store::StoreBuilder, InstancePre};
1515
use secret::{Secret, SecretStrategy};
16-
use smol_str::ToSmolStr;
1716
use wasmtime_wasi_http::bindings::http::types::Scheme;
1817
use wasmtime_wasi_http::bindings::ProxyPre;
1918
use wasmtime_wasi_http::{body::HyperOutgoingBody, WasiHttpView};
@@ -88,7 +87,7 @@ where
8887
.headers
8988
.iter()
9089
.filter_map(|(k, v)| {
91-
if propagate_header_names.contains(&k.to_smolstr()) {
90+
if propagate_header_names.contains(k) {
9291
Some((k.to_owned(), v.to_owned()))
9392
} else {
9493
None

crates/http-service/src/state.rs

+2-4
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,13 @@ use http::{header, HeaderMap, HeaderName, Uri};
66
use http_backend::Backend;
77
use runtime::BackendRequest;
88
use secret::{Secret, SecretStrategy};
9-
use smol_str::{SmolStr, ToSmolStr};
109
use tracing::instrument;
1110

1211
pub struct HttpState<C, T: SecretStrategy> {
1312
pub(super) http_backend: Backend<C>,
1413
pub(super) uri: Uri,
1514
pub(super) propagate_headers: HeaderMap,
16-
pub(super) propagate_header_names: Vec<SmolStr>,
15+
pub(super) propagate_header_names: Vec<HeaderName>,
1716
pub(super) dictionary: Dictionary,
1817
pub(super) secret: Secret<T>,
1918
}
@@ -59,8 +58,7 @@ impl<C, T: SecretStrategy> BackendRequest for HttpState<C, T> {
5958
.into_iter()
6059
.filter_map(|(k, v)| k.map(|k| (k, v)))
6160
.filter(|(k, _)| {
62-
!FILTER_HEADERS.contains(k)
63-
&& !self.propagate_header_names.contains(&k.to_smolstr())
61+
!FILTER_HEADERS.contains(k) && !self.propagate_header_names.contains(k)
6462
})
6563
.collect::<HeaderMap>();
6664

src/main.rs

+6-1
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,12 @@ async fn main() -> anyhow::Result<()> {
108108
let mut builder =
109109
Backend::<HttpsConnector<HttpConnector>>::builder(BackendStrategy::Direct);
110110

111-
builder.propagate_headers_names(run.propagate_headers);
111+
builder.propagate_headers_names(
112+
run.propagate_headers
113+
.into_iter()
114+
.filter_map(|h| h.parse().ok())
115+
.collect(),
116+
);
112117

113118
let backend = builder.build(backend_connector);
114119
let mut secrets = vec![];

0 commit comments

Comments
 (0)