hyper_sync/http/
mod.rs

1//! Pieces pertaining to the HTTP message protocol.
2use std::borrow::Cow;
3
4use header::Connection;
5use header::ConnectionOption::{KeepAlive, Close};
6use header::Headers;
7use version::HttpVersion;
8use version::HttpVersion::{Http10, Http11};
9
10
11pub use self::message::{HttpMessage, RequestHead, ResponseHead, Protocol};
12
13pub mod h1;
14pub mod message;
15
16/// The raw status code and reason-phrase.
17#[derive(Clone, PartialEq, Debug)]
18pub struct RawStatus(pub u16, pub Cow<'static, str>);
19
20/// Checks if a connection should be kept alive.
21#[inline]
22pub fn should_keep_alive(version: HttpVersion, headers: &Headers) -> bool {
23    trace!("should_keep_alive( {:?}, {:?} )", version, headers.get::<Connection>());
24    match (version, headers.get::<Connection>()) {
25        (Http10, None) => false,
26        (Http10, Some(conn)) if !conn.contains(&KeepAlive) => false,
27        (Http11, Some(conn)) if conn.contains(&Close)  => false,
28        _ => true
29    }
30}
31
32#[test]
33fn test_should_keep_alive() {
34    let mut headers = Headers::new();
35
36    assert!(!should_keep_alive(Http10, &headers));
37    assert!(should_keep_alive(Http11, &headers));
38
39    headers.set(Connection::close());
40    assert!(!should_keep_alive(Http10, &headers));
41    assert!(!should_keep_alive(Http11, &headers));
42
43    headers.set(Connection::keep_alive());
44    assert!(should_keep_alive(Http10, &headers));
45    assert!(should_keep_alive(Http11, &headers));
46}