Я создаю TCP-прокси с go
, но столкнулся с небольшой проблемой. Прежде чем обрабатывать соединение c1
и переадресовывать его на c2
, я хочу сделать несколько проверок. Для этого мне нужно строковое представление байтового среза из c1
. К сожалению, _, err := io.CopyBuffer(w, r, buf)
копирует []byte
непосредственно между устройством записи и чтения, и если я сделаю c1.Read()
перед функцией cp
, []byte
уже будет прочитан.
Вот функция, содержащая обработку соединения:
func (p *proxy) handle(c1 net.Conn) {
p.log.Printf("accepted %v", c1.RemoteAddr())
defer p.log.Printf("disconnected %v", c1.RemoteAddr())
defer c1.Close()
c2, err := dialer.Dial("tcp", p.dial)
log.Println("DIAL:", p.dial)
if err != nil {
p.log.Print("C2", err)
return
}
defer c2.Close()
errc := make(chan error, 2)
cp := func(w io.Writer, r io.Reader) {
buf := bufferPool.Get().([]byte)
_, err := io.CopyBuffer(w, r, buf)
errc <- err
bufferPool.Put(buf)
}
go cp(struct{ io.Writer }{c1}, c2)
go cp(c2, struct{ io.Reader }{c1})
err = <-errc
if err != nil {
p.log.Print("F-ERROR ->", err)
}
}
Есть ли способ "продублировать" []byte
, чтобы я мог использовать дубликат для отображения в виде строки?