Sean McArthur d7fe8c307a refactor(headers): switch from MuCell to OptCell
It turns out, we don't need capabilities of MuCell (or even RefCell).
We don't to have sophisticated interior mutability. We don't ever lend
out references that may be mutated later. Instead, if there is no value
to lend, then we generate the value, require interior mutability to save
the value internally, and then we return a reference. We never ever
change a value once it's been generated. It can be changed, but only via
&mut self methods, where we can safely reason about mutability.

This means we don't need keep borrow checking code at runtime, which
helps performance. We also are able to reduce the amount of unsafe
transmutes. The internal API more safely constrains the usage of unsafe,
enforcing our invariants, instead of shotgunning unsafe usage with Refs
and promising we're doing it correctly.

On a machine with lower memory (1GB):

    Before:
    test bench_mock_hyper ... bench:    251772 ns/iter (+/- 128445)

    After:
    test bench_mock_hyper ... bench:    152603 ns/iter (+/- 25928)

On a machine with more memory, weaker CPU:

    Before:
    test bench_mock_hyper ... bench:    129398 ns/iter (+/- 51740)

    After:
    test bench_mock_hyper ... bench:    115935 ns/iter (+/- 28555)

Closes #252
2015-02-06 21:47:29 -08:00
2015-02-03 18:57:24 -08:00
2014-08-30 14:18:28 -07:00
2015-02-03 19:09:06 -08:00
2014-08-30 14:18:28 -07:00

hyper

Build Status

A Modern HTTP library for Rust.

Documentation

Overview

Hyper is a fast, modern HTTP implementation written in and for Rust. It is a low-level typesafe abstraction over raw HTTP, providing an elegant layer over "stringly-typed" HTTP.

Hyper offers both an HTTP/S client and HTTP server which can be used to drive complex web applications written entirely in Rust.

The documentation is located at http://hyperium.github.io/hyper.

WARNING: Hyper is still under active development. The API is still changing in non-backwards-compatible ways without warning.

Example

Hello World Server:

fn hello(_: Request, res: Response<Fresh>) {
    *res.status_mut() = status::Ok;
    let mut res = res.start().unwrap();
    res.write(b"Hello World!");
    res.end().unwrap();
}

fn main() {
    let server = Server::http(Ipv4Addr(127, 0, 0, 1), 1337);
    server.listen(hello).unwrap();
}

Client:

fn main() {
    // Create a client.
    let mut client = Client::new();

    // Creating an outgoing request.
    let res = client.get("http://www.gooogle.com/")
        // set a header
        .header(Connection(vec![Close]))
        // let 'er go!
        .send().unwrap();

    // Read the Response.
    let body = res.read_to_string().unwrap();

    println!("Response: {}", body);
}

License

MIT

Description
No description provided
Readme MIT 6.5 MiB
Languages
Rust 94.5%
C 5.2%
Shell 0.3%