Skip to content

Commit 8106280

Browse files
authored
Make the router HTTP-agnostic (#394)
There's nothing HTTP-specific about the router. This change moves the layer implementations--which unnecessarily enforce HTTP-specific type requirements--into the generic router crate, relaxing its type constraints.
1 parent 519420e commit 8106280

File tree

10 files changed

+79
-80
lines changed

10 files changed

+79
-80
lines changed

Cargo.lock

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1035,13 +1035,14 @@ version = "0.1.0"
10351035
dependencies = [
10361036
"futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)",
10371037
"indexmap 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
1038-
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
1038+
"linkerd2-error 0.1.0",
10391039
"tokio 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)",
10401040
"tokio-sync 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
10411041
"tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
1042+
"tower 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
10421043
"tower-load-shed 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
1043-
"tower-service 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
10441044
"tracing 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
1045+
"tracing-futures 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
10451046
]
10461047

10471048
[[package]]

linkerd/app/core/src/errors.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ where
116116

117117
fn map_err_to_5xx(e: Error) -> StatusCode {
118118
use crate::proxy::buffer;
119-
use crate::proxy::http::router::error as router;
119+
use linkerd2_router::error as router;
120120
use tower::load_shed::error as shed;
121121

122122
if let Some(ref c) = e.downcast_ref::<router::NoCapacity>() {

linkerd/app/core/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ pub use linkerd2_metrics as metrics;
1818
pub use linkerd2_opencensus as opencensus;
1919
pub use linkerd2_reconnect as reconnect;
2020
pub use linkerd2_request_filter as request_filter;
21+
pub use linkerd2_router as router;
2122
pub use linkerd2_trace_context as trace_context;
2223

2324
pub mod accept_error;

linkerd/app/inbound/src/endpoint.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,8 @@ use linkerd2_app_core::{
44
classify,
55
dst::{DstAddr, Route},
66
metric_labels::EndpointLabels,
7-
proxy::{
8-
http::{router, settings},
9-
identity, tap,
10-
},
7+
proxy::{http::settings, identity, tap},
8+
router,
119
transport::{connect, tls},
1210
Conditional, NameAddr,
1311
};
@@ -156,7 +154,8 @@ mod tests {
156154
use super::{Endpoint, RecognizeEndpoint};
157155
use http;
158156
use linkerd2_app_core::{
159-
proxy::http::{router::Recognize, Settings},
157+
proxy::http::Settings,
158+
router::Recognize,
160159
transport::{listen, tls},
161160
Conditional,
162161
};

linkerd/app/inbound/src/lib.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,14 @@ use linkerd2_app_core::{
1717
proxy::{
1818
self,
1919
http::{
20-
client, insert, metrics as http_metrics, normalize_uri, profiles, router, settings,
20+
client, insert, metrics as http_metrics, normalize_uri, profiles, settings,
2121
strip_header,
2222
},
2323
identity,
2424
server::{Protocol as ServerProtocol, Server},
2525
tap, tcp,
2626
},
27-
reconnect, serve,
27+
reconnect, router, serve,
2828
spans::SpanConverter,
2929
svc, trace, trace_context,
3030
transport::{self, connect, tls, OrigDstAddr, SysOrigDstAddr},
@@ -138,7 +138,7 @@ impl<A: OrigDstAddr> Config<A> {
138138
))
139139
.push_buffer_pending(buffer.max_in_flight, DispatchDeadline::extract)
140140
.makes::<Endpoint>()
141-
.push(router::layer(
141+
.push(router::Layer::new(
142142
router::Config::new(router_capacity, router_max_idle_age),
143143
RecognizeEndpoint::default(),
144144
))
@@ -194,7 +194,7 @@ impl<A: OrigDstAddr> Config<A> {
194194
// address is used.
195195
let dst_router = dst_stack
196196
.push_buffer_pending(buffer.max_in_flight, DispatchDeadline::extract)
197-
.push(router::layer(
197+
.push(router::Layer::new(
198198
router::Config::new(router_capacity, router_max_idle_age),
199199
|req: &http::Request<_>| {
200200
let dst = req

linkerd/app/outbound/src/lib.rs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,13 @@ use linkerd2_app_core::{
2020
discover,
2121
http::{
2222
balance, canonicalize, client, fallback, header_from_target, insert,
23-
metrics as http_metrics, normalize_uri, profiles, retry, router, settings,
24-
strip_header,
23+
metrics as http_metrics, normalize_uri, profiles, retry, settings, strip_header,
2524
},
2625
identity,
2726
resolve::map_endpoint,
2827
tap, tcp, Server,
2928
},
30-
reconnect, serve,
29+
reconnect, router, serve,
3130
spans::SpanConverter,
3231
svc, trace, trace_context,
3332
transport::{self, connect, tls, OrigDstAddr, SysOrigDstAddr},
@@ -204,7 +203,7 @@ impl<A: OrigDstAddr> Config<A> {
204203
// used as the server name when connecting to the endpoint.
205204
let orig_dst_router_layer = svc::layers()
206205
.push_buffer_pending(buffer.max_in_flight, DispatchDeadline::extract)
207-
.push(router::layer(
206+
.push(router::Layer::new(
208207
router::Config::new(router_capacity, router_max_idle_age),
209208
Endpoint::from_request,
210209
));
@@ -251,7 +250,7 @@ impl<A: OrigDstAddr> Config<A> {
251250
|dst: &DstAddr| info_span!("logical", dst.logical = %dst.dst_logical()),
252251
))
253252
.push_buffer_pending(buffer.max_in_flight, DispatchDeadline::extract)
254-
.push(router::layer(
253+
.push(router::Layer::new(
255254
router::Config::new(router_capacity, router_max_idle_age),
256255
|req: &http::Request<_>| {
257256
req.extensions().get::<Addr>().cloned().map(|addr| {
@@ -289,7 +288,7 @@ impl<A: OrigDstAddr> Config<A> {
289288
.push(insert::target::layer())
290289
.push(trace::layer(|addr: &Addr| info_span!("addr", %addr)))
291290
.push_buffer_pending(buffer.max_in_flight, DispatchDeadline::extract)
292-
.push(router::layer(
291+
.push(router::Layer::new(
293292
router::Config::new(router_capacity, router_max_idle_age),
294293
|req: &http::Request<_>| {
295294
http_request_l5d_override_dst_addr(req)

linkerd/proxy/http/src/lib.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ pub mod normalize_uri;
2020
pub mod orig_proto;
2121
pub mod profiles;
2222
pub mod retry;
23-
pub mod router;
2423
pub mod settings;
2524
pub mod strip_header;
2625
pub mod timeout;

linkerd/router/Cargo.toml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,11 @@ publish = false
88
[dependencies]
99
futures = "0.1"
1010
indexmap = "1.0.0"
11-
log = "0.4"
11+
linkerd2-error = { path = "../error" }
1212
tower-load-shed = "0.1"
1313
tokio = "0.1.20"
1414
tokio-sync = "0.1.6"
1515
tokio-timer = "0.2.4"
16-
tower-service = "0.2"
16+
tower = "0.1"
1717
tracing = "0.1.2"
18+
tracing-futures = "0.1"

linkerd/proxy/http/src/router.rs renamed to linkerd/router/src/layer.rs

Lines changed: 28 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
1+
use crate::{Recognize, Router};
12
use futures::Poll;
2-
use http;
33
use linkerd2_error::{Error, Never};
4-
use linkerd2_router as rt;
5-
pub use linkerd2_router::{error, Recognize, Router};
64
use std::marker::PhantomData;
75
use std::time::Duration;
86
use tracing::{info_span, trace};
@@ -27,7 +25,7 @@ pub struct Layer<Req, Rec: Recognize<Req>> {
2725
}
2826

2927
#[derive(Debug)]
30-
pub struct Stack<Req, Rec: Recognize<Req>, Mk> {
28+
pub struct Make<Req, Rec: Recognize<Req>, Mk> {
3129
config: Config,
3230
recognize: Rec,
3331
inner: Mk,
@@ -37,7 +35,7 @@ pub struct Stack<Req, Rec: Recognize<Req>, Mk> {
3735
pub struct Service<Req, Rec, Mk>
3836
where
3937
Rec: Recognize<Req>,
40-
Mk: rt::Make<Rec::Target>,
38+
Mk: super::Make<Rec::Target>,
4139
Mk::Value: tower::Service<Req>,
4240
{
4341
inner: Router<Req, Rec, Mk>,
@@ -56,29 +54,30 @@ impl Config {
5654

5755
// === impl Layer ===
5856

59-
pub fn layer<Rec, Req>(config: Config, recognize: Rec) -> Layer<Req, Rec>
57+
impl<Req, Rec> Layer<Req, Rec>
6058
where
6159
Rec: Recognize<Req> + Clone + Send + Sync + 'static,
6260
{
63-
Layer {
64-
config,
65-
recognize,
66-
_p: PhantomData,
61+
pub fn new(config: Config, recognize: Rec) -> Self {
62+
Self {
63+
config,
64+
recognize,
65+
_p: PhantomData,
66+
}
6767
}
6868
}
6969

70-
impl<Req, Rec, Mk, B> tower::layer::Layer<Mk> for Layer<Req, Rec>
70+
impl<Req, Rec, Mk> tower::layer::Layer<Mk> for Layer<Req, Rec>
7171
where
7272
Rec: Recognize<Req> + Clone + Send + Sync + 'static,
73-
Mk: rt::Make<Rec::Target> + Clone + Send + Sync + 'static,
74-
Mk::Value: tower::Service<Req, Response = http::Response<B>> + Clone,
73+
Mk: super::Make<Rec::Target> + Clone + Send + Sync + 'static,
74+
Mk::Value: tower::Service<Req> + Clone,
7575
<Mk::Value as tower::Service<Req>>::Error: Into<Error>,
76-
B: Default + Send + 'static,
7776
{
78-
type Service = Stack<Req, Rec, Mk>;
77+
type Service = Make<Req, Rec, Mk>;
7978

8079
fn layer(&self, inner: Mk) -> Self::Service {
81-
Stack {
80+
Make {
8281
inner,
8382
config: self.config.clone(),
8483
recognize: self.recognize.clone(),
@@ -92,19 +91,18 @@ where
9291
Rec: Recognize<Req> + Clone + Send + Sync + 'static,
9392
{
9493
fn clone(&self) -> Self {
95-
layer(self.config.clone(), self.recognize.clone())
94+
Self::new(self.config.clone(), self.recognize.clone())
9695
}
9796
}
98-
// === impl Stack ===
97+
// === impl Make ===
9998

100-
impl<Req, Rec, Mk, B> Stack<Req, Rec, Mk>
99+
impl<Req, Rec, Mk> Make<Req, Rec, Mk>
101100
where
102101
Rec: Recognize<Req> + Clone + Send + Sync + 'static,
103102
<Rec as Recognize<Req>>::Target: Send + 'static,
104-
Mk: rt::Make<Rec::Target> + Clone + Send + Sync + 'static,
105-
Mk::Value: tower::Service<Req, Response = http::Response<B>> + Clone + Send + 'static,
103+
Mk: super::Make<Rec::Target> + Clone + Send + Sync + 'static,
104+
Mk::Value: tower::Service<Req> + Clone + Send + 'static,
106105
<Mk::Value as tower::Service<Req>>::Error: Into<Error>,
107-
B: Default + Send + 'static,
108106
{
109107
pub fn make(&self) -> Service<Req, Rec, Mk> {
110108
let (inner, cache_bg) = Router::new(
@@ -118,14 +116,13 @@ where
118116
}
119117
}
120118

121-
impl<Req, Rec, Mk, B, T> tower::Service<T> for Stack<Req, Rec, Mk>
119+
impl<Req, Rec, Mk, T> tower::Service<T> for Make<Req, Rec, Mk>
122120
where
123121
Rec: Recognize<Req> + Clone + Send + Sync + 'static,
124122
<Rec as Recognize<Req>>::Target: Send + 'static,
125-
Mk: rt::Make<Rec::Target> + Clone + Send + Sync + 'static,
126-
Mk::Value: tower::Service<Req, Response = http::Response<B>> + Clone + Send + 'static,
123+
Mk: super::Make<Rec::Target> + Clone + Send + Sync + 'static,
124+
Mk::Value: tower::Service<Req> + Clone + Send + 'static,
127125
<Mk::Value as tower::Service<Req>>::Error: Into<Error>,
128-
B: Default + Send + 'static,
129126
{
130127
type Response = Service<Req, Rec, Mk>;
131128
type Error = Never;
@@ -140,7 +137,7 @@ where
140137
}
141138
}
142139

143-
impl<Req, Rec, Mk> Clone for Stack<Req, Rec, Mk>
140+
impl<Req, Rec, Mk> Clone for Make<Req, Rec, Mk>
144141
where
145142
Rec: Recognize<Req> + Clone,
146143
Mk: Clone,
@@ -156,13 +153,12 @@ where
156153
}
157154
// === impl Service ===
158155

159-
impl<Req, Rec, Mk, B> tower::Service<Req> for Service<Req, Rec, Mk>
156+
impl<Req, Rec, Mk> tower::Service<Req> for Service<Req, Rec, Mk>
160157
where
161158
Rec: Recognize<Req> + Send + Sync + 'static,
162-
Mk: rt::Make<Rec::Target> + Clone + Send + Sync + 'static,
163-
Mk::Value: tower::Service<Req, Response = http::Response<B>> + Clone,
159+
Mk: super::Make<Rec::Target> + Clone + Send + Sync + 'static,
160+
Mk::Value: tower::Service<Req> + Clone,
164161
<Mk::Value as tower::Service<Req>>::Error: Into<Error>,
165-
B: Default + Send + 'static,
166162
{
167163
type Response = <Router<Req, Rec, Mk> as tower::Service<Req>>::Response;
168164
type Error = <Router<Req, Rec, Mk> as tower::Service<Req>>::Error;
@@ -181,7 +177,7 @@ where
181177
impl<Req, Rec, Mk> Clone for Service<Req, Rec, Mk>
182178
where
183179
Rec: Recognize<Req>,
184-
Mk: rt::Make<Rec::Target>,
180+
Mk: super::Make<Rec::Target>,
185181
Mk::Value: tower::Service<Req>,
186182
Router<Req, Rec, Mk>: Clone,
187183
{

0 commit comments

Comments
 (0)