-
-
Notifications
You must be signed in to change notification settings - Fork 1.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat(headers): Add Accept-Ranges header field
- Loading branch information
Showing
2 changed files
with
73 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,71 @@ | ||
use std::fmt::{self, Display}; | ||
use std::str::FromStr; | ||
|
||
header! { | ||
#[doc="`Accept-Ranges` header, defined in"] | ||
#[doc="[RFC7233](http://tools.ietf.org/html/rfc7233#section-2.3)"] | ||
#[doc=""] | ||
#[doc="The `Accept-Ranges` header field allows a server to indicate that it"] | ||
#[doc="supports range requests for the target resource."] | ||
#[doc=""] | ||
#[doc="# ABNF"] | ||
#[doc="```plain"] | ||
#[doc="Accept-Ranges = acceptable-ranges"] | ||
#[doc="acceptable-ranges = 1#range-unit / \"none\""] | ||
#[doc=""] | ||
#[doc="# Example values"] | ||
#[doc="* `bytes`"] | ||
#[doc="* `none`"] | ||
#[doc="```"] | ||
(AcceptRanges, "Accept-Ranges") => (RangeUnit)+ | ||
|
||
test_acccept_ranges { | ||
test_header!(test1, vec![b"bytes"]); | ||
test_header!(test2, vec![b"none"]); | ||
} | ||
} | ||
|
||
/// Range Units, described in [RFC7233](http://tools.ietf.org/html/rfc7233#section-2) | ||
/// | ||
/// A representation can be partitioned into subranges according to | ||
/// various structural units, depending on the structure inherent in the | ||
/// representation's media type. | ||
/// | ||
/// # ABNF | ||
/// ```plain | ||
/// range-unit = bytes-unit / other-range-unit | ||
/// bytes-unit = "bytes" | ||
/// other-range-unit = token | ||
/// ``` | ||
#[derive(Clone, Debug, Eq, PartialEq)] | ||
pub enum RangeUnit { | ||
/// Indicating byte-range requests are supported. | ||
Bytes, | ||
/// Reserved as keyword, indicating no ranges are supported. | ||
None, | ||
/// The given range unit is not registered at IANA. | ||
Unregistered(String), | ||
} | ||
|
||
|
||
impl FromStr for RangeUnit { | ||
type Err = (); | ||
fn from_str(s: &str) -> Result<Self, ()> { | ||
match s { | ||
"bytes" => Ok(RangeUnit::Bytes), | ||
"none" => Ok(RangeUnit::None), | ||
// FIXME: Check if s is really a Token | ||
_ => Ok(RangeUnit::Unregistered(s.to_string())), | ||
} | ||
} | ||
} | ||
|
||
impl Display for RangeUnit { | ||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { | ||
match *self { | ||
RangeUnit::Bytes => f.write_str("bytes"), | ||
RangeUnit::None => f.write_str("none"), | ||
RangeUnit::Unregistered(ref x) => f.write_str(&x), | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters