diff --git a/src/version.rs b/src/version.rs index 1c840796da..1abe1c7352 100644 --- a/src/version.rs +++ b/src/version.rs @@ -3,7 +3,9 @@ //! Instead of relying on typo-prone Strings, use expected HTTP versions as //! the `HttpVersion` enum. use std::fmt; +use std::str::FromStr; +use error::Error; use self::HttpVersion::{Http09, Http10, Http11, H2, H2c}; /// Represents a version of the HTTP spec. @@ -36,8 +38,54 @@ impl fmt::Display for HttpVersion { } } +impl FromStr for HttpVersion { + type Err = Error; + fn from_str(s: &str) -> Result { + Ok(match s { + "HTTP/0.9" => Http09, + "HTTP/1.0" => Http10, + "HTTP/1.1" => Http11, + "h2" => H2, + "h2c" => H2c, + _ => return Err(Error::Version), + }) + } +} + impl Default for HttpVersion { fn default() -> HttpVersion { Http11 } } + +#[cfg(test)] +mod tests { + use std::str::FromStr; + use error::Error; + use super::HttpVersion; + use super::HttpVersion::{Http09,Http10,Http11,H2,H2c}; + + #[test] + fn test_default() { + assert_eq!(Http11, HttpVersion::default()); + } + + #[test] + fn test_from_str() { + assert_eq!(Http09, HttpVersion::from_str("HTTP/0.9").unwrap()); + assert_eq!(Http10, HttpVersion::from_str("HTTP/1.0").unwrap()); + assert_eq!(Http11, HttpVersion::from_str("HTTP/1.1").unwrap()); + assert_eq!(H2, HttpVersion::from_str("h2").unwrap()); + assert_eq!(H2c, HttpVersion::from_str("h2c").unwrap()); + } + + #[test] + fn test_from_str_panic() { + match HttpVersion::from_str("foo") { + Err(Error::Version) => assert!(true), + Err(_) => assert!(false), + Ok(_) => assert!(false), + } + } + +}