HttpServerBuilder

Struct HttpServerBuilder 

Source
pub struct HttpServerBuilder { /* private fields */ }
Expand description

Builds an HTTP server.

Implementations§

Source§

impl HttpServerBuilder

Source

pub fn new() -> Self

Makes a new builder these default settings:

  • Listens on 127.0.0.1
  • Picks a random port
  • 100 max connections
  • 64 KiB small body length
  • no cache dir, server rejects large request bodies
Source

pub fn listen_addr(self, addr: SocketAddr) -> Self

Source

pub fn max_conns(self, n: usize) -> Self

Sets the maximum number of connections to handle at one time.

When the server is handling the maximum number of connections, it waits for a connection to drop before accepting new ones.

Each connection uses a file handle. Some processes run with a limit on the number of file handles. The OS kernel also has a limit for all processes combined.

§Panics

Panics when n is zero.

Source

pub fn receive_large_bodies(self, cache_dir: &Path) -> Self

Save large request bodies to this directory.

If you do not call this method, the server will refuse all requests with bodies larger than small_body_len with 413 Payload Too Large. It will also refuse all bodies with unknown length.

§Example
use servlin::{HttpServerBuilder, Request, Response};
use std::io::Read;

let cache_dir = temp_dir::TempDir::new().unwrap();
let handler = move |req: Request| {
    if req.body.is_pending() {
        return Response::get_body_and_reprocess(1024 * 1024);
    }
    let len = req.body.reader().unwrap().bytes().count();
    Response::text(200, format!("body len={}", len))
};
safina::timer::start_timer_thread();
safina::executor::Executor::new(1, 1)
  .unwrap()
  .block_on(
    HttpServerBuilder::new()
      .receive_large_bodies(cache_dir.path())
      .spawn_and_join(handler)
  )
  .unwrap();
Source

pub fn small_body_len(self, n: usize) -> Self

Automatically receive request bodies up to length n, saving them in memory.

The default value is 64 KiB.

Reject larger requests with 413 Payload Too Large. See receive_large_bodies.

You can estimate the server memory usage with: small_body_len * max_conns. Using the default settings: 64 KiB * 100 connections => 6.4 MiB.

Source

pub fn permit(self, p: Permit) -> Self

Sets the permit used by the server.

Revoke the permit to make the server gracefully shut down.

§Example
use std::net::SocketAddr;
use std::sync::Arc;
use permit::Permit;    
use safina::executor::Executor;
use servlin::{Response, HttpServerBuilder};

safina::timer::start_timer_thread();
let executor: Arc<Executor> = Arc::default();
let permit = Permit::new();
let (addr, stopped_receiver) = executor.block_on(
    HttpServerBuilder::new()
        .permit(permit.new_sub())
        .spawn(move |req| Response::text(200, "yo"))
).unwrap();
do_some_requests(addr).unwrap();
drop(permit); // Tell server to shut down.
stopped_receiver.recv().unwrap(); // Wait for server to stop.
Source

pub async fn spawn<F>( self, request_handler: F, ) -> Result<(SocketAddr, Receiver<()>), Error>
where F: FnOnce(Request) -> Response + 'static + Clone + Send + Sync,

Spawns the server task.

Returns (addr, stopped_receiver). The server is listening on addr. After the server gracefully shuts down, it sends a message on stopped_receiver.

§Errors

Returns an error when it fails to bind to the listen_addr.

Source

pub async fn spawn_and_join<F>(self, request_handler: F) -> Result<(), Error>
where F: FnOnce(Request) -> Response + 'static + Clone + Send + Sync,

Spawns the server task and waits for it to shutdown gracefully.

§Errors

Returns an error when it fails to bind to the listen_addr.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more