zproxy/proxy/packetconnection.go

86 lines
1.7 KiB
Go
Raw Normal View History

2024-02-13 19:45:15 +08:00
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
}
}