#web-server #http-1 #http-3 #http2 #http

scuffle-http

A high-performance HTTP server supporting HTTP/1.1, HTTP/2, and HTTP/3

9 unstable releases (3 breaking)

Uses new Rust 2024

new 0.3.1 May 17, 2025
0.3.0 May 15, 2025
0.2.1 Apr 27, 2025
0.2.0 Feb 21, 2025
0.0.0 Nov 28, 2024

#1036 in Network programming

Download history 1/week @ 2025-01-26 23/week @ 2025-02-02 293/week @ 2025-02-09 159/week @ 2025-02-16 43/week @ 2025-02-23 34/week @ 2025-03-02 14/week @ 2025-03-09 12/week @ 2025-03-16 3/week @ 2025-03-23 4/week @ 2025-04-06 3/week @ 2025-04-13 133/week @ 2025-04-27 22/week @ 2025-05-04 171/week @ 2025-05-11

326 downloads per month
Used in 2 crates

MIT/Apache

130KB
2K SLoC

scuffle-http

[!WARNING]
This crate is under active development and may not be stable.

License: MIT OR Apache-2.0 docs.rs crates.io GitHub Actions: ci Codecov


An HTTP server with support for HTTP/1, HTTP/2 and HTTP/3.

It abstracts away hyper and h3 to provide a rather simple interface for creating and running a server that can handle all three protocols.

See the examples directory for usage examples.

See the changelog for a full release history.

Feature flags

  • tracing — Enables tracing support
  • http1 (enabled by default) — Enables http1 support
  • http2 (enabled by default) — Enabled http2 support
  • http3 — Enables http3 support
  • tls-rustls — Enables tls via rustls
  • http3-tls-rustls — Alias for [“http3”, “tls-rustls”]
  • tower (enabled by default) — Enables tower service support
  • docs — Enables changelog and documentation of feature flags

Why do we need this?

This crate is designed to be a simple and easy to use HTTP server that supports HTTP/1, HTTP/2 and HTTP/3.

Currently, there are simply no other crates that provide support for all three protocols with a unified API. This crate aims to fill that gap.

Example

The following example demonstrates how to create a simple HTTP server (without TLS) that responds with “Hello, world!” to all requests on port 3000.

let service = scuffle_http::service::fn_http_service(|req| async move {
    scuffle_http::Response::builder()
        .status(scuffle_http::http::StatusCode::OK)
        .header(scuffle_http::http::header::CONTENT_TYPE, "text/plain")
        .body("Hello, world!".to_string())
});
let service_factory = scuffle_http::service::service_clone_factory(service);

scuffle_http::HttpServer::builder()
    .service_factory(service_factory)
    .bind("[::]:3000".parse().unwrap())
    .build()
    .run()
    .await
    .expect("server failed");

Missing Features

  • HTTP/3 webtransport support
  • Upgrading to websocket connections from HTTP/3 connections (this is usually done via HTTP/1.1 anyway)

License

This project is licensed under the MIT or Apache-2.0 license. You can choose between one of them if you use this work.

SPDX-License-Identifier: MIT OR Apache-2.0

Dependencies

~5–27MB
~482K SLoC