1个不稳定版本
0.1.0 | 2023年8月27日 |
---|
#21 in #http-parser
16KB
361 行
ProtOrbit HTTP库
ProtOrbit是一个轻量级的Rust HTTP库,提供了解析和生成HTTP请求和响应的功能。目前,该库专注于解析HTTP消息,但设计上可以扩展以在未来添加更多功能。
安装
将以下行添加到您的Cargo.toml
文件中,以将ProtOrbit包含到您的项目中
[dependencies]
protorbit = "0.1.0"
用法
ProtOrbit提供了一个简单的API来处理HTTP消息。以下是如何使用ProtOrbit来处理标准库和Tokio运行时的传入HTTP请求的两个示例。
您可以通过克隆仓库并运行以下命令来运行此示例:cargo run --example=[async|std]
标准库示例
use protorbit::http;
use std::collections::HashMap;
use std::io::{Read, Write};
use std::net::{TcpListener, TcpStream};
fn main() {
let listener = TcpListener::bind("127.0.0.1:8080").unwrap();
for stream in listener.incoming() {
let stream = stream.unwrap();
println!("Connection established!");
handle(stream);
}
}
fn handle(mut stream: TcpStream) {
let mut buffer: [u8; 1024] = [0; 1024];
stream.read(&mut buffer).unwrap();
let request = http::Request::from_string(String::from_utf8(buffer.to_vec()).unwrap()).unwrap();
let mut response_headers = HashMap::new();
response_headers.insert("Content-Type".to_string(), "text/plain".to_string());
let response = http::Response::new(
http::Version::HTTP1_1,
http::StatusCode::NotFound,
response_headers,
format!("Error 404: {} NotFound", request.path),
);
stream.write(response.to_string().as_bytes()).unwrap();
}
Tokio示例
use protorbit::http;
use std::collections::HashMap;
use std::env;
use std::error::Error;
use tokio::net::TcpListener;
use tokio::net::TcpStream;
#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
let addr = env::args()
.nth(1)
.unwrap_or_else(|| "127.0.0.1:8080".to_string());
let server = TcpListener::bind(&addr).await?;
println!("Listening on: {}", addr);
loop {
let (stream, _) = server.accept().await?;
tokio::spawn(async move {
println!("Accepted connection from {}", stream.peer_addr().unwrap());
if let Err(e) = handle(stream).await {
println!("failed to process connection; error = {}", e);
}
});
}
}
async fn handle(stream: TcpStream) -> Result<(), Box<dyn Error>> {
let mut buffer = [0; 1024];
stream.try_read(&mut buffer)?;
let request = http::Request::from_string(String::from_utf8_lossy(&buffer)).unwrap();
println!("{:#?}", request);
let mut response_headers = HashMap::new();
response_headers.insert("Content-Type".to_string(), "text/plain".to_string());
let response = http::Response::new(
http::Version::HTTP1_1,
http::StatusCode::NotFound,
response_headers,
format!("Error 404: {} NotFound", request.path),
);
stream.try_write(response.to_string().as_bytes())?;
Ok(())
}
未来计划
虽然ProtOrbit目前专注于HTTP消息解析,但未来版本的库将扩展以包括更多功能和功能,使其在处理各种HTTP相关任务时更加强大和灵活。
许可证
本项目遵循MIT许可证条款。
有关任何问题、问题或贡献,请参阅项目的GitHub仓库。