use std::io::{Read, Write};
use std::net::{TcpListener, TcpStream};
use std::thread;

fn main()
{
    let server = TcpListener::bind("0.0.0.0:8080").unwrap();
    
    println!("服务已启动, 正在监听地址: {:?}", server.local_addr());

    for incoming_rs in server.incoming() {
        if let Err(err) = incoming_rs {
            println!("接收连接错误: {err}");
            continue;
        }

        let remote_rs = TcpStream::connect("127.0.0.1:80");
        println!("接收到连接请求 {:?}, 远端连接已建立: {:?}", incoming_rs, remote_rs);
        
        let incoming_sock = incoming_rs.unwrap();
        match remote_rs {
            Ok(remote_sock) => {
                let p_rs = process_sock(incoming_sock, remote_sock);
                println!("启动服务结果: {p_rs:?}");
            }
            Err(err) => {
                println!("remote connect error: {:?}", err);
            }
        }
    }
}

fn process_sock(incoming: TcpStream, remote: TcpStream) -> Result<(), Box<dyn std::error::Error>> {
    {
        let reader = remote.try_clone()?;
        let writer = incoming.try_clone()?;
        thread::spawn(move || {
            pipe_socket(reader, writer);
        });
    }
    {
        let reader = incoming.try_clone()?;
        let writer = remote.try_clone()?;
        thread::spawn(move || {
            pipe_socket(reader, writer);
        });
    }
    
    Ok(())
}

fn pipe_socket(mut reader: TcpStream, mut writer: TcpStream)
{
    let msg = format!("{:?} => {:?}", reader.peer_addr(), writer.peer_addr());
    let mut buf = [0; 65535]; 
    loop {
        let reader_rs = reader.read(&mut buf);
        match reader_rs {
            Ok(0) => {
                println!("{msg} 读取到0字节, 结束服务");
                break;
                
            }
            Ok(n) => {
                let writer_rs = writer.write_all(&buf[..n]);
                println!("{msg} 读取到{n} 字节, 写结果: {writer_rs:?}");
                if writer_rs.is_err() {
                    break;
                }
            }
            Err(err) => {
                println!("{msg} 读取到错误: {err}");
                break;
            }
        }
        
    }
}