Statically track the status of a Response by using a Phantom Type

Introduces two Phantom Types, Fresh and Streaming, which indicate the status
of a Response.

Response::start translates an Response<Fresh> into a
Response<Streaming> by writing the StatusCode and Headers.

Response<Fresh> allows modification of Headers and StatusCode, but does
not allow writing to the body. Response<Streaming> has the opposite privileges.
This commit is contained in:
Jonathan Reem
2014-09-08 14:04:51 -07:00
parent fd6b014e7e
commit 872dcf758c
3 changed files with 57 additions and 28 deletions

View File

@@ -4,7 +4,7 @@ use std::io::{Acceptor, Listener, IoResult, EndOfFile, IncomingConnections};
use std::io::net::ip::{IpAddr, Port, SocketAddr};
pub use self::request::Request;
pub use self::response::Response;
pub use self::response::{Response, Fresh, Streaming};
pub mod request;
pub mod response;
@@ -55,8 +55,8 @@ pub struct Incoming<'a> {
from: IncomingConnections<'a, TcpAcceptor>
}
impl<'a> Iterator<(Request, Response)> for Incoming<'a> {
fn next(&mut self) -> Option<(Request, Response)> {
impl<'a> Iterator<(Request, Response<Fresh>)> for Incoming<'a> {
fn next(&mut self) -> Option<(Request, Response<Fresh>)> {
for conn in self.from {
match conn {
Ok(stream) => {