implementation
This commit is contained in:
		
							
								
								
									
										99
									
								
								src/method.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										99
									
								
								src/method.rs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,99 @@ | ||||
| //! # HTTP Method | ||||
| use std::fmt; | ||||
| use std::from_str::FromStr; | ||||
|  | ||||
| /// The Request Method (VERB) | ||||
| /// | ||||
| /// Currently includes 8 variants representing the 8 methods defined in | ||||
| /// [RFC 7230](https://tools.ietf.org/html/rfc7231#section-4.1), plus PATCH, | ||||
| /// and an Extension variant for all extensions. | ||||
| /// | ||||
| /// It may make sense to grow this to include all variants currently | ||||
| /// registered with IANA, if they are at all common to use. | ||||
| #[deriving(Clone, PartialEq)] | ||||
| pub enum Method { | ||||
|     /// OPTIONS | ||||
|     Options, | ||||
|     /// GET | ||||
|     Get, | ||||
|     /// POST | ||||
|     Post, | ||||
|     /// PUT | ||||
|     Put, | ||||
|     /// DELETE | ||||
|     Delete, | ||||
|     /// HEAD | ||||
|     Head, | ||||
|     /// TRACE | ||||
|     Trace, | ||||
|     /// CONNECT | ||||
|     Connect, | ||||
|     /// PATCH | ||||
|     Patch, | ||||
|     /// Method extentions. An example would be `let m = Extension("FOO".to_string())`. | ||||
|     Extension(String) | ||||
| } | ||||
|  | ||||
| impl Method { | ||||
|     /// Whether a method is considered "safe", meaning the request is | ||||
|     /// essentially read-only. | ||||
|     /// | ||||
|     /// See [the spec](https://tools.ietf.org/html/rfc7231#section-4.2.1) | ||||
|     /// for more words. | ||||
|     pub fn safe(&self) -> bool { | ||||
|         match *self { | ||||
|             Get | Head | Options | Trace => true, | ||||
|             _ => false | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /// Whether a method is considered "idempotent", meaning the request has | ||||
|     /// the same result is executed multiple times. | ||||
|     /// | ||||
|     /// See [the spec](https://tools.ietf.org/html/rfc7231#section-4.2.2) for | ||||
|     /// more words. | ||||
|     pub fn idempotent(&self) -> bool { | ||||
|         if self.safe() { | ||||
|             true | ||||
|         } else { | ||||
|             match *self { | ||||
|                 Put | Delete => true, | ||||
|                 _ => false | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| impl FromStr for Method { | ||||
|     fn from_str(s: &str) -> Option<Method> { | ||||
|         Some(match s { | ||||
|             "OPTIONS" => Options, | ||||
|             "GET" => Get, | ||||
|             "POST" => Post, | ||||
|             "PUT" => Put, | ||||
|             "DELETE" => Delete, | ||||
|             "HEAD" => Head, | ||||
|             "TRACE" => Trace, | ||||
|             "CONNECT" => Connect, | ||||
|             "PATCH" => Patch, | ||||
|             _ => Extension(s.to_string()) | ||||
|         }) | ||||
|     } | ||||
| } | ||||
|  | ||||
| impl fmt::Show for Method { | ||||
|     fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { | ||||
|         match *self { | ||||
|             Options => "OPTIONS", | ||||
|             Get => "GET", | ||||
|             Post => "POST", | ||||
|             Put => "PUT", | ||||
|             Delete => "DELETE", | ||||
|             Head => "HEAD", | ||||
|             Trace => "TRACE", | ||||
|             Connect => "CONNECT", | ||||
|             Patch => "PATCH", | ||||
|             Extension(ref s) => s.as_slice() | ||||
|         }.fmt(fmt) | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user