Servlin

crates.io version license: Apache 2.0 unsafe forbidden pipeline status

A modular HTTP server library in Rust.

Features

Limitations

Examples

Complete examples: examples/.

Simple example: ```rust use serde::Deserialize; use serdejson::json; use servlin::{ printlogresponse, socketaddr127001, HttpServerBuilder, Request, Response }; use servlin::reexport::{safinaexecutor, safinatimer}; use std::sync::Arc; use temp_dir::TempDir;

struct State {}

fn hello(_state: Arc, req: &Request) -> Result { #[derive(Deserialize)] struct Input { name: String, } let input: Input = req.json()?; Ok(Response::json(200, json!({"message": format!("Hello, {}!", input.name)})) .unwrap()) }

fn handle_req(state: Arc, req: &Request) -> Result { match (req.method(), req.url().path()) { ("GET", "/ping") => Ok(Response::text(200, "ok")), ("POST", "/hello") => hello(state, req), _ => Ok(Response::text(404, "Not found")), } }

let state = Arc::new(State {}); let requesthandler = move |req: Request| { printlogresponse(&req, handlereq(state, &req)) }; let cachedir = TempDir::new().unwrap(); safinatimer::starttimerthread(); let executor = safinaexecutor::Executor::new(1, 9).unwrap(); executor.blockon( HttpServerBuilder::new() .listenaddr(socketaddr127001(8009)) .maxconns(1000) .smallbodylen(64 * 1024) .receivelargebodies(cachedir.path()) .spawnandjoin(request_handler) ).unwrap(); ```

Cargo Geiger Safety Report

```

Metric output format: x/y x = unsafe code used by the build y = total unsafe code found in the crate

Symbols: 🔒 = No unsafe usage found, declares #![forbid(unsafecode)] ❓ = No unsafe usage found, missing #![forbid(unsafecode)] ☢️ = unsafe usage found

Functions Expressions Impls Traits Methods Dependency

0/0 0/0 0/0 0/0 0/0 🔒 servlin 0.1.2 0/0 4/4 0/0 0/0 2/2 ☢️ ├── async-fs 1.6.0 │ [build-dependencies] 0/0 0/0 0/0 0/0 0/0 ❓ │ └── autocfg 1.1.0 4/4 91/91 16/16 0/0 1/1 ☢️ │ ├── async-lock 2.7.0 0/0 106/116 4/8 0/0 0/0 ☢️ │ │ └── event-listener 2.5.3 0/0 28/28 4/4 0/0 0/0 ☢️ │ ├── blocking 1.3.1 0/0 0/0 0/0 0/0 0/0 🔒 │ │ ├── async-channel 1.8.0 0/0 168/168 2/2 0/0 1/1 ☢️ │ │ │ ├── concurrent-queue 2.2.0 4/4 32/94 4/16 0/0 0/3 ☢️ │ │ │ │ └── crossbeam-utils 0.8.15 0/0 0/0 0/0 0/0 0/0 ❓ │ │ │ │ └── cfg-if 1.0.0 0/0 106/116 4/8 0/0 0/0 ☢️ │ │ │ ├── event-listener 2.5.3 0/0 37/37 2/2 0/0 0/0 ☢️ │ │ │ └── futures-core 0.3.28 4/4 91/91 16/16 0/0 1/1 ☢️ │ │ ├── async-lock 2.7.0 1/1 858/858 4/4 0/0 12/12 ☢️ │ │ ├── async-task 4.4.0 0/0 33/33 2/2 0/0 0/0 ☢️ │ │ ├── atomic-waker 1.1.1 0/0 0/0 0/0 0/0 0/0 🔒 │ │ ├── fastrand 1.9.0 0/0 0/0 0/0 0/0 0/0 ❓ │ │ ├── futures-lite 1.13.0 0/0 0/0 0/0 0/0 0/0 🔒 │ │ │ ├── fastrand 1.9.0 0/0 37/37 2/2 0/0 0/0 ☢️ │ │ │ ├── futures-core 0.3.28 0/0 0/0 0/0 0/0 0/0 ❓ │ │ │ ├── futures-io 0.3.28 36/37 2067/2144 0/0 0/0 21/21 ☢️ │ │ │ ├── memchr 2.5.0 1/24 10/449 0/2 0/0 5/50 ☢️ │ │ │ │ └── libc 0.2.141 0/0 0/0 0/0 0/0 0/0 🔒 │ │ │ ├── parking 2.1.0 0/0 11/165 0/0 0/0 2/2 ☢️ │ │ │ ├── pin-project-lite 0.2.9 0/0 21/21 0/0 0/0 4/4 ☢️ │ │ │ └── waker-fn 1.1.0 1/1 16/18 1/1 0/0 0/0 ☢️ │ │ └── log 0.4.17 0/0 0/0 0/0 0/0 0/0 ❓ │ │ ├── cfg-if 1.0.0 0/0 5/5 0/0 0/0 0/0 ☢️ │ │ └── serde 1.0.159 0/0 0/0 0/0 0/0 0/0 ❓ │ │ └── serdederive 1.0.159 0/0 15/15 0/0 0/0 3/3 ☢️ │ │ ├── proc-macro2 1.0.56 0/0 4/4 0/0 0/0 0/0 ☢️ │ │ │ └── unicode-ident 1.0.8 0/0 0/0 0/0 0/0 0/0 ❓ │ │ ├── quote 1.0.26 0/0 15/15 0/0 0/0 3/3 ☢️ │ │ │ └── proc-macro2 1.0.56 0/0 79/79 3/3 0/0 2/2 ☢️ │ │ └── syn 2.0.13 0/0 15/15 0/0 0/0 3/3 ☢️ │ │ ├── proc-macro2 1.0.56 0/0 0/0 0/0 0/0 0/0 ❓ │ │ ├── quote 1.0.26 0/0 4/4 0/0 0/0 0/0 ☢️ │ │ └── unicode-ident 1.0.8 0/0 0/0 0/0 0/0 0/0 ❓ │ └── futures-lite 1.13.0 0/0 0/0 0/0 0/0 0/0 🔒 ├── async-net 1.7.0 │ [build-dependencies] 0/0 0/0 0/0 0/0 0/0 ❓ │ └── autocfg 1.1.0 0/0 2/4 0/0 0/0 0/0 ☢️ │ ├── async-io 1.13.0 │ │ [build-dependencies] 0/0 0/0 0/0 0/0 0/0 ❓ │ │ └── autocfg 1.1.0 4/4 91/91 16/16 0/0 1/1 ☢️ │ │ ├── async-lock 2.7.0 0/0 0/0 0/0 0/0 0/0 ❓ │ │ ├── cfg-if 1.0.0 0/0 168/168 2/2 0/0 1/1 ☢️ │ │ ├── concurrent-queue 2.2.0 0/0 0/0 0/0 0/0 0/0 ❓ │ │ ├── futures-lite 1.13.0 1/1 16/18 1/1 0/0 0/0 ☢️ │ │ ├── log 0.4.17 0/0 0/0 0/0 0/0 0/0 🔒 │ │ ├── parking 2.1.0 0/1 11/250 5/16 1/4 0/5 ☢️ │ │ ├── polling 2.7.0 │ │ │ [build-dependencies] 0/0 0/0 0/0 0/0 0/0 ❓ │ │ │ └── autocfg 1.1.0 0/0 0/0 0/0 0/0 0/0 ❓ │ │ │ ├── cfg-if 1.0.0 1/24 10/449 0/2 0/0 5/50 ☢️ │ │ │ ├── libc 0.2.141 1/1 16/18 1/1 0/0 0/0 ☢️ │ │ │ └── log 0.4.17 44/360 1571/6038 1/2 0/0 6/21 ☢️ │ │ ├── rustix 0.37.11 0/0 0/0 0/0 0/0 0/0 ❓ │ │ │ ├── bitflags 1.3.2 0/0 32/100 0/0 0/0 0/0 ☢️ │ │ │ ├── errno 0.3.1 1/24 10/449 0/2 0/0 5/50 ☢️ │ │ │ │ └── libc 0.2.141 0/0 24/666 27/36 2/2 6/14 ☢️ │ │ │ ├── io-lifetimes 1.0.10 1/24 10/449 0/2 0/0 5/50 ☢️ │ │ │ │ ├── libc 0.2.141 3/6 540/673 2/4 0/0 3/4 ☢️ │ │ │ │ └── socket2 0.4.9 1/24 10/449 0/2 0/0 5/50 ☢️ │ │ │ │ └── libc 0.2.141 0/0 7/7 0/0 0/0 0/0 ☢️ │ │ │ ├── itoa 1.0.6 1/24 10/449 0/2 0/0 5/50 ☢️ │ │ │ └── libc 0.2.141 │ │ │ [build-dependencies] 0/1 0/201 0/2 0/0 0/4 ❓ │ │ │ └── cc 1.0.79 0/0 24/24 0/0 0/0 3/3 ☢️ │ │ ├── slab 0.4.8 │ │ │ [build-dependencies] 0/0 0/0 0/0 0/0 0/0 ❓ │ │ │ └── autocfg 1.1.0 0/0 5/5 0/0 0/0 0/0 ☢️ │ │ │ └── serde 1.0.159 3/6 540/673 2/4 0/0 3/4 ☢️ │ │ ├── socket2 0.4.9 0/0 21/21 0/0 0/0 4/4 ☢️ │ │ └── waker-fn 1.1.0 0/0 28/28 4/4 0/0 0/0 ☢️ │ ├── blocking 1.3.1 0/0 0/0 0/0 0/0 0/0 ❓ │ └── futures-lite 1.13.0 0/0 0/0 0/0 0/0 0/0 🔒 ├── fixed-buffer 0.5.0 0/0 0/0 0/0 0/0 0/0 ❓ │ └── futures-io 0.3.28 0/0 0/0 0/0 0/0 0/0 ❓ ├── futures-io 0.3.28 0/0 0/0 0/0 0/0 0/0 ❓ ├── futures-lite 1.13.0 0/0 0/0 0/0 0/0 0/0 ❓ ├── includedir 0.7.3 0/0 0/0 0/0 0/0 0/0 ❓ │ └── includedirmacros 0.7.3 0/0 15/15 0/0 0/0 3/3 ☢️ │ ├── proc-macro2 1.0.56 0/0 0/0 0/0 0/0 0/0 ❓ │ └── quote 1.0.26 0/0 0/0 0/0 0/0 0/0 🔒 ├── permit 0.1.5 0/0 0/0 0/0 0/0 0/0 🔒 ├── safe-regex 0.2.5 0/0 0/0 0/0 0/0 0/0 🔒 │ └── safe-regex-macro 0.2.5 0/0 0/0 0/0 0/0 0/0 🔒 │ ├── safe-proc-macro2 1.0.36 0/0 0/0 0/0 0/0 0/0 🔒 │ │ └── unicode-xid 0.2.4 0/0 0/0 0/0 0/0 0/0 🔒 │ └── safe-regex-compiler 0.2.5 0/0 0/0 0/0 0/0 0/0 🔒 │ ├── safe-proc-macro2 1.0.36 0/0 0/0 0/0 0/0 0/0 🔒 │ └── safe-quote 1.0.15 0/0 0/0 0/0 0/0 0/0 🔒 │ └── safe-proc-macro2 1.0.36 0/0 0/0 0/0 0/0 0/0 🔒 ├── safina-executor 0.3.3 0/0 0/0 0/0 0/0 0/0 🔒 │ ├── safina-sync 0.2.4 0/0 0/0 0/0 0/0 0/0 🔒 │ └── safina-threadpool 0.2.4 0/0 0/0 0/0 0/0 0/0 🔒 ├── safina-sync 0.2.4 0/0 0/0 0/0 0/0 0/0 🔒 ├── safina-timer 0.1.11 1/1 79/125 5/9 0/0 2/4 ☢️ │ └── oncecell 1.17.1 0/0 5/5 0/0 0/0 0/0 ☢️ ├── serde 1.0.159 0/0 4/7 0/0 0/0 0/0 ☢️ ├── serdejson 1.0.95 0/0 7/7 0/0 0/0 0/0 ☢️ │ ├── itoa 1.0.6 7/9 579/715 0/0 0/0 2/2 ☢️ │ ├── ryu 1.0.13 0/0 5/5 0/0 0/0 0/0 ☢️ │ └── serde 1.0.159 0/0 0/0 0/0 0/0 0/0 🔒 ├── serdeurlencoded 0.7.1 0/0 2/2 0/0 0/0 0/0 ☢️ │ ├── formurlencoded 1.1.0 0/0 3/3 0/0 0/0 0/0 ☢️ │ │ └── percent-encoding 2.2.0 0/0 7/7 0/0 0/0 0/0 ☢️ │ ├── itoa 1.0.6 7/9 579/715 0/0 0/0 2/2 ☢️ │ ├── ryu 1.0.13 0/0 5/5 0/0 0/0 0/0 ☢️ │ └── serde 1.0.159 0/0 0/0 0/0 0/0 0/0 🔒 ├── temp-dir 0.1.11 0/0 0/0 0/0 0/0 0/0 🔒 ├── temp-file 0.1.7 0/0 0/0 0/0 0/0 0/0 ❓ └── url 2.3.1 0/0 2/2 0/0 0/0 0/0 ☢️ ├── formurlencoded 1.1.0 0/0 0/0 0/0 0/0 0/0 ❓ ├── idna 0.3.0 0/0 5/5 0/0 0/0 0/0 ☢️ │ ├── unicode-bidi 0.3.13 0/0 5/5 0/0 0/0 0/0 ☢️ │ │ └── serde 1.0.159 0/0 20/20 0/0 0/0 0/0 ☢️ │ └── unicode-normalization 0.1.22 0/0 0/0 0/0 0/0 0/0 🔒 │ └── tinyvec 1.6.0 0/0 5/5 0/0 0/0 0/0 ☢️ │ ├── serde 1.0.159 0/0 0/0 0/0 0/0 0/0 🔒 │ └── tinyvecmacros 0.1.1 0/0 3/3 0/0 0/0 0/0 ☢️ ├── percent-encoding 2.2.0 0/0 5/5 0/0 0/0 0/0 ☢️ └── serde 1.0.159

102/449 6488/13169 82/129 3/6 75/158

```

Alternatives

See rust-webserver-comparison.md.

Changelog

TO DO

License: MIT OR Apache-2.0