1个不稳定版本

0.1.0 2023年8月27日

#21 in #http-parser

MIT许可证

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仓库

无运行时依赖