#tcp-server #tcp #服务器 #套接字 #请求头

bin+lib rserver

异步TCP服务器,用于截获请求、修改请求头和替换响应

7个版本

0.1.6 2022年12月23日
0.1.5 2022年12月22日
0.1.4 2020年8月17日

#252 in HTTP服务器

MIT 许可协议

185KB
356

RServer

RServer是一个异步库/应用程序,用于截获/嗅探TCP请求、修改头信息和响应。

安装

要安装RServer,请使用以下命令

cargo install rserver

示例

如何使用RServer截获/嗅探TCP请求。RServer默认运行在8080端口。

要运行RServer,使用以下命令

rserver

请将浏览器/系统代理设置为主机127.0.0.1和端口8080(RServer的默认端口)以使用Rserver截获所有请求。

如果您想直接测试RServer安装而不进行上述步骤,请运行以下命令

https_proxy=127.0.0.1:8080 curl https://www.google.com

用法

rserver [OPTIONS]

FLAGS:
    --help       Prints help information
-V, --version    Prints version information

OPTIONS:
    --enable-proxy <enable-proxy>    Enable proxy flag [default: false]
-h, --host <host>                    Server host [default: 127.0.0.1]
-p, --port <port>                    Server port [default: 8080]
    --proxy-host <proxy-host>        Proxy host
    --proxy-port <proxy-port>        Proxy port

要使用rsever Rust库,请参阅以下示例

use rserver::Config;
use rserver::Server;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let config = Config::default();
    let server = Server::new(config);
    server.start().await
}

变更日志

  • 异步服务器。
  • 添加HTTPS / CONNECT方法支持。
  • 小错误修复和其他改进。
  • 模块化代码

内部API

如何读取流数据并返回流数据和其长度。

/// Read the stream data and return stream data & its length
fn read_stream(stream: &mut TcpStream) -> (Vec<u8>, usize) {
    let buffer_size = 512;
    let mut request_buffer = vec![];
    // let us loop & try to read the whole request data
    let mut request_len = 0usize;
    loop {
        let mut buffer = vec![0; buffer_size];
        match stream.read(&mut buffer) {
            Ok(n) => {
               
                if n == 0 {
                    break;
                } else {
                    request_len += n;

                    // we need not read more data in case we have read less data than buffer size
                    if n < buffer_size {
                        // let us only append the data how much we have read rather than complete existing buffer data
                        // as n is less than buffer size
                        request_buffer.append(&mut buffer[..n].to_vec()); // convert slice into vec
                        break;
                    } else {
                        // append complete buffer vec data into request_buffer vec as n == buffer_size
                        request_buffer.append(&mut buffer);
                    }
                }
            }
            Err(e) => {
                println!("Error in reading stream data: {:?}", e);
                break;
            }
        }
    }

    (request_buffer, request_len)
}

待办事项

  • 修改/替换请求头
  • 修改/替换响应头

依赖项

~5–12MB
~121K SLoC