11 releases

0.2.7 Feb 27, 2024
0.2.6 Jan 26, 2024
0.2.2 Dec 14, 2023
0.2.0 Nov 9, 2023
0.1.0 Sep 16, 2023

#423 in HTTP server

Download history 22/week @ 2024-01-07 41/week @ 2024-01-14 22/week @ 2024-01-21 2/week @ 2024-01-28 19/week @ 2024-02-18 212/week @ 2024-02-25 13/week @ 2024-03-03 42/week @ 2024-03-10 10/week @ 2024-03-17 164/week @ 2024-03-31

217 downloads per month
Used in wmproxy

Apache-2.0

315KB
7.5K SLoC

wenmeng

一个包含http1.1及http2的服务器及客户端的实现, 依赖tokio实现

使用方法

简单的hello world示例

use std::{env, error::Error};
use tokio::net::TcpListener;
use webparse::{Request, Response};
use wenmeng::{self, ProtResult, RecvStream, Server, RecvRequest};

#[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 {
            let mut server = Server::new(stream);
            async fn operate(req: RecvRequest) -> ProtResult<Option<Response<String>>> {
                let response = Response::builder()
                    .version(req.version().clone())
                    .body("Hello World".to_string())?;
                Ok(Some(response))
            }
            let _ = server.incoming(operate).await;
        });
    }
}

客户端使用方法

http1/http2通用, recv可以接收多个返回及服务端的推送信息

use webparse::Request;
use wenmeng::{Client, ProtResult};

async fn test_http2() -> ProtResult<()> {
    let url = "http://nghttp2.org/"; //"http://127.0.0.1:8080/"
    let req = Request::builder().method("GET").url(url).body("").unwrap();

    let client = Client::builder().connect(url).await.unwrap();

    let (mut recv, sender) = client.send2(req.into_type()).await?;
    let mut res = recv.recv().await.unwrap();
    res.body_mut().wait_all().await;
    println!("res = {}", res);

    let req = Request::builder()
        .method("GET")
        .url(url.to_owned() + "blog/")
        .body("")
        .unwrap();
    sender.send(req.into_type()).await?;
    let res = recv.recv().await.unwrap();
    println!("res = {}", res);
    Ok(())
}

License

Apache License, Version 2.0 (LICENSE-APACHE or https://apache.org/licenses/LICENSE-2.0)

Dependencies

~22–33MB
~732K SLoC