package proxy import ( "net" "zproxy/zlog" ) type UPacketConnection struct { *UHttpRequest } // 创建连接的方法 func NewPacketConnection(conn net.Conn) *UPacketConnection { //初始化Conn属性 c := &UPacketConnection{ UHttpRequest: NewHttpRequest(conn), } return c } func (pc *UPacketConnection) Forward(target *UPacketConnection) { pc.DataSize = 0 pc.IsLoadHeader = false for !pc.IsLoadHeader { data, err := pc.ReadLine() if err != nil { zlog.Error("read header line error: ", err.Error()) return } _, err = target.Write(data) if err != nil { zlog.Error("write header line error: ", err.Error()) return } } if pc.DataSize == 0 { return } data := make([]byte, 1024) for pc.DataSize > 0 { size := min(pc.DataSize, 1024) n, err := pc.Read(data, 0, size) if err != nil { zlog.Error("read body error: ", err.Error()) return } pc.DataSize -= n zlog.Infof("read body %d %s", n, data[:n]) _, err = target.Write(data[:n]) if err != nil { zlog.Error("write body error: ", err.Error()) return } } } func (pc *UPacketConnection) Close() error { err := pc.Conn.Close() return err } func (pc *UPacketConnection) ForwardError(err error) { pc.DataSize = 0 pc.IsLoadHeader = false zlog.Infof("forward error: ", err.Error()) for !pc.IsLoadHeader { _, err := pc.ReadLine() if err != nil { zlog.Error("read header line error: ", err.Error()) return } } for pc.DataSize > 0 { data := make([]byte, 1024) size := min(pc.DataSize, 1024) n, err := pc.Read(data, 0, size) if err != nil { zlog.Error("Read body error: ", err.Error()) return } pc.DataSize -= n } err = pc.WriteError(err) if err != nil { zlog.Error("write error http error: ", err.Error()) return } }