Name Description Size
addr.rs Socket Address filters. 699
any.rs A filter that matches any route. 1831
body.rs Body filters Filters that extract a body for a route. 10807
compression.rs Compression Filters Filters that compress the body of a response. 8491
cookie.rs Cookie Filters 1380
cors.rs CORS Filters 18877
ext.rs Request Extensions 1101
fs.rs File System Filters 16592
header.rs Header Filters These filters are used to interact with the Request HTTP headers. Some of them, like `exact` and `exact_ignore_case`, are just predicates, they don't extract any values. The `header` filter allows parsing a type from any header. 6950
host.rs Host ("authority") filter 3412
log.rs Logger Filters 7081
method.rs HTTP Method filters. The filters deal with the HTTP Method part of a request. Several here will match the request `Method`, and if not matched, will reject the request with a `405 Method Not Allowed`. There is also [`warp::method()`](method), which never rejects a request, and just extracts the method to be used in your filter chains. 3846
mod.rs Built-in Filters This module mostly serves as documentation to group together the list of built-in filters. Most of these are available at more convenient paths. 629
multipart.rs Multipart body filters [`Filter`](crate::Filter)s that extract a multipart body for a route. 6930
path.rs Path Filters The [`Filter`](crate::Filter)s here work on the "path" of requests. - [`path`](./fn.path.html) matches a specific segment, like `/foo`. - [`param`](./fn.param.html) tries to parse a segment into a type, like `/:u16`. - [`end`](./fn.end.html) matches when the path end is found. - [`path!`](../../macro.path.html) eases combining multiple `path` and `param` filters. # Routing Routing in warp is simple yet powerful. First up, matching a single segment: ``` use warp::Filter; // GET /hi let hi = warp::path("hi").map(|| { "Hello, World!" }); ``` How about multiple segments? It's easiest with the `path!` macro: ``` # use warp::Filter; // GET /hello/from/warp let hello_from_warp = warp::path!("hello" / "from" / "warp").map(|| { "Hello from warp!" }); ``` Neat! But how do I handle **parameters** in paths? ``` # use warp::Filter; // GET /sum/:u32/:u32 let sum = warp::path!("sum" / u32 / u32).map(|a, b| { format!("{} + {} = {}", a, b, a + b) }); ``` In fact, any type that implements `FromStr` can be used, in any order: ``` # use warp::Filter; // GET /:u16/times/:u16 let times = warp::path!(u16 / "times" / u16).map(|a, b| { format!("{} times {} = {}", a, b, a * b) }); ``` Oh shoot, those math routes should be **mounted** at a different path, is that possible? Yep! ``` # use warp::Filter; # let sum = warp::any().map(warp::reply); # let times = sum.clone(); // GET /math/sum/:u32/:u32 // GET /math/:u16/times/:u16 let math = warp::path("math"); let math_sum = math.and(sum); let math_times = math.and(times); ``` What! `and`? What's that do? It combines the filters in a sort of "this and then that" order. In fact, it's exactly what the `path!` macro has been doing internally. ``` # use warp::Filter; // GET /bye/:string let bye = warp::path("bye") .and(warp::path::param()) .map(|name: String| { format!("Good bye, {}!", name) }); ``` Ah, so, can filters do things besides `and`? Why, yes they can! They can also `or`! As you might expect, `or` creates a "this or else that" chain of filters. If the first doesn't succeed, then it tries the other. So, those `math` routes could have been **mounted** all as one, with `or`. ``` # use warp::Filter; # let sum = warp::path("sum"); # let times = warp::path("times"); // GET /math/sum/:u32/:u32 // GET /math/:u16/times/:u16 let math = warp::path("math") .and(sum.or(times)); ``` It turns out, using `or` is how you combine everything together into a single API. ``` # use warp::Filter; # let hi = warp::path("hi"); # let hello_from_warp = hi.clone(); # let bye = hi.clone(); # let math = hi.clone(); // GET /hi // GET /hello/from/warp // GET /bye/:string // GET /math/sum/:u32/:u32 // GET /math/:u16/times/:u16 let routes = hi .or(hello_from_warp) .or(bye) .or(math); ``` Note that you will generally want path filters to come **before** other filters like `body` or `headers`. If a different type of filter comes first, a request with an invalid body for route `/right-path-wrong-body` may try matching against `/wrong-path` and return the error from `/wrong-path` instead of the correct body-related error. 17345
query.rs Query Filters 2761
reply.rs Reply Filters These "filters" behave a little differently than the rest. Instead of being used directly on requests, these filters "wrap" other filters. ## Wrapping a `Filter` (`with`) ``` use warp::Filter; let with_server = warp::reply::with::header("server", "warp"); let route = warp::any() .map(warp::reply) .with(with_server); ``` Wrapping allows adding in conditional logic *before* the request enters the inner filter (though the `with::header` wrapper does not). 6839
sse.rs Server-Sent Events (SSE) # Example ``` use std::time::Duration; use std::convert::Infallible; use warp::{Filter, sse::Event}; use futures_util::{stream::iter, Stream}; fn sse_events() -> impl Stream<Item = Result<Event, Infallible>> { iter(vec![ Ok(Event::default().data("unnamed event")), Ok( Event::default().event("chat") .data("chat message") ), Ok( Event::default().id(13.to_string()) .event("chat") .data("other chat message\nwith next line") .retry(Duration::from_millis(5000)) ) ]) } let app = warp::path("push-notifications") .and(warp::get()) .map(|| { warp::sse::reply(warp::sse::keep_alive().stream(sse_events())) }); ``` Each field already is event which can be sent to client. The events with multiple fields can be created by combining fields using tuples. See also the [EventSource](https://developer.mozilla.org/en-US/docs/Web/API/EventSource) API, which specifies the expected behavior of Server Sent Events. 14306
trace.rs [`tracing`] filters. [`tracing`] is a framework for instrumenting Rust programs to collect scoped, structured, and async-aware diagnostics. This module provides a set of filters for instrumenting Warp applications with `tracing` spans. [`Spans`] can be used to associate individual events with a request, and track contexts through the application. [`tracing`]: https://crates.io/crates/tracing [`Spans`]: https://docs.rs/tracing/latest/tracing/#spans 8955
ws.rs Websockets Filters 13087