86 lines
1.7 KiB
Go
86 lines
1.7 KiB
Go
|
|
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
|
||
|
|
}
|
||
|
|
}
|