2个版本

0.1.1 2024年8月3日
0.1.0 2024年7月21日
0.0.2 2024年5月15日
0.0.1 2024年5月14日
0.0.0 2023年11月19日

#102HTTP服务器

Download history 236/week @ 2024-05-12 28/week @ 2024-05-19 2/week @ 2024-05-26 4/week @ 2024-06-09 1/week @ 2024-06-16 1/week @ 2024-06-30 6/week @ 2024-07-07 131/week @ 2024-07-21 107/week @ 2024-07-28 48/week @ 2024-08-04 6/week @ 2024-08-11

每月292次下载

MIT/Apache

635KB
18K SLoC

Argan

Crates.io Test status Documentation

Rust的Web框架。

特性

  • 静态、正则表达式和通配符URI组件模式。
  • 资源和处理器扩展。
  • 请求数据提取器和自定义守卫支持。
  • 支持范围请求、multipart/byteranges、预编码文件和动态编码的静态文件流。
  • 服务器端事件。
  • WebSocket。
  • 与Tower兼容的灵活中间件系统。
  • 灵活的错误处理。

使用示例

Cargo.toml

[dependencies]
argan = "0.1"
hyper-util = { version = "0.1", features = ["server-auto", "tokio"] }
serde = { version = "1", features = ["derive"] }
tokio = { version = "1", features = ["rt-multi-thread", "macros"] }

main.rs

use std::time::Duration;

use argan::{
	data::{form::Form, json::Json},
	middleware::RedirectionLayer,
	prelude::*,
};

use hyper_util::{rt::TokioExecutor, server::conn::auto::Builder};
use serde::{Deserialize, Serialize};

// --------------------------------------------------------------------------------

#[derive(Deserialize)]
struct Credentials {
	// ...
}

#[derive(Serialize)]
struct Token {
	jwt: String,
}

async fn login(Form(credential): Form<Credentials>) -> Json<Token> {
	// ...

	let token = Token {
		jwt: "JWT".to_owned(),
	};

	Json(token)
}

async fn echo(request_head: RequestHead) -> String {
	request_head.subtree_path_segments().to_owned()
}

// --------------------------------------------------

#[tokio::main]
async fn main() -> Result<(), BoxedError> {
	let mut router = Router::new();

	let mut root = Resource::new("http://www.example.com/");
	root.set_handler_for(Method::GET.to(|| async { "Hello, World!" }));

	// Subresources can be created from a parent node (`Resource`, `Router`).
	root
		.subresource_mut("/login")
		.set_handler_for(Method::POST.to(login));

	router.add_resource(root);

	router
		.resource_mut("http://example.com/")
		.wrap(
			RequestReceiver.component_in(RedirectionLayer::for_permanent_redirection_to_prefix(
				"http://www.example.com/",
			)),
		);

	// A hostless resource responds to requests targeting any other host that
	// the router doesn't include.
	//
	// With the question mark '?' following its pattern, the resource accepts
	// a request with or without a trailing slash '/'. With asterisk '*', it
	// accepts requests that target non-existent subresources.
	router
		.resource_mut("/echo ?*")
		.set_handler_for(Method::GET.to(echo));

	let arc_service = router.into_arc_service();

	let connection_builder = Builder::new(TokioExecutor::new());

	Server::new(connection_builder)
		.with_graceful_shutdown_duration(Duration::from_secs(3))
		.serve(arc_service, "127.0.0.1:8000")
		.await
		.map_err(Into::into)
}

注意

目前,Argan尚未在Windows上进行测试。

贡献

您有意提交的任何贡献,只要包含在Argan中,都必须像Argan一样双重许可,在MIT许可证和Apache许可证版本2.0下,没有附加条款或条件。

许可证

Argan可以在您的选择下双重许可,要么是MIT许可证,要么是Apache许可证版本2.0

依赖项

~5–18MB
~301K SLoC