Maker_web v0.1.1: adds `ConnectionFilter` for TCP-level early rejection

⚓ Rust    📅 2025-12-23    👤 surdeus    👁️ 4      

surdeus

Version 0.1.1 of maker_web introduces TCP-level connection filtering, giving you more control over which clients can reach your HTTP server.

Main feature: ConnectionFilter trait

The new ConnectionFilter trait allows you to intercept connections before any HTTP parsing begins. This is useful for:

  • Early IP filtering/whitelisting
  • Implementing custom rate limiting at the TCP layer
  • Rejecting unwanted traffic with minimal overhead

Examples

Here's how you can implement a simple IP-based filter:

use std::net::{IpAddr, SocketAddr};
use maker_web::{Server, Handler, ConnectionFilter, Request, Response, Handled, StatusCode};
use tokio::net::TcpListener;

struct MyConnFilter {
    blacklist: Vec<IpAddr>
}

impl ConnectionFilter for MyConnFilter {
    fn filter(
        &self, client_addr: SocketAddr, _: SocketAddr, err_resp: &mut Response
    ) -> Result<(), Handled> {
        if self.blacklist.contains(&client_addr.ip()) {
            // Reject with custom response
            Err(err_resp
                .status(StatusCode::Forbidden)
                .body("Your IP is permanently banned"))
        } else {
            Ok(()) // Accept connection
        }
    }
}

struct HelloWorld;

impl Handler for HelloWorld {
    async fn handle(&self, _: &mut (), _: &Request, resp: &mut Response) -> Handled {
        resp.status(StatusCode::Ok)
            .header("Content-Type", "text/plain")
            .body("Hello, world!")
    }
}

#[tokio::main]
async fn main() {
    let filter = MyConnFilter {
	    blacklist: vec![
	        "192.0.2.1".parse().unwrap(),
	        "198.51.100.1".parse().unwrap(),
	        "203.0.113.1".parse().unwrap(),
	        "10.0.0.1".parse().unwrap(),
	    ]
	};

	Server::builder()
	    .listener(TcpListener::bind("127.0.0.1:8080").await.unwrap())
	    .handler(HelloWorld)
	    .conn_filter(filter)
        .build()
        .launch()
        .await;
} 

Links

Your opinion

  1. What's your opinion about this ConnectionFilter feature?
  2. How convenient is this feature's API to use?
  3. What's your general impression of maker_web's API design?

I'd like to hear your thoughts on this addition. Your opinion is very important to me.

1 post - 1 participant

Read full topic

🏷️ Rust_feed