6 releases
0.0.6 | Mar 27, 2021 |
---|---|
0.0.5 | Mar 27, 2021 |
0.0.4 | Sep 25, 2020 |
0.0.2 | Aug 11, 2020 |
0.0.1 | Jul 20, 2020 |
#1204 in HTTP server
21 downloads per month
59KB
748 lines
Amiya
Amiya is a experimental middleware-based minimalism async HTTP server framework,
built up on smol-rs
related asynchronous components.
It's currently still working in progress and in a very early alpha stage.
API design may changes, DO NOT use it in any condition except for test or study!
Goal
The goal of this project is try to build a (by importance order):
- Safe, with
#![forbid(unsafe_code)]
- Async
- Middleware-based
- Minimalism
- Easy to use
- Easy to extend
HTTP framework for myself to write simple web services.
Amiya uses async-h1
to parse and process requests, so only HTTP version 1.1 is supported for
now. HTTP 1.0 or 2.0 is not in goal list, at least in the near future.
Performance is NOT in the list too, after all, Amiya is just a experimental for now, it uses
many heap alloc (Box) and dynamic dispatch (Trait Object) so there may be some performance loss
compare to use async-h1
directly.
Have a Taste
To start a very simple HTTP service that returns Hello World
to the client in all paths:
use amiya::m;
fn main() {
let app = amiya::new().uses(m!(ctx =>
ctx.resp.set_body(format!("Hello World from: {}", ctx.path()));
));
app.listen("[::]:8080").unwrap();
// ... do other things you want ...
// ... Amiya server will not block your thread ...
}
Amiya has a built-in multi-thread async executor powered by async-executor
and async-io
, http server will run
in it. So Amiya::listen
is just a normal non-async method, and do not block your thread.
Examples
To run examples, run
cargo run --example # show example list
cargo run --example hello # run hello
Top level document of crate has a brief description of concepts used in this framework, I recommend give it a read first, and then check those examples to get a more intuitive understanding:
- Understand onion model of Amiya middleware system:
examples/middleware.rs
- Use a custom type as middleware:
examples/measurer.rs
- Store extra data in context:
examples/extra.rs
- Use
Router
middleware for request diversion:examples/router.rs
- Parse query string to json value or custom struct:
examples/query.rs
- Parse body(www-form-urlencoded) to json value or custom struct:
examples/urlencoded.rs
- Match part of path as an argument:
examples/arg.rs
- Use another Amiya app as middleware:
examples/subapp.rs
- Stop Amiya server by using
listen
returned signal sender:examples/stop.rs
Most of those example will use builtin executor, see example/tokio_executor.rs
for how to use a custom executor with Amiya.
License
BSD 3-Clause Clear License, See LICENSE
.
Dependencies
~8–21MB
~284K SLoC