Merge pull request #390 from hyperium/strptime
Add tests for header::parsing::tm_from_str and run benchmarks on travis.
This commit is contained in:
@@ -4,7 +4,7 @@ sudo: false
|
|||||||
script:
|
script:
|
||||||
- cargo build
|
- cargo build
|
||||||
- cargo test
|
- cargo test
|
||||||
- cargo bench --no-run
|
- cargo bench
|
||||||
|
|
||||||
after_success: |
|
after_success: |
|
||||||
[ $TRAVIS_BRANCH = master ] &&
|
[ $TRAVIS_BRANCH = master ] &&
|
||||||
|
|||||||
@@ -1,35 +0,0 @@
|
|||||||
#![deny(warnings)]
|
|
||||||
#![feature(test)]
|
|
||||||
extern crate hyper;
|
|
||||||
extern crate test;
|
|
||||||
|
|
||||||
use test::Bencher;
|
|
||||||
use std::io::{Read, Write};
|
|
||||||
|
|
||||||
use hyper::method::Method::Get;
|
|
||||||
use hyper::server::{Request, Response};
|
|
||||||
|
|
||||||
static PHRASE: &'static [u8] = b"Benchmarking hyper vs others!";
|
|
||||||
|
|
||||||
fn request(url: hyper::Url) {
|
|
||||||
let req = hyper::client::Request::new(Get, url).unwrap();
|
|
||||||
let mut s = String::new();
|
|
||||||
req.start().unwrap().send().unwrap().read_to_string(&mut s).unwrap();
|
|
||||||
}
|
|
||||||
|
|
||||||
fn hyper_handle(_: Request, res: Response) {
|
|
||||||
let mut res = res.start().unwrap();
|
|
||||||
res.write_all(PHRASE).unwrap();
|
|
||||||
res.end().unwrap();
|
|
||||||
}
|
|
||||||
|
|
||||||
#[bench]
|
|
||||||
fn bench_hyper(b: &mut Bencher) {
|
|
||||||
let server = hyper::Server::http(hyper_handle);
|
|
||||||
let mut listener = server.listen("127.0.0.1").unwrap();
|
|
||||||
|
|
||||||
let url = hyper::Url::parse(&*format!("http://{}", listener.socket)).unwrap();
|
|
||||||
b.iter(|| request(url.clone()));
|
|
||||||
listener.close().unwrap();
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,9 +1,8 @@
|
|||||||
//! Utility functions for Header implementations.
|
//! Utility functions for Header implementations.
|
||||||
|
|
||||||
extern crate time;
|
|
||||||
|
|
||||||
use std::str;
|
use std::str;
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
|
use time;
|
||||||
|
|
||||||
/// Reads a single raw string when parsing a header
|
/// Reads a single raw string when parsing a header
|
||||||
pub fn from_one_raw_str<T: str::FromStr>(raw: &[Vec<u8>]) -> Option<T> {
|
pub fn from_one_raw_str<T: str::FromStr>(raw: &[Vec<u8>]) -> Option<T> {
|
||||||
@@ -83,3 +82,43 @@ pub fn tm_from_str(s: &str) -> Option<time::Tm> {
|
|||||||
time::strptime(s, "%c")
|
time::strptime(s, "%c")
|
||||||
}).ok()
|
}).ok()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use time::Tm;
|
||||||
|
use super::tm_from_str;
|
||||||
|
|
||||||
|
const NOV_07: Tm = Tm {
|
||||||
|
tm_nsec: 0,
|
||||||
|
tm_sec: 37,
|
||||||
|
tm_min: 48,
|
||||||
|
tm_hour: 8,
|
||||||
|
tm_mday: 7,
|
||||||
|
tm_mon: 10,
|
||||||
|
tm_year: 94,
|
||||||
|
tm_wday: 0,
|
||||||
|
tm_isdst: 0,
|
||||||
|
tm_yday: 0,
|
||||||
|
tm_utcoff: 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_imf_fixdate() {
|
||||||
|
assert_eq!(tm_from_str("Sun, 07 Nov 1994 08:48:37 GMT"),
|
||||||
|
Some(NOV_07));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_rfc_850() {
|
||||||
|
assert_eq!(tm_from_str("Sunday, 07-Nov-94 08:48:37 GMT"),
|
||||||
|
Some(NOV_07));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_asctime() {
|
||||||
|
assert_eq!(tm_from_str("Sun Nov 7 08:48:37 1994"),
|
||||||
|
Some(NOV_07));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,34 +0,0 @@
|
|||||||
//! Provides utility function to parse HTTP header value time.
|
|
||||||
|
|
||||||
extern crate time;
|
|
||||||
|
|
||||||
/// Get a Tm from HTTP date formats.
|
|
||||||
// Prior to 1995, there were three different formats commonly used by
|
|
||||||
// servers to communicate timestamps. For compatibility with old
|
|
||||||
// implementations, all three are defined here. The preferred format is
|
|
||||||
// a fixed-length and single-zone subset of the date and time
|
|
||||||
// specification used by the Internet Message Format [RFC5322].
|
|
||||||
//
|
|
||||||
// HTTP-date = IMF-fixdate / obs-date
|
|
||||||
//
|
|
||||||
// An example of the preferred format is
|
|
||||||
//
|
|
||||||
// Sun, 06 Nov 1994 08:49:37 GMT ; IMF-fixdate
|
|
||||||
//
|
|
||||||
// Examples of the two obsolete formats are
|
|
||||||
//
|
|
||||||
// Sunday, 06-Nov-94 08:49:37 GMT ; obsolete RFC 850 format
|
|
||||||
// Sun Nov 6 08:49:37 1994 ; ANSI C's asctime() format
|
|
||||||
//
|
|
||||||
// A recipient that parses a timestamp value in an HTTP header field
|
|
||||||
// MUST accept all three HTTP-date formats. When a sender generates a
|
|
||||||
// header field that contains one or more timestamps defined as
|
|
||||||
// HTTP-date, the sender MUST generate those timestamps in the
|
|
||||||
// IMF-fixdate format.
|
|
||||||
pub fn tm_from_str(s: &str) -> Option<time::Tm> {
|
|
||||||
time::strptime(s, "%a, %d %b %Y %T %Z").or_else(|_| {
|
|
||||||
time::strptime(s, "%A, %d-%b-%y %T %Z")
|
|
||||||
}).or_else(|_| {
|
|
||||||
time::strptime(s, "%c")
|
|
||||||
}).ok()
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user