1
1
#[ allow( unused_imports) ]
2
2
use http:: header:: HeaderName ;
3
3
4
- mod sealed {
5
- #[ allow( unreachable_pub, unused) ]
6
- pub trait Sealed < R > { }
7
- }
8
-
9
4
/// Extension trait that adds methods to any [`Service`] for adding middleware from
10
5
/// tower-http.
11
6
///
12
7
/// [`Service`]: tower::Service
13
8
#[ cfg( feature = "util" ) ]
14
9
// ^ work around rustdoc not inferring doc(cfg)s for cfg's from surrounding scopes
15
- pub trait ServiceExt < R > : sealed :: Sealed < R > + tower :: Service < R > + Sized {
10
+ pub trait ServiceExt {
16
11
/// Propagate a header from the request to the response.
17
12
///
18
13
/// See [`tower_http::propagate_header`] for more details.
19
14
///
20
15
/// [`tower_http::propagate_header`]: crate::propagate_header
21
16
#[ cfg( feature = "propagate-header" ) ]
22
- fn propagate_header (
23
- self ,
24
- header : HeaderName ,
25
- ) -> crate :: propagate_header :: PropagateHeader < Self > {
17
+ fn propagate_header ( self , header : HeaderName ) -> crate :: propagate_header :: PropagateHeader < Self >
18
+ where
19
+ Self : Sized ,
20
+ {
26
21
crate :: propagate_header:: PropagateHeader :: new ( self , header)
27
22
}
28
23
@@ -33,7 +28,10 @@ pub trait ServiceExt<R>: sealed::Sealed<R> + tower::Service<R> + Sized {
33
28
/// [`tower_http::add_extension`]: crate::add_extension
34
29
/// [request extensions]: https://docs.rs/http/latest/http/struct.Extensions.html
35
30
#[ cfg( feature = "add-extension" ) ]
36
- fn add_extension < T > ( self , value : T ) -> crate :: add_extension:: AddExtension < Self , T > {
31
+ fn add_extension < T > ( self , value : T ) -> crate :: add_extension:: AddExtension < Self , T >
32
+ where
33
+ Self : Sized ,
34
+ {
37
35
crate :: add_extension:: AddExtension :: new ( self , value)
38
36
}
39
37
@@ -43,7 +41,10 @@ pub trait ServiceExt<R>: sealed::Sealed<R> + tower::Service<R> + Sized {
43
41
///
44
42
/// [`tower_http::map_request_body`]: crate::map_request_body
45
43
#[ cfg( feature = "map-request-body" ) ]
46
- fn map_request_body < F > ( self , f : F ) -> crate :: map_request_body:: MapRequestBody < Self , F > {
44
+ fn map_request_body < F > ( self , f : F ) -> crate :: map_request_body:: MapRequestBody < Self , F >
45
+ where
46
+ Self : Sized ,
47
+ {
47
48
crate :: map_request_body:: MapRequestBody :: new ( self , f)
48
49
}
49
50
@@ -53,7 +54,10 @@ pub trait ServiceExt<R>: sealed::Sealed<R> + tower::Service<R> + Sized {
53
54
///
54
55
/// [`tower_http::map_response_body`]: crate::map_response_body
55
56
#[ cfg( feature = "map-response-body" ) ]
56
- fn map_response_body < F > ( self , f : F ) -> crate :: map_response_body:: MapResponseBody < Self , F > {
57
+ fn map_response_body < F > ( self , f : F ) -> crate :: map_response_body:: MapResponseBody < Self , F >
58
+ where
59
+ Self : Sized ,
60
+ {
57
61
crate :: map_response_body:: MapResponseBody :: new ( self , f)
58
62
}
59
63
@@ -68,7 +72,10 @@ pub trait ServiceExt<R>: sealed::Sealed<R> + tower::Service<R> + Sized {
68
72
feature = "compression-gzip" ,
69
73
feature = "compression-zstd" ,
70
74
) ) ]
71
- fn compression ( self ) -> crate :: compression:: Compression < Self > {
75
+ fn compression ( self ) -> crate :: compression:: Compression < Self >
76
+ where
77
+ Self : Sized ,
78
+ {
72
79
crate :: compression:: Compression :: new ( self )
73
80
}
74
81
@@ -83,7 +90,10 @@ pub trait ServiceExt<R>: sealed::Sealed<R> + tower::Service<R> + Sized {
83
90
feature = "decompression-gzip" ,
84
91
feature = "decompression-zstd" ,
85
92
) ) ]
86
- fn decompression ( self ) -> crate :: decompression:: Decompression < Self > {
93
+ fn decompression ( self ) -> crate :: decompression:: Decompression < Self >
94
+ where
95
+ Self : Sized ,
96
+ {
87
97
crate :: decompression:: Decompression :: new ( self )
88
98
}
89
99
@@ -97,7 +107,10 @@ pub trait ServiceExt<R>: sealed::Sealed<R> + tower::Service<R> + Sized {
97
107
/// [`tower_http::trace`]: crate::trace
98
108
/// [`TraceLayer`]: crate::trace::TraceLayer
99
109
#[ cfg( feature = "trace" ) ]
100
- fn trace_for_http ( self ) -> crate :: trace:: Trace < Self , crate :: trace:: HttpMakeClassifier > {
110
+ fn trace_for_http ( self ) -> crate :: trace:: Trace < Self , crate :: trace:: HttpMakeClassifier >
111
+ where
112
+ Self : Sized ,
113
+ {
101
114
crate :: trace:: Trace :: new_for_http ( self )
102
115
}
103
116
@@ -111,7 +124,10 @@ pub trait ServiceExt<R>: sealed::Sealed<R> + tower::Service<R> + Sized {
111
124
/// [`tower_http::trace`]: crate::trace
112
125
/// [`TraceLayer`]: crate::trace::TraceLayer
113
126
#[ cfg( feature = "trace" ) ]
114
- fn trace_for_grpc ( self ) -> crate :: trace:: Trace < Self , crate :: trace:: GrpcMakeClassifier > {
127
+ fn trace_for_grpc ( self ) -> crate :: trace:: Trace < Self , crate :: trace:: GrpcMakeClassifier >
128
+ where
129
+ Self : Sized ,
130
+ {
115
131
crate :: trace:: Trace :: new_for_grpc ( self )
116
132
}
117
133
@@ -125,6 +141,8 @@ pub trait ServiceExt<R>: sealed::Sealed<R> + tower::Service<R> + Sized {
125
141
fn follow_redirects (
126
142
self ,
127
143
) -> crate :: follow_redirect:: FollowRedirect < Self , crate :: follow_redirect:: policy:: Standard >
144
+ where
145
+ Self : Sized ,
128
146
{
129
147
crate :: follow_redirect:: FollowRedirect :: new ( self )
130
148
}
@@ -139,7 +157,10 @@ pub trait ServiceExt<R>: sealed::Sealed<R> + tower::Service<R> + Sized {
139
157
fn sensitive_headers (
140
158
self ,
141
159
headers : impl IntoIterator < Item = HeaderName > ,
142
- ) -> crate :: sensitive_headers:: SetSensitiveHeaders < Self > {
160
+ ) -> crate :: sensitive_headers:: SetSensitiveHeaders < Self >
161
+ where
162
+ Self : Sized ,
163
+ {
143
164
use tower_layer:: Layer as _;
144
165
crate :: sensitive_headers:: SetSensitiveHeadersLayer :: new ( headers) . layer ( self )
145
166
}
@@ -154,7 +175,10 @@ pub trait ServiceExt<R>: sealed::Sealed<R> + tower::Service<R> + Sized {
154
175
fn sensitive_request_headers (
155
176
self ,
156
177
headers : impl IntoIterator < Item = HeaderName > ,
157
- ) -> crate :: sensitive_headers:: SetSensitiveRequestHeaders < Self > {
178
+ ) -> crate :: sensitive_headers:: SetSensitiveRequestHeaders < Self >
179
+ where
180
+ Self : Sized ,
181
+ {
158
182
crate :: sensitive_headers:: SetSensitiveRequestHeaders :: new ( self , headers)
159
183
}
160
184
@@ -168,7 +192,10 @@ pub trait ServiceExt<R>: sealed::Sealed<R> + tower::Service<R> + Sized {
168
192
fn sensitive_response_headers (
169
193
self ,
170
194
headers : impl IntoIterator < Item = HeaderName > ,
171
- ) -> crate :: sensitive_headers:: SetSensitiveResponseHeaders < Self > {
195
+ ) -> crate :: sensitive_headers:: SetSensitiveResponseHeaders < Self >
196
+ where
197
+ Self : Sized ,
198
+ {
172
199
crate :: sensitive_headers:: SetSensitiveResponseHeaders :: new ( self , headers)
173
200
}
174
201
@@ -185,7 +212,10 @@ pub trait ServiceExt<R>: sealed::Sealed<R> + tower::Service<R> + Sized {
185
212
self ,
186
213
header_name : HeaderName ,
187
214
make : M ,
188
- ) -> crate :: set_header:: SetRequestHeader < Self , M > {
215
+ ) -> crate :: set_header:: SetRequestHeader < Self , M >
216
+ where
217
+ Self : Sized ,
218
+ {
189
219
crate :: set_header:: SetRequestHeader :: overriding ( self , header_name, make)
190
220
}
191
221
@@ -201,7 +231,10 @@ pub trait ServiceExt<R>: sealed::Sealed<R> + tower::Service<R> + Sized {
201
231
self ,
202
232
header_name : HeaderName ,
203
233
make : M ,
204
- ) -> crate :: set_header:: SetRequestHeader < Self , M > {
234
+ ) -> crate :: set_header:: SetRequestHeader < Self , M >
235
+ where
236
+ Self : Sized ,
237
+ {
205
238
crate :: set_header:: SetRequestHeader :: appending ( self , header_name, make)
206
239
}
207
240
@@ -215,7 +248,10 @@ pub trait ServiceExt<R>: sealed::Sealed<R> + tower::Service<R> + Sized {
215
248
self ,
216
249
header_name : HeaderName ,
217
250
make : M ,
218
- ) -> crate :: set_header:: SetRequestHeader < Self , M > {
251
+ ) -> crate :: set_header:: SetRequestHeader < Self , M >
252
+ where
253
+ Self : Sized ,
254
+ {
219
255
crate :: set_header:: SetRequestHeader :: if_not_present ( self , header_name, make)
220
256
}
221
257
@@ -232,7 +268,10 @@ pub trait ServiceExt<R>: sealed::Sealed<R> + tower::Service<R> + Sized {
232
268
self ,
233
269
header_name : HeaderName ,
234
270
make : M ,
235
- ) -> crate :: set_header:: SetResponseHeader < Self , M > {
271
+ ) -> crate :: set_header:: SetResponseHeader < Self , M >
272
+ where
273
+ Self : Sized ,
274
+ {
236
275
crate :: set_header:: SetResponseHeader :: overriding ( self , header_name, make)
237
276
}
238
277
@@ -248,7 +287,10 @@ pub trait ServiceExt<R>: sealed::Sealed<R> + tower::Service<R> + Sized {
248
287
self ,
249
288
header_name : HeaderName ,
250
289
make : M ,
251
- ) -> crate :: set_header:: SetResponseHeader < Self , M > {
290
+ ) -> crate :: set_header:: SetResponseHeader < Self , M >
291
+ where
292
+ Self : Sized ,
293
+ {
252
294
crate :: set_header:: SetResponseHeader :: appending ( self , header_name, make)
253
295
}
254
296
@@ -262,7 +304,10 @@ pub trait ServiceExt<R>: sealed::Sealed<R> + tower::Service<R> + Sized {
262
304
self ,
263
305
header_name : HeaderName ,
264
306
make : M ,
265
- ) -> crate :: set_header:: SetResponseHeader < Self , M > {
307
+ ) -> crate :: set_header:: SetResponseHeader < Self , M >
308
+ where
309
+ Self : Sized ,
310
+ {
266
311
crate :: set_header:: SetResponseHeader :: if_not_present ( self , header_name, make)
267
312
}
268
313
@@ -278,6 +323,7 @@ pub trait ServiceExt<R>: sealed::Sealed<R> + tower::Service<R> + Sized {
278
323
make_request_id : M ,
279
324
) -> crate :: request_id:: SetRequestId < Self , M >
280
325
where
326
+ Self : Sized ,
281
327
M : crate :: request_id:: MakeRequestId ,
282
328
{
283
329
crate :: request_id:: SetRequestId :: new ( self , header_name, make_request_id)
@@ -291,6 +337,7 @@ pub trait ServiceExt<R>: sealed::Sealed<R> + tower::Service<R> + Sized {
291
337
#[ cfg( feature = "request-id" ) ]
292
338
fn set_x_request_id < M > ( self , make_request_id : M ) -> crate :: request_id:: SetRequestId < Self , M >
293
339
where
340
+ Self : Sized ,
294
341
M : crate :: request_id:: MakeRequestId ,
295
342
{
296
343
self . set_request_id ( crate :: request_id:: X_REQUEST_ID , make_request_id)
@@ -305,7 +352,10 @@ pub trait ServiceExt<R>: sealed::Sealed<R> + tower::Service<R> + Sized {
305
352
fn propagate_request_id (
306
353
self ,
307
354
header_name : HeaderName ,
308
- ) -> crate :: request_id:: PropagateRequestId < Self > {
355
+ ) -> crate :: request_id:: PropagateRequestId < Self >
356
+ where
357
+ Self : Sized ,
358
+ {
309
359
crate :: request_id:: PropagateRequestId :: new ( self , header_name)
310
360
}
311
361
@@ -315,7 +365,10 @@ pub trait ServiceExt<R>: sealed::Sealed<R> + tower::Service<R> + Sized {
315
365
///
316
366
/// [`tower_http::request_id`]: crate::request_id
317
367
#[ cfg( feature = "request-id" ) ]
318
- fn propagate_x_request_id ( self ) -> crate :: request_id:: PropagateRequestId < Self > {
368
+ fn propagate_x_request_id ( self ) -> crate :: request_id:: PropagateRequestId < Self >
369
+ where
370
+ Self : Sized ,
371
+ {
319
372
self . propagate_request_id ( crate :: request_id:: X_REQUEST_ID )
320
373
}
321
374
@@ -327,7 +380,10 @@ pub trait ServiceExt<R>: sealed::Sealed<R> + tower::Service<R> + Sized {
327
380
#[ cfg( feature = "catch-panic" ) ]
328
381
fn catch_panic (
329
382
self ,
330
- ) -> crate :: catch_panic:: CatchPanic < Self , crate :: catch_panic:: DefaultResponseForPanic > {
383
+ ) -> crate :: catch_panic:: CatchPanic < Self , crate :: catch_panic:: DefaultResponseForPanic >
384
+ where
385
+ Self : Sized ,
386
+ {
331
387
crate :: catch_panic:: CatchPanic :: new ( self )
332
388
}
333
389
@@ -338,7 +394,10 @@ pub trait ServiceExt<R>: sealed::Sealed<R> + tower::Service<R> + Sized {
338
394
///
339
395
/// [`tower_http::limit`]: crate::limit
340
396
#[ cfg( feature = "limit" ) ]
341
- fn request_body_limit ( self , limit : usize ) -> crate :: limit:: RequestBodyLimit < Self > {
397
+ fn request_body_limit ( self , limit : usize ) -> crate :: limit:: RequestBodyLimit < Self >
398
+ where
399
+ Self : Sized ,
400
+ {
342
401
crate :: limit:: RequestBodyLimit :: new ( self , limit)
343
402
}
344
403
@@ -348,10 +407,23 @@ pub trait ServiceExt<R>: sealed::Sealed<R> + tower::Service<R> + Sized {
348
407
///
349
408
/// [`tower_http::normalize_path`]: crate::normalize_path
350
409
#[ cfg( feature = "normalize-path" ) ]
351
- fn trim_trailing_slash ( self ) -> crate :: normalize_path:: NormalizePath < Self > {
410
+ fn trim_trailing_slash ( self ) -> crate :: normalize_path:: NormalizePath < Self >
411
+ where
412
+ Self : Sized ,
413
+ {
352
414
crate :: normalize_path:: NormalizePath :: trim_trailing_slash ( self )
353
415
}
354
416
}
355
417
356
- impl < R , T > sealed:: Sealed < R > for T where T : tower:: Service < R > { }
357
- impl < R , T > ServiceExt < R > for T where T : tower:: Service < R > { }
418
+ impl < T > ServiceExt for T { }
419
+
420
+ #[ cfg( all( test, feature = "fs" , feature = "add-extension" ) ) ]
421
+ mod tests {
422
+ use super :: ServiceExt ;
423
+ use crate :: services;
424
+
425
+ #[ allow( dead_code) ]
426
+ fn test_type_inference ( ) {
427
+ let _svc = services:: fs:: ServeDir :: new ( "." ) . add_extension ( "&'static str" ) ;
428
+ }
429
+ }
0 commit comments