1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
use std::time::Duration; use server::RecvMode; #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum Mode { BufferedUpfront(usize), Progressive(usize), Hijack, } impl RecvMode { /// Download whole message body (request or response) into the memory /// before starting response /// /// The argument is maximum size of the body. The Buffered variant /// works equally well for Chunked encoding and for read-util-end-of-stream /// mode of HTTP/1.0, so sometimes you can't know the size of the request /// in advance. Note this is just an upper limit it's neither buffer size /// nor *minimum* size of the body. pub fn buffered_upfront(max_body_size: usize) -> RecvMode { RecvMode { mode: Mode::BufferedUpfront(max_body_size), timeout: None, } } /// Fetch data chunk-by-chunk. /// /// Note, your response handler can start either before or after /// progressive body has started or ended to read. I mean they are /// completely independent, and actual sequence of events depends on other /// requests coming in and performance of a client. /// /// The parameter denotes minimum number of bytes that may be passed /// to the protocol handler. This is for performance tuning (i.e. less /// wake-ups of protocol parser). But it's not an input buffer size. The /// use of `Progressive(1)` is perfectly okay (for example if you use http /// request body as a persistent connection for sending multiple messages /// on-demand) pub fn progressive(min_chunk_size_hint: usize) -> RecvMode { RecvMode { mode: Mode::Progressive(min_chunk_size_hint), timeout: None, } } /// Don't read request body and hijack connection after response headers /// are sent. Useful for connection upgrades, including websockets and /// for CONNECT method. /// /// Note: `data_received` method of Codec is never called for `Hijack`d /// connection. pub fn hijack() -> RecvMode { RecvMode { mode: Mode::Hijack, timeout: None } } /// Change timeout for reading the whole request body to this value /// instead of configured default /// /// This might be useful if you have some specific slow routes and you /// can authenticate that request is valid enough. This is also useful for /// streaming large bodies and similar things. /// /// Or vice versa if you what shorter timeouts for suspicious host. pub fn body_read_timeout(mut self, duration: Duration) -> RecvMode { self.timeout = Some(duration); self } } pub fn get_mode(mode: &RecvMode) -> Mode { mode.mode }