# Rust_Homework **Repository Path**: dalewu/Rust_Homework ## Basic Information - **Project Name**: Rust_Homework - **Description**: This is an async web framework. - **Primary Language**: Rust - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-12-15 - **Last Updated**: 2023-11-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Rust_Homework This is an async web framework. ## 任务 设计并实现一款基于rust的简易异步web框架 - 本项目学习并模仿tokio团队开发的axum异步框架(https://github.com/tokio-rs/axum) - 项目使用了http库(httpbody,httpparse) - 项目基于hyper server,tower service等 ## 功能 - 多路由匹配,链式调用 - 动态路由匹配 - Query, header… - 支持常用http method - 简易的错误处理 - ... ## 使用 examples目录下编写了用于验证的hello world程序,运行方式如下: ``` cd .\examples\hello_world\ cargo run ``` ## 模块 本项目重点关注以下三个模块: ### router router模块用于实现路由功能,其对tower service trait进行包装,支持链式调用API以及异步运行。路径匹配方面,本项目使用正则表达式。 - 异步实现原理: RoutFuture 结构体包括两种状态:由 RouteFutureInner 枚举的 A 和 B 变量表示。A 状态表示主服务,B 状态表示callback 服务。 当 RouteFuture 处于 A 状态时,它将尝试使用主服务来处理传入的请求,如果主服务无法处理传入的请求(例如,主服务返回了错误),RouteFuture 将转换为 B 状态,并尝试使用 call back 服务来解析请求。 - 优势: 1. poll 的机制允许程序在不阻塞当前线程的情况下获取 router 处理后的结果。 2. 可以实例化多个 router,并发运行,容易实现高并发的代码。 3. 可以方便实现 timeout 机制,取消运行时间过长的 router。 ### handle handle模块用于实现请求处理功能。 - http method 对于不同的HTTP method,不采用传统的枚举方式,然后用match进行匹配的方式。而是使用二进制位来表示,这样更加灵活链式调用 - 链式调用: 与router相似,定义结构体OnMethod,OnMethod也是一种service的trait的实现。定义on方法返回OnMethod实例,get、post这样的函数都是返回OnMethod形成链式调用。 实现service时,根据request中的method进行匹配,并构造返回OnMethodFuture,会交给启动着的异步运行时做进一步计算. ### extract extract模块用于实现数据提取功能。 在extracter文件中。from request trait的语义行为是一个类型转换。因为我们在底层使用的是http库的request,所以在框架里要操作request要把http底层的request 里面的内容和数据提取出来,把请求里面的参数转换成rust里面的类型(可变参数的可变引用)。 - 逻辑: 当一个请求过来,最后返回一个result类型,正常情况下要返回一个response,出现错误会统一返回一个rejection。 - requestparts: 解析一个request的数据。B相当于是body。包含方法,rul,version,heders(是一个哈希map,这个是复用http库)。如果后续需要其它解析数据的支持,我们在后面预留了extensions进行以后的扩展。 ## 作者 - 武昊天 - 姜博文 - 袁麒景 - 杨睿祈 https://gitee.com/dalewu/Rust_Homework