marla

Crates.iomarla
lib.rsmarla
version0.1.0-alpha.1
sourcesrc
created_at2021-02-10 05:07:13.434512
updated_at2021-02-20 03:18:34.120924
descriptionAsync Web Server Framework
homepage
repositoryhttps://github.com/MarkSort/marla
max_upload_size
id353079
size21,668
(MarkSort)

documentation

README

Marla - Async Web Server Framework for Rust

Marla is a handler and middleware based web server framework for Rust.

Handlers can be called based on static path maps, regex based paths, and fully custom router functions.

Middleware can be configured to run for all requests by default and overridden for specific routes.

Example

You can run this example in examples/hello and browse to http://localhost:3000/hello/world , or use curl:

curl -sS http://localhost:3000/hello/world -D-

Cargo.toml:

[dependencies]
hyper = { version = "0.14", features = ["full"] }
macro_rules_attribute = "0.0"
marla = "0.1.0-alpha.1"
regex = "1.4"
tokio = { version = "1.0",  features = ["full"] }

main.rs:

use std::net::SocketAddr;

use hyper::{Body, Method, Response};
use macro_rules_attribute::macro_rules_attribute;
use marla::{Request, serve, async_handler};
use marla::config::{MarlaConfig, RegexPath, Route};
use regex::Regex;

#[tokio::main]
async fn main() {
    let marla_config = MarlaConfig {
        routers: vec![Box::new(vec![
            RegexPath{ regex: Regex::new("^/hello/([a-zA-Z]{1,30})$").unwrap(), routes: vec![
                (Method::GET, Route { handler: hello, middleware: None }),
            ].into_iter().collect()},
        ])],

        middleware: vec![],
        listen_addr: SocketAddr::from(([127, 0, 0, 1], 3000)),
    };

    serve(marla_config, ()).await;
}

#[macro_rules_attribute(async_handler!)]
pub async fn hello(
    request: Request,
    _body: Option<Body>,
    _bundle: (),
) -> Response<Body> {
    Response::new(Body::from(format!("Hello, {}\n", request.path_params[0])))
}

Features

  • Three ways to route requests to handlers
    • Static Paths
    • Regex Paths - captured patterns are passed to the handler
    • Custom Router Function - for example, check a database for dynamic paths
  • Automatic HTTP 404 responses when paths are not found, and HTTP 405 when methods are not supported
  • Panics (unwinding) in handlers or middleware will return HTTP 500 responses
  • Post-Routing / Pre-Handler Middleware
    • You provide a default list of Middleware to run for all requests
    • Override the default Middleware for individual routes
    • Middleware can send custom responses, preventing call to handlers
  • App defined "Bundle" can be modified by Middleware and is passed to all requests. Example properties:
    • Database Connection Pools
    • Validated Authentication / Authorization Details
    • Parsed Request Bodies
  • Handlers and middleware can initiate graceful server shutdown

Future Enhancements

  • Documentation, examples, documentation... documentation
  • More Tests
  • Configurable Logging
  • More Middleware types
    • Post-Connection / Pre-Request-Received
    • Post-Request-Received / Pre-Routing
    • Post-Handler / Pre-Response-Sent
  • Make built-in error responses customizable
  • Replace or re-export http/hyper types, etc.
  • Macros for easier to read handler configuration
Commit count: 0

cargo fmt