Merge pull request #137 from reem/crates-io-release

feat(cargo): prepare for crates.io release.
This commit is contained in:
Sean McArthur
2014-12-20 13:31:23 -08:00
35 changed files with 102 additions and 220 deletions

View File

@@ -1,32 +1,25 @@
[package]
name = "hyper"
version = "0.0.1"
authors = ["Sean McArthur <sean.monstar@gmail.com>"]
version = "0.0.14"
description = "A modern HTTP library."
readme = "README.md"
documentation = "http://hyperium.github.io/hyper/hyper/index.html"
repository = "https://github.com/hyperium/hyper"
license = "MIT"
authors = ["Sean McArthur <sean.monstar@gmail.com>",
"Jonathan Reem <jonathan.reem@gmail.com>"]
[dependencies.url]
git = "https://github.com/servo/rust-url"
[dependencies]
url = "*"
openssl = "*"
mime = "*"
unsafe-any = "*"
typeable = "*"
cookie = "*"
time = "*"
mucell = "*"
[dependencies.openssl]
git = "https://github.com/sfackler/rust-openssl"
[dev-dependencies]
curl = "*"
[dependencies.mime]
git = "https://github.com/hyperium/mime.rs"
[dependencies.unsafe-any]
git = "https://github.com/reem/rust-unsafe-any"
[dev-dependencies.curl]
git = "https://github.com/carllerche/curl-rust"
[dev-dependencies.http]
git = "https://github.com/chris-morgan/rust-http"
[dependencies.cookie]
git = "https://github.com/alexcrichton/cookie-rs"
[dependencies.time]
git = "https://github.com/rust-lang/time"
[dependencies.mucell]
git = "https://github.com/chris-morgan/mucell"

View File

@@ -59,42 +59,6 @@ fn main() {
}
```
## Scientific\* Benchmarks
[Client Bench:](./benches/client.rs)
```
running 3 tests
test bench_curl ... bench: 400253 ns/iter (+/- 143539)
test bench_hyper ... bench: 181703 ns/iter (+/- 46529)
test result: ok. 0 passed; 0 failed; 0 ignored; 2 measured
```
[Mock Client Bench:](./benches/client_mock_tcp.rs)
```
running 3 tests
test bench_mock_curl ... bench: 53987 ns/iter (+/- 1735)
test bench_mock_http ... bench: 43569 ns/iter (+/- 1409)
test bench_mock_hyper ... bench: 20996 ns/iter (+/- 1742)
test result: ok. 0 passed; 0 failed; 0 ignored; 3 measured
```
[Server Bench:](./benches/server.rs)
```
running 2 tests
test bench_http ... bench: 296539 ns/iter (+/- 58861)
test bench_hyper ... bench: 233069 ns/iter (+/- 90194)
test result: ok. 0 passed; 0 failed; 0 ignored; 2 measured
```
\* No science was harmed in the making of this benchmark.
## License
[MIT](./LICENSE)

View File

@@ -1,6 +1,5 @@
#![feature(macro_rules)]
extern crate curl;
extern crate http;
extern crate hyper;
extern crate test;
@@ -8,10 +7,8 @@ extern crate test;
use std::fmt::{mod, Show};
use std::io::net::ip::Ipv4Addr;
use hyper::server::{Request, Response, Server};
use hyper::method::Method::Get;
use hyper::header::Headers;
use hyper::Client;
use hyper::client::RequestBuilder;
fn listen() -> hyper::server::Listening {
let server = Server::http(Ipv4Addr(127, 0, 0, 1), 0);
@@ -24,16 +21,16 @@ macro_rules! try_return(
Ok(v) => v,
Err(..) => return
}
}})
}}
);
fn handle(_r: Request, res: Response) {
static BODY: &'static [u8] = b"Benchmarking hyper vs others!";
let mut res = try_return!(res.start());
try_return!(res.write(BODY))
try_return!(res.write(BODY));
try_return!(res.end());
}
#[bench]
fn bench_curl(b: &mut test::Bencher) {
let mut listening = listen();
@@ -81,26 +78,3 @@ fn bench_hyper(b: &mut test::Bencher) {
listening.close().unwrap()
}
/*
doesn't handle keep-alive properly...
#[bench]
fn bench_http(b: &mut test::Bencher) {
let mut listening = listen();
let s = format!("http://{}/", listening.socket);
let url = s.as_slice();
b.iter(|| {
let mut req: http::client::RequestWriter = http::client::RequestWriter::new(
http::method::Get,
hyper::Url::parse(url).unwrap()
).unwrap();
req.headers.extensions.insert("x-foo".to_string(), "Bar".to_string());
// cant unwrap because Err contains RequestWriter, which does not implement Show
let mut res = match req.read_response() {
Ok(res) => res,
Err((_, ioe)) => panic!("http response failed = {}", ioe)
};
res.read_to_string().unwrap();
});
listening.close().unwrap()
}
*/

View File

@@ -1,6 +1,5 @@
#![feature(default_type_params)]
extern crate curl;
extern crate http;
extern crate hyper;
extern crate test;
@@ -8,12 +7,10 @@ extern crate test;
use std::fmt::{mod, Show};
use std::str::from_str;
use std::io::{IoResult, MemReader};
use std::io::net::ip::{SocketAddr, ToSocketAddr};
use std::io::net::ip::SocketAddr;
use std::os;
use std::path::BytesContainer;
use http::connecter::Connecter;
use hyper::net;
static README: &'static [u8] = include_bin!("../README.md");
@@ -117,27 +114,3 @@ fn bench_mock_hyper(b: &mut test::Bencher) {
});
}
impl Connecter for MockStream {
fn connect(_addr: SocketAddr, _host: &str, _use_ssl: bool) -> IoResult<MockStream> {
Ok(MockStream::new())
}
}
#[bench]
fn bench_mock_http(b: &mut test::Bencher) {
let url = "http://127.0.0.1:1337/";
b.iter(|| {
let mut req: http::client::RequestWriter<MockStream> = http::client::RequestWriter::new(
http::method::Get,
hyper::Url::parse(url).unwrap()
).unwrap();
req.headers.extensions.insert("x-foo".to_string(), "Bar".to_string());
// cant unwrap because Err contains RequestWriter, which does not implement Show
let mut res = match req.read_response() {
Ok(res) => res,
Err(..) => panic!("http response failed")
};
res.read_to_string().unwrap();
});
}

View File

@@ -1,14 +1,9 @@
// You have to ctrl-C after running this benchmark, since there is no way to kill
// a rust-http server.
extern crate http;
extern crate hyper;
extern crate test;
use test::Bencher;
use std::io::net::ip::{SocketAddr, Ipv4Addr};
use std::io::net::ip::Ipv4Addr;
use http::server::Server;
use hyper::method::Method::Get;
use hyper::server::{Request, Response};
@@ -35,36 +30,3 @@ fn bench_hyper(b: &mut Bencher) {
listener.close().unwrap();
}
static mut created_http: bool = false;
#[deriving(Clone)]
struct HttpServer;
impl Server for HttpServer {
fn get_config(&self) -> http::server::Config {
http::server::Config {
bind_address: SocketAddr {
ip: Ipv4Addr(127, 0, 0, 1),
port: 4000
}
}
}
fn handle_request(&self, _: http::server::Request, res: &mut http::server::ResponseWriter) {
res.write(PHRASE).unwrap();
}
}
#[bench]
fn bench_http(b: &mut Bencher) {
if unsafe { !created_http } {
spawn(proc() { HttpServer.serve_forever() });
unsafe { created_http = true }
// Mega hack because there is no way to wait for serve_forever to start:
std::io::timer::sleep(std::time::duration::Duration::seconds(1));
}
let url = hyper::Url::parse("http://localhost:4000").unwrap();
b.iter(|| request(url.clone()));
}

View File

@@ -18,7 +18,7 @@ macro_rules! try_return(
Err(e) => { error!("Error: {}", e); return; }
}
}}
)
);
fn echo(mut req: Request, mut res: Response) {
match req.uri {

View File

@@ -366,7 +366,7 @@ mod tests {
Server: mock3\r\n\
\r\n\
"
})
});
#[test]
fn test_redirect_followall() {

View File

@@ -114,7 +114,7 @@ impl Request<Fresh> {
}
debug!("writing head: {} {} {}", self.method, uri, self.version);
try!(write!(&mut self.body, "{} {} {}", self.method, uri, self.version))
try!(write!(&mut self.body, "{} {} {}", self.method, uri, self.version));
try!(self.body.write(LINE_ENDING));

View File

@@ -23,7 +23,7 @@ use mime::Mime;
#[deriving(Clone, PartialEq, Show)]
pub struct Accept(pub Vec<Mime>);
deref!(Accept -> Vec<Mime>)
deref!(Accept -> Vec<Mime>);
impl Header for Accept {
fn header_name(_: Option<Accept>) -> &'static str {
@@ -69,5 +69,5 @@ impl HeaderFormat for Accept {
}
}
bench_header!(bench, Accept, { vec![b"text/plain; q=0.5, text/html".to_vec()] })
bench_header!(bench, Accept, { vec![b"text/plain; q=0.5, text/html".to_vec()] });

View File

@@ -9,7 +9,7 @@ use super::util::{from_comma_delimited, fmt_comma_delimited};
#[deriving(Clone, PartialEq, Show)]
pub struct Allow(pub Vec<Method>);
deref!(Allow -> Vec<Method>)
deref!(Allow -> Vec<Method>);
impl Header for Allow {
fn header_name(_: Option<Allow>) -> &'static str {
@@ -45,4 +45,5 @@ mod tests {
}
}
bench_header!(bench, Allow, { vec![b"OPTIONS,GET,PUT,POST,DELETE,HEAD,TRACE,CONNECT,PATCH,fOObAr".to_vec()] })
bench_header!(bench, Allow, { vec![b"OPTIONS,GET,PUT,POST,DELETE,HEAD,TRACE,CONNECT,PATCH,fOObAr".to_vec()] });

View File

@@ -191,5 +191,6 @@ mod tests {
}
bench_header!(raw, Authorization<String>, { vec![b"foo bar baz".to_vec()] })
bench_header!(basic, Authorization<Basic>, { vec![b"Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==".to_vec()] })
bench_header!(raw, Authorization<String>, { vec![b"foo bar baz".to_vec()] });
bench_header!(basic, Authorization<Basic>, { vec![b"Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==".to_vec()] });

View File

@@ -7,7 +7,7 @@ use super::util::{from_one_comma_delimited, fmt_comma_delimited};
#[deriving(PartialEq, Clone, Show)]
pub struct CacheControl(pub Vec<CacheDirective>);
deref!(CacheControl -> Vec<CacheDirective>)
deref!(CacheControl -> Vec<CacheDirective>);
impl Header for CacheControl {
fn header_name(_: Option<CacheControl>) -> &'static str {
@@ -162,4 +162,5 @@ mod tests {
}
}
bench_header!(normal, CacheControl, { vec![b"no-cache, private".to_vec(), b"max-age=100".to_vec()] })
bench_header!(normal, CacheControl, { vec![b"no-cache, private".to_vec(), b"max-age=100".to_vec()] });

View File

@@ -9,7 +9,7 @@ pub use self::ConnectionOption::{KeepAlive, Close, ConnectionHeader};
#[deriving(Clone, PartialEq, Show)]
pub struct Connection(pub Vec<ConnectionOption>);
deref!(Connection -> Vec<ConnectionOption>)
deref!(Connection -> Vec<ConnectionOption>);
/// Values that can be in the `Connection` header.
#[deriving(Clone, PartialEq)]
@@ -66,6 +66,7 @@ impl HeaderFormat for Connection {
}
}
bench_header!(close, Connection, { vec![b"close".to_vec()] })
bench_header!(keep_alive, Connection, { vec![b"keep-alive".to_vec()] })
bench_header!(header, Connection, { vec![b"authorization".to_vec()] })
bench_header!(close, Connection, { vec![b"close".to_vec()] });
bench_header!(keep_alive, Connection, { vec![b"keep-alive".to_vec()] });
bench_header!(header, Connection, { vec![b"authorization".to_vec()] });

View File

@@ -9,7 +9,7 @@ use super::util::from_one_raw_str;
#[deriving(Copy, Clone, PartialEq, Show)]
pub struct ContentLength(pub uint);
deref!(ContentLength -> uint)
deref!(ContentLength -> uint);
impl Header for ContentLength {
fn header_name(_: Option<ContentLength>) -> &'static str {
@@ -37,4 +37,5 @@ impl ContentLength {
}
}
bench_header!(bench, ContentLength, { vec![b"42349984".to_vec()] })
bench_header!(bench, ContentLength, { vec![b"42349984".to_vec()] });

View File

@@ -10,7 +10,7 @@ use mime::Mime;
#[deriving(Clone, PartialEq, Show)]
pub struct ContentType(pub Mime);
deref!(ContentType -> Mime)
deref!(ContentType -> Mime);
impl Header for ContentType {
fn header_name(_: Option<ContentType>) -> &'static str {
@@ -29,4 +29,5 @@ impl HeaderFormat for ContentType {
}
}
bench_header!(bench, ContentType, { vec![b"application/json; charset=utf-8".to_vec()] })
bench_header!(bench, ContentType, { vec![b"application/json; charset=utf-8".to_vec()] });

View File

@@ -16,7 +16,7 @@ use cookie::CookieJar;
#[deriving(Clone, PartialEq, Show)]
pub struct Cookies(pub Vec<Cookie>);
deref!(Cookies -> Vec<Cookie>)
deref!(Cookies -> Vec<Cookie>);
impl Header for Cookies {
fn header_name(_: Option<Cookies>) -> &'static str {
@@ -113,4 +113,5 @@ fn cookie_jar() {
}
bench_header!(bench, Cookies, { vec![b"foo=bar; baz=quux".to_vec()] })
bench_header!(bench, Cookies, { vec![b"foo=bar; baz=quux".to_vec()] });

View File

@@ -9,7 +9,7 @@ use super::util::{from_one_raw_str, tm_from_str};
#[deriving(Copy, PartialEq, Clone)]
pub struct Date(pub Tm);
deref!(Date -> Tm)
deref!(Date -> Tm);
impl Header for Date {
fn header_name(_: Option<Date>) -> &'static str {
@@ -38,6 +38,7 @@ impl FromStr for Date {
}
}
bench_header!(imf_fixdate, Date, { vec![b"Sun, 07 Nov 1994 08:48:37 GMT".to_vec()] })
bench_header!(rfc_850, Date, { vec![b"Sunday, 06-Nov-94 08:49:37 GMT".to_vec()] })
bench_header!(asctime, Date, { vec![b"Sun Nov 6 08:49:37 1994".to_vec()] })
bench_header!(imf_fixdate, Date, { vec![b"Sun, 07 Nov 1994 08:48:37 GMT".to_vec()] });
bench_header!(rfc_850, Date, { vec![b"Sunday, 06-Nov-94 08:49:37 GMT".to_vec()] });
bench_header!(asctime, Date, { vec![b"Sun Nov 6 08:49:37 1994".to_vec()] });

View File

@@ -153,4 +153,5 @@ mod tests {
}
}
bench_header!(bench, Etag, { vec![b"W/\"nonemptytag\"".to_vec()] })
bench_header!(bench, Etag, { vec![b"W/\"nonemptytag\"".to_vec()] });

View File

@@ -8,7 +8,7 @@ use super::util::{from_one_raw_str, tm_from_str};
#[deriving(Copy, PartialEq, Clone)]
pub struct Expires(pub Tm);
deref!(Expires -> Tm)
deref!(Expires -> Tm);
impl Header for Expires {
fn header_name(_: Option<Expires>) -> &'static str {
@@ -37,6 +37,7 @@ impl FromStr for Expires {
}
}
bench_header!(imf_fixdate, Expires, { vec![b"Sun, 07 Nov 1994 08:48:37 GMT".to_vec()] })
bench_header!(rfc_850, Expires, { vec![b"Sunday, 06-Nov-94 08:49:37 GMT".to_vec()] })
bench_header!(asctime, Expires, { vec![b"Sun Nov 6 08:49:37 1994".to_vec()] })
bench_header!(imf_fixdate, Expires, { vec![b"Sun, 07 Nov 1994 08:48:37 GMT".to_vec()] });
bench_header!(rfc_850, Expires, { vec![b"Sunday, 06-Nov-94 08:49:37 GMT".to_vec()] });
bench_header!(asctime, Expires, { vec![b"Sun Nov 6 08:49:37 1994".to_vec()] });

View File

@@ -95,5 +95,5 @@ mod tests {
}
}
bench_header!(bench, Host, { vec![b"foo.com:3000".to_vec()] })
bench_header!(bench, Host, { vec![b"foo.com:3000".to_vec()] });

View File

@@ -8,7 +8,7 @@ use super::util::{from_one_raw_str, tm_from_str};
#[deriving(Copy, PartialEq, Clone)]
pub struct IfModifiedSince(pub Tm);
deref!(IfModifiedSince -> Tm)
deref!(IfModifiedSince -> Tm);
impl Header for IfModifiedSince {
fn header_name(_: Option<IfModifiedSince>) -> &'static str {
@@ -37,6 +37,7 @@ impl FromStr for IfModifiedSince {
}
}
bench_header!(imf_fixdate, IfModifiedSince, { vec![b"Sun, 07 Nov 1994 08:48:37 GMT".to_vec()] })
bench_header!(rfc_850, IfModifiedSince, { vec![b"Sunday, 06-Nov-94 08:49:37 GMT".to_vec()] })
bench_header!(asctime, IfModifiedSince, { vec![b"Sun Nov 6 08:49:37 1994".to_vec()] })
bench_header!(imf_fixdate, IfModifiedSince, { vec![b"Sun, 07 Nov 1994 08:48:37 GMT".to_vec()] });
bench_header!(rfc_850, IfModifiedSince, { vec![b"Sunday, 06-Nov-94 08:49:37 GMT".to_vec()] });
bench_header!(asctime, IfModifiedSince, { vec![b"Sun Nov 6 08:49:37 1994".to_vec()] });

View File

@@ -8,7 +8,7 @@ use super::util::{from_one_raw_str, tm_from_str};
#[deriving(Copy, PartialEq, Clone)]
pub struct LastModified(pub Tm);
deref!(LastModified -> Tm)
deref!(LastModified -> Tm);
impl Header for LastModified {
fn header_name(_: Option<LastModified>) -> &'static str {
@@ -37,6 +37,7 @@ impl FromStr for LastModified {
}
}
bench_header!(imf_fixdate, LastModified, { vec![b"Sun, 07 Nov 1994 08:48:37 GMT".to_vec()] })
bench_header!(rfc_850, LastModified, { vec![b"Sunday, 06-Nov-94 08:49:37 GMT".to_vec()] })
bench_header!(asctime, LastModified, { vec![b"Sun Nov 6 08:49:37 1994".to_vec()] })
bench_header!(imf_fixdate, LastModified, { vec![b"Sun, 07 Nov 1994 08:48:37 GMT".to_vec()] });
bench_header!(rfc_850, LastModified, { vec![b"Sunday, 06-Nov-94 08:49:37 GMT".to_vec()] });
bench_header!(asctime, LastModified, { vec![b"Sun Nov 6 08:49:37 1994".to_vec()] });

View File

@@ -16,7 +16,7 @@ use super::util::from_one_raw_str;
#[deriving(Clone, PartialEq, Show)]
pub struct Location(pub String);
deref!(Location -> String)
deref!(Location -> String);
impl Header for Location {
fn header_name(_: Option<Location>) -> &'static str {
@@ -35,5 +35,5 @@ impl HeaderFormat for Location {
}
}
bench_header!(bench, Location, { vec![b"http://foo.com/hello:3000".to_vec()] })
bench_header!(bench, Location, { vec![b"http://foo.com/hello:3000".to_vec()] });

View File

@@ -55,7 +55,7 @@ macro_rules! bench_header(
}
}
}
)
);
macro_rules! deref(
($from:ty -> $to:ty) => {
@@ -71,7 +71,7 @@ macro_rules! deref(
}
}
}
)
);
/// Exposes the Accept header.
pub mod accept;

View File

@@ -8,7 +8,7 @@ use super::util::from_one_raw_str;
#[deriving(Clone, PartialEq, Show)]
pub struct Server(pub String);
deref!(Server -> String)
deref!(Server -> String);
impl Header for Server {
fn header_name(_: Option<Server>) -> &'static str {
@@ -27,5 +27,5 @@ impl HeaderFormat for Server {
}
}
bench_header!(bench, Server, { vec![b"Some String".to_vec()] })
bench_header!(bench, Server, { vec![b"Some String".to_vec()] });

View File

@@ -13,7 +13,7 @@ use cookie::CookieJar;
#[deriving(Clone, PartialEq, Show)]
pub struct SetCookie(pub Vec<Cookie>);
deref!(SetCookie -> Vec<Cookie>)
deref!(SetCookie -> Vec<Cookie>);
impl Header for SetCookie {
fn header_name(_: Option<SetCookie>) -> &'static str {
@@ -111,3 +111,4 @@ fn cookie_jar() {
assert_eq!(jar.encrypted().find("foo"), new_jar.encrypted().find("foo"));
assert_eq!(jar.iter().collect::<Vec<Cookie>>(), new_jar.iter().collect::<Vec<Cookie>>());
}

View File

@@ -21,7 +21,7 @@ use self::Encoding::{Chunked, Gzip, Deflate, Compress, EncodingExt};
#[deriving(Clone, PartialEq, Show)]
pub struct TransferEncoding(pub Vec<Encoding>);
deref!(TransferEncoding -> Vec<Encoding>)
deref!(TransferEncoding -> Vec<Encoding>);
/// A value to be used with the `Transfer-Encoding` header.
///
@@ -87,5 +87,6 @@ impl HeaderFormat for TransferEncoding {
}
}
bench_header!(normal, TransferEncoding, { vec![b"chunked, gzip".to_vec()] })
bench_header!(ext, TransferEncoding, { vec![b"ext".to_vec()] })
bench_header!(normal, TransferEncoding, { vec![b"chunked, gzip".to_vec()] });
bench_header!(ext, TransferEncoding, { vec![b"ext".to_vec()] });

View File

@@ -9,7 +9,7 @@ use self::Protocol::{WebSocket, ProtocolExt};
#[deriving(Clone, PartialEq, Show)]
pub struct Upgrade(pub Vec<Protocol>);
deref!(Upgrade -> Vec<Protocol>)
deref!(Upgrade -> Vec<Protocol>);
/// Protocol values that can appear in the Upgrade header.
#[deriving(Clone, PartialEq)]
@@ -55,4 +55,5 @@ impl HeaderFormat for Upgrade {
}
}
bench_header!(bench, Upgrade, { vec![b"HTTP/2.0, RTA/x11, websocket".to_vec()] })
bench_header!(bench, Upgrade, { vec![b"HTTP/2.0, RTA/x11, websocket".to_vec()] });

View File

@@ -8,7 +8,7 @@ use super::util::from_one_raw_str;
#[deriving(Clone, PartialEq, Show)]
pub struct UserAgent(pub String);
deref!(UserAgent -> String)
deref!(UserAgent -> String);
impl Header for UserAgent {
fn header_name(_: Option<UserAgent>) -> &'static str {
@@ -27,5 +27,5 @@ impl HeaderFormat for UserAgent {
}
}
bench_header!(bench, UserAgent, { vec![b"cargo bench".to_vec()] })
bench_header!(bench, UserAgent, { vec![b"cargo bench".to_vec()] });

View File

@@ -458,7 +458,7 @@ impl FromStr for CaseInsensitive {
impl Clone for CaseInsensitive {
fn clone(&self) -> CaseInsensitive {
CaseInsensitive((*self.0).clone().into_cow())
CaseInsensitive(self.0.clone().into_cow())
}
}

View File

@@ -588,7 +588,7 @@ pub struct RawStatus(pub u16, pub SendStr);
impl Clone for RawStatus {
fn clone(&self) -> RawStatus {
RawStatus(self.0, (*self.1).clone().into_cow())
RawStatus(self.0, self.1.clone().into_cow())
}
}

View File

@@ -156,7 +156,7 @@ macro_rules! todo(
($($arg:tt)*) => (if cfg!(not(ndebug)) {
format_args!(|args| log!(5, "TODO: {}", args), $($arg)*)
})
)
);
#[allow(dead_code)]
struct Trace;
@@ -172,7 +172,7 @@ macro_rules! trace(
($($arg:tt)*) => (if cfg!(not(ndebug)) {
format_args!(|args| log!(5, "{}\n{}", args, ::Trace), $($arg)*)
})
)
);
macro_rules! inspect(
($name:expr, $value:expr) => ({
@@ -180,7 +180,7 @@ macro_rules! inspect(
debug!("inspect: {} = {}", $name, v);
v
})
)
);
#[cfg(test)]
#[macro_escape]

View File

@@ -104,4 +104,5 @@ macro_rules! mock_connector (
}
)
)
);

View File

@@ -38,7 +38,7 @@ macro_rules! try_option(
None => return None
}
}}
)
);
impl Server<HttpListener> {
/// Creates a new server that will handle `HttpStream`s.

View File

@@ -80,7 +80,7 @@ mod tests {
macro_rules! sock(
($s:expr) => (::std::str::from_str::<::std::io::net::ip::SocketAddr>($s).unwrap())
)
);
#[test]
fn test_get_empty_body() {