5 releases

0.2.3 Sep 28, 2024
0.2.2 Sep 28, 2024
0.2.1 Sep 28, 2024
0.2.0 Sep 28, 2024
0.1.0 Aug 27, 2023

#1489 in Network programming

Download history 485/week @ 2024-09-28 16/week @ 2024-10-05 5/week @ 2024-10-12

102 downloads per month

MIT license

17KB
362 lines

ProtOrbit HTTP Library

ProtOrbit is a lightweight HTTP library for Rust that provides functionality for parsing and generating HTTP requests and responses. Currently, the library focuses on parsing HTTP messages, but it is designed to be extended with additional features in the future.

Installation

Add the following line to your Cargo.toml file to include ProtOrbit in your project:

[dependencies]
protorbit = "0.2.3"

Usage

ProtOrbit provides a simple API for working with HTTP messages. Here are two examples of how to use ProtOrbit to handle incoming HTTP requests using the standard library and the Tokio runtime.

You can run these examples cloning the repo and running cargo run --example=[async|std]

Standard Library Example

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() {
        match stream {
            Ok(stream) => handle(stream),
            Err(err) => {
                eprintln!("STREAM ERROR: {}", err);
            }
        }
    }
}

fn handle(mut stream: TcpStream) {
    let mut buffer: [u8; 1024] = [0; 1024];
    let n = stream.read(&mut buffer).unwrap();
    let request =
        http::Request::try_from(String::from_utf8(buffer[0..n].to_vec()).unwrap()).unwrap();

    let mut response_headers = HashMap::new();
    response_headers.insert("Content-Type".to_string(), "text/html".to_string());

    let response = http::Response::new(
        http::Version::HTTP1_1,
        http::StatusCode::NotFound,
        "Not Found".into(),
        response_headers,
        format!("Error 404: {} NotFound", request.path),
    );

    let _ = stream.write(Into::<String>::into(response).as_bytes());
}

Tokio Example

use protorbit::http;
use std::collections::HashMap;
use std::env;
use std::error::Error;
use tokio::io::AsyncReadExt;
use tokio::io::AsyncWriteExt;
use tokio::net::TcpListener;
use tokio::net::TcpStream;

#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
    // Parse the arguments, bind the TCP socket we'll be listening to, spin up
    // our worker threads, and start shipping sockets to those worker threads.
    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 {
            handle(stream).await;
        });
    }
}

async fn handle(mut stream: TcpStream) {
    let mut buffer: [u8; 1024] = [0; 1024];
    let n = stream.read(&mut buffer).await.unwrap();
    let request =
        http::Request::try_from(String::from_utf8(buffer[0..n].to_vec()).unwrap()).unwrap();

    let mut response_headers = HashMap::new();
    response_headers.insert("Content-Type".to_string(), "text/html".to_string());

    let response = http::Response::new(
        http::Version::HTTP1_1,
        http::StatusCode::NotFound,
        "Not Found".into(),
        response_headers,
        format!("Error 404: {} NotFound", request.path),
    );

    let _ = stream
        .write(Into::<String>::into(response).as_bytes())
        .await;
}

Future Plans

While ProtOrbit currently focuses on HTTP message parsing, future versions of the library will be extended to include additional features and functionalities, making it even more powerful and versatile for various HTTP-related tasks.

License

This project is licensed under the terms of the MIT license.


For any questions, issues, or contributions, please refer to the GitHub repository of the project.

Dependencies

~135KB