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