1use tower::ServiceBuilder;
2
3#[allow(unused_imports)]
4use http::header::HeaderName;
5#[allow(unused_imports)]
6use tower_layer::Stack;
7
8#[cfg(feature = "util")]
41pub trait ServiceBuilderExt<L>: crate::sealed::Sealed<L> + Sized {
43 #[cfg(feature = "propagate-header")]
49 fn propagate_header(
50 self,
51 header: HeaderName,
52 ) -> ServiceBuilder<Stack<crate::propagate_header::PropagateHeaderLayer, L>>;
53
54 #[cfg(feature = "add-extension")]
61 fn add_extension<T>(
62 self,
63 value: T,
64 ) -> ServiceBuilder<Stack<crate::add_extension::AddExtensionLayer<T>, L>>;
65
66 #[cfg(feature = "map-request-body")]
72 fn map_request_body<F>(
73 self,
74 f: F,
75 ) -> ServiceBuilder<Stack<crate::map_request_body::MapRequestBodyLayer<F>, L>>;
76
77 #[cfg(feature = "map-response-body")]
83 fn map_response_body<F>(
84 self,
85 f: F,
86 ) -> ServiceBuilder<Stack<crate::map_response_body::MapResponseBodyLayer<F>, L>>;
87
88 #[cfg(any(
94 feature = "compression-br",
95 feature = "compression-deflate",
96 feature = "compression-gzip",
97 feature = "compression-zstd",
98 ))]
99 fn compression(self) -> ServiceBuilder<Stack<crate::compression::CompressionLayer, L>>;
100
101 #[cfg(any(
107 feature = "decompression-br",
108 feature = "decompression-deflate",
109 feature = "decompression-gzip",
110 feature = "decompression-zstd",
111 ))]
112 fn decompression(self) -> ServiceBuilder<Stack<crate::decompression::DecompressionLayer, L>>;
113
114 #[cfg(feature = "trace")]
124 fn trace_for_http(
125 self,
126 ) -> ServiceBuilder<Stack<crate::trace::TraceLayer<crate::trace::HttpMakeClassifier>, L>>;
127
128 #[cfg(feature = "trace")]
138 fn trace_for_grpc(
139 self,
140 ) -> ServiceBuilder<Stack<crate::trace::TraceLayer<crate::trace::GrpcMakeClassifier>, L>>;
141
142 #[cfg(feature = "follow-redirect")]
149 fn follow_redirects(
150 self,
151 ) -> ServiceBuilder<
152 Stack<
153 crate::follow_redirect::FollowRedirectLayer<crate::follow_redirect::policy::Standard>,
154 L,
155 >,
156 >;
157
158 #[cfg(feature = "sensitive-headers")]
165 fn sensitive_headers<I>(
166 self,
167 headers: I,
168 ) -> ServiceBuilder<Stack<crate::sensitive_headers::SetSensitiveHeadersLayer, L>>
169 where
170 I: IntoIterator<Item = HeaderName>;
171
172 #[cfg(feature = "sensitive-headers")]
179 fn sensitive_request_headers(
180 self,
181 headers: std::sync::Arc<[HeaderName]>,
182 ) -> ServiceBuilder<Stack<crate::sensitive_headers::SetSensitiveRequestHeadersLayer, L>>;
183
184 #[cfg(feature = "sensitive-headers")]
191 fn sensitive_response_headers(
192 self,
193 headers: std::sync::Arc<[HeaderName]>,
194 ) -> ServiceBuilder<Stack<crate::sensitive_headers::SetSensitiveResponseHeadersLayer, L>>;
195
196 #[cfg(feature = "set-header")]
205 fn override_request_header<M>(
206 self,
207 header_name: HeaderName,
208 make: M,
209 ) -> ServiceBuilder<Stack<crate::set_header::SetRequestHeaderLayer<M>, L>>;
210
211 #[cfg(feature = "set-header")]
219 fn append_request_header<M>(
220 self,
221 header_name: HeaderName,
222 make: M,
223 ) -> ServiceBuilder<Stack<crate::set_header::SetRequestHeaderLayer<M>, L>>;
224
225 #[cfg(feature = "set-header")]
231 fn insert_request_header_if_not_present<M>(
232 self,
233 header_name: HeaderName,
234 make: M,
235 ) -> ServiceBuilder<Stack<crate::set_header::SetRequestHeaderLayer<M>, L>>;
236
237 #[cfg(feature = "set-header")]
246 fn override_response_header<M>(
247 self,
248 header_name: HeaderName,
249 make: M,
250 ) -> ServiceBuilder<Stack<crate::set_header::SetResponseHeaderLayer<M>, L>>;
251
252 #[cfg(feature = "set-header")]
260 fn append_response_header<M>(
261 self,
262 header_name: HeaderName,
263 make: M,
264 ) -> ServiceBuilder<Stack<crate::set_header::SetResponseHeaderLayer<M>, L>>;
265
266 #[cfg(feature = "set-header")]
272 fn insert_response_header_if_not_present<M>(
273 self,
274 header_name: HeaderName,
275 make: M,
276 ) -> ServiceBuilder<Stack<crate::set_header::SetResponseHeaderLayer<M>, L>>;
277
278 #[cfg(feature = "request-id")]
284 fn set_request_id<M>(
285 self,
286 header_name: HeaderName,
287 make_request_id: M,
288 ) -> ServiceBuilder<Stack<crate::request_id::SetRequestIdLayer<M>, L>>
289 where
290 M: crate::request_id::MakeRequestId;
291
292 #[cfg(feature = "request-id")]
298 fn set_x_request_id<M>(
299 self,
300 make_request_id: M,
301 ) -> ServiceBuilder<Stack<crate::request_id::SetRequestIdLayer<M>, L>>
302 where
303 M: crate::request_id::MakeRequestId,
304 {
305 self.set_request_id(
306 HeaderName::from_static(crate::request_id::X_REQUEST_ID),
307 make_request_id,
308 )
309 }
310
311 #[cfg(feature = "request-id")]
317 fn propagate_request_id(
318 self,
319 header_name: HeaderName,
320 ) -> ServiceBuilder<Stack<crate::request_id::PropagateRequestIdLayer, L>>;
321
322 #[cfg(feature = "request-id")]
328 fn propagate_x_request_id(
329 self,
330 ) -> ServiceBuilder<Stack<crate::request_id::PropagateRequestIdLayer, L>> {
331 self.propagate_request_id(HeaderName::from_static(crate::request_id::X_REQUEST_ID))
332 }
333
334 #[cfg(feature = "catch-panic")]
340 fn catch_panic(
341 self,
342 ) -> ServiceBuilder<
343 Stack<crate::catch_panic::CatchPanicLayer<crate::catch_panic::DefaultResponseForPanic>, L>,
344 >;
345
346 #[cfg(feature = "limit")]
353 fn request_body_limit(
354 self,
355 limit: usize,
356 ) -> ServiceBuilder<Stack<crate::limit::RequestBodyLimitLayer, L>>;
357
358 #[cfg(feature = "normalize-path")]
364 fn trim_trailing_slash(
365 self,
366 ) -> ServiceBuilder<Stack<crate::normalize_path::NormalizePathLayer, L>>;
367}
368
369impl<L> crate::sealed::Sealed<L> for ServiceBuilder<L> {}
370
371impl<L> ServiceBuilderExt<L> for ServiceBuilder<L> {
372 #[cfg(feature = "propagate-header")]
373 fn propagate_header(
374 self,
375 header: HeaderName,
376 ) -> ServiceBuilder<Stack<crate::propagate_header::PropagateHeaderLayer, L>> {
377 self.layer(crate::propagate_header::PropagateHeaderLayer::new(header))
378 }
379
380 #[cfg(feature = "add-extension")]
381 fn add_extension<T>(
382 self,
383 value: T,
384 ) -> ServiceBuilder<Stack<crate::add_extension::AddExtensionLayer<T>, L>> {
385 self.layer(crate::add_extension::AddExtensionLayer::new(value))
386 }
387
388 #[cfg(feature = "map-request-body")]
389 fn map_request_body<F>(
390 self,
391 f: F,
392 ) -> ServiceBuilder<Stack<crate::map_request_body::MapRequestBodyLayer<F>, L>> {
393 self.layer(crate::map_request_body::MapRequestBodyLayer::new(f))
394 }
395
396 #[cfg(feature = "map-response-body")]
397 fn map_response_body<F>(
398 self,
399 f: F,
400 ) -> ServiceBuilder<Stack<crate::map_response_body::MapResponseBodyLayer<F>, L>> {
401 self.layer(crate::map_response_body::MapResponseBodyLayer::new(f))
402 }
403
404 #[cfg(any(
405 feature = "compression-br",
406 feature = "compression-deflate",
407 feature = "compression-gzip",
408 feature = "compression-zstd",
409 ))]
410 fn compression(self) -> ServiceBuilder<Stack<crate::compression::CompressionLayer, L>> {
411 self.layer(crate::compression::CompressionLayer::new())
412 }
413
414 #[cfg(any(
415 feature = "decompression-br",
416 feature = "decompression-deflate",
417 feature = "decompression-gzip",
418 feature = "decompression-zstd",
419 ))]
420 fn decompression(self) -> ServiceBuilder<Stack<crate::decompression::DecompressionLayer, L>> {
421 self.layer(crate::decompression::DecompressionLayer::new())
422 }
423
424 #[cfg(feature = "trace")]
425 fn trace_for_http(
426 self,
427 ) -> ServiceBuilder<Stack<crate::trace::TraceLayer<crate::trace::HttpMakeClassifier>, L>> {
428 self.layer(crate::trace::TraceLayer::new_for_http())
429 }
430
431 #[cfg(feature = "trace")]
432 fn trace_for_grpc(
433 self,
434 ) -> ServiceBuilder<Stack<crate::trace::TraceLayer<crate::trace::GrpcMakeClassifier>, L>> {
435 self.layer(crate::trace::TraceLayer::new_for_grpc())
436 }
437
438 #[cfg(feature = "follow-redirect")]
439 fn follow_redirects(
440 self,
441 ) -> ServiceBuilder<
442 Stack<
443 crate::follow_redirect::FollowRedirectLayer<crate::follow_redirect::policy::Standard>,
444 L,
445 >,
446 > {
447 self.layer(crate::follow_redirect::FollowRedirectLayer::new())
448 }
449
450 #[cfg(feature = "sensitive-headers")]
451 fn sensitive_headers<I>(
452 self,
453 headers: I,
454 ) -> ServiceBuilder<Stack<crate::sensitive_headers::SetSensitiveHeadersLayer, L>>
455 where
456 I: IntoIterator<Item = HeaderName>,
457 {
458 self.layer(crate::sensitive_headers::SetSensitiveHeadersLayer::new(
459 headers,
460 ))
461 }
462
463 #[cfg(feature = "sensitive-headers")]
464 fn sensitive_request_headers(
465 self,
466 headers: std::sync::Arc<[HeaderName]>,
467 ) -> ServiceBuilder<Stack<crate::sensitive_headers::SetSensitiveRequestHeadersLayer, L>> {
468 self.layer(crate::sensitive_headers::SetSensitiveRequestHeadersLayer::from_shared(headers))
469 }
470
471 #[cfg(feature = "sensitive-headers")]
472 fn sensitive_response_headers(
473 self,
474 headers: std::sync::Arc<[HeaderName]>,
475 ) -> ServiceBuilder<Stack<crate::sensitive_headers::SetSensitiveResponseHeadersLayer, L>> {
476 self.layer(crate::sensitive_headers::SetSensitiveResponseHeadersLayer::from_shared(headers))
477 }
478
479 #[cfg(feature = "set-header")]
480 fn override_request_header<M>(
481 self,
482 header_name: HeaderName,
483 make: M,
484 ) -> ServiceBuilder<Stack<crate::set_header::SetRequestHeaderLayer<M>, L>> {
485 self.layer(crate::set_header::SetRequestHeaderLayer::overriding(
486 header_name,
487 make,
488 ))
489 }
490
491 #[cfg(feature = "set-header")]
492 fn append_request_header<M>(
493 self,
494 header_name: HeaderName,
495 make: M,
496 ) -> ServiceBuilder<Stack<crate::set_header::SetRequestHeaderLayer<M>, L>> {
497 self.layer(crate::set_header::SetRequestHeaderLayer::appending(
498 header_name,
499 make,
500 ))
501 }
502
503 #[cfg(feature = "set-header")]
504 fn insert_request_header_if_not_present<M>(
505 self,
506 header_name: HeaderName,
507 make: M,
508 ) -> ServiceBuilder<Stack<crate::set_header::SetRequestHeaderLayer<M>, L>> {
509 self.layer(crate::set_header::SetRequestHeaderLayer::if_not_present(
510 header_name,
511 make,
512 ))
513 }
514
515 #[cfg(feature = "set-header")]
516 fn override_response_header<M>(
517 self,
518 header_name: HeaderName,
519 make: M,
520 ) -> ServiceBuilder<Stack<crate::set_header::SetResponseHeaderLayer<M>, L>> {
521 self.layer(crate::set_header::SetResponseHeaderLayer::overriding(
522 header_name,
523 make,
524 ))
525 }
526
527 #[cfg(feature = "set-header")]
528 fn append_response_header<M>(
529 self,
530 header_name: HeaderName,
531 make: M,
532 ) -> ServiceBuilder<Stack<crate::set_header::SetResponseHeaderLayer<M>, L>> {
533 self.layer(crate::set_header::SetResponseHeaderLayer::appending(
534 header_name,
535 make,
536 ))
537 }
538
539 #[cfg(feature = "set-header")]
540 fn insert_response_header_if_not_present<M>(
541 self,
542 header_name: HeaderName,
543 make: M,
544 ) -> ServiceBuilder<Stack<crate::set_header::SetResponseHeaderLayer<M>, L>> {
545 self.layer(crate::set_header::SetResponseHeaderLayer::if_not_present(
546 header_name,
547 make,
548 ))
549 }
550
551 #[cfg(feature = "request-id")]
552 fn set_request_id<M>(
553 self,
554 header_name: HeaderName,
555 make_request_id: M,
556 ) -> ServiceBuilder<Stack<crate::request_id::SetRequestIdLayer<M>, L>>
557 where
558 M: crate::request_id::MakeRequestId,
559 {
560 self.layer(crate::request_id::SetRequestIdLayer::new(
561 header_name,
562 make_request_id,
563 ))
564 }
565
566 #[cfg(feature = "request-id")]
567 fn propagate_request_id(
568 self,
569 header_name: HeaderName,
570 ) -> ServiceBuilder<Stack<crate::request_id::PropagateRequestIdLayer, L>> {
571 self.layer(crate::request_id::PropagateRequestIdLayer::new(header_name))
572 }
573
574 #[cfg(feature = "catch-panic")]
575 fn catch_panic(
576 self,
577 ) -> ServiceBuilder<
578 Stack<crate::catch_panic::CatchPanicLayer<crate::catch_panic::DefaultResponseForPanic>, L>,
579 > {
580 self.layer(crate::catch_panic::CatchPanicLayer::new())
581 }
582
583 #[cfg(feature = "limit")]
584 fn request_body_limit(
585 self,
586 limit: usize,
587 ) -> ServiceBuilder<Stack<crate::limit::RequestBodyLimitLayer, L>> {
588 self.layer(crate::limit::RequestBodyLimitLayer::new(limit))
589 }
590
591 #[cfg(feature = "normalize-path")]
592 fn trim_trailing_slash(
593 self,
594 ) -> ServiceBuilder<Stack<crate::normalize_path::NormalizePathLayer, L>> {
595 self.layer(crate::normalize_path::NormalizePathLayer::trim_trailing_slash())
596 }
597}