Struct solicit::server::SimpleServer [] [src]

pub struct SimpleServer<TS, H> where TS: TransportStream, H: FnMut(ServerRequest) -> Response {
    // some fields omitted
}

The struct implements a simple HTTP/2 server that allows users to register a request handler (a callback taking a ServerRequest and returning a Response) which is run on all received requests.

The handle_next method needs to be called regularly in order to have the server process received frames, as well as send out the responses.

This is an exceedingly simple implementation of an HTTP/2 server and is mostly an example of how the solicit::http API can be used to make one.

Examples

extern crate solicit;
use std::str;
use std::net::{TcpListener, TcpStream};
use std::thread;

use solicit::server::SimpleServer;

use solicit::http::Response;

fn main() {
    fn handle_client(stream: TcpStream) {
        let mut server = SimpleServer::new(stream, |req| {
            println!("Received request:");
            for header in req.headers.iter() {
                println!("  {}: {}",
                str::from_utf8(&header.0).unwrap(),
                str::from_utf8(&header.1).unwrap());
            }
            println!("Body:\n{}", str::from_utf8(&req.body).unwrap());

            // Return a dummy response for every request
            Response {
                headers: vec![
                    (b":status".to_vec(), b"200".to_vec()),
                    (b"x-solicit".to_vec(), b"Hello, World!".to_vec()),
                ],
                body: vec![65],
                stream_id: req.stream_id,
           }
        }).unwrap();
        while let Ok(_) = server.handle_next() {}
        println!("Server done (client disconnected)");
    }

    let listener = TcpListener::bind("127.0.0.1:8080").unwrap();
    for stream in listener.incoming() {
        let stream = stream.unwrap();
        thread::spawn(move || {
            handle_client(stream)
        });
    }
}

Methods

impl<TS, H> SimpleServer<TS, H> where TS: TransportStream, H: FnMut(ServerRequest) -> Response

fn new(stream: TS, handler: H) -> HttpResult<SimpleServer<TS, H>>

Creates a new SimpleServer that will use the given TransportStream to communicate to the client. Assumes that the stream is fully uninitialized -- no preface sent or read yet.

fn handle_next(&mut self) -> HttpResult<()>

Handles the next incoming frame, blocking to receive it if nothing is available on the underlying stream.

Handling the frame can trigger the handler callback. Any responses returned by the handler are immediately flushed out to the client (blocking the call until it's done).