12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- package singbridge
- import (
- "context"
- "io"
- "net"
- "github.com/sagernet/sing/common/bufio"
- "github.com/xtls/xray-core/common/buf"
- "github.com/xtls/xray-core/transport"
- )
- func CopyConn(ctx context.Context, inboundConn net.Conn, link *transport.Link, serverConn net.Conn) error {
- conn := &PipeConnWrapper{
- W: link.Writer,
- Conn: inboundConn,
- }
- if ir, ok := link.Reader.(io.Reader); ok {
- conn.R = ir
- } else {
- conn.R = &buf.BufferedReader{Reader: link.Reader}
- }
- return ReturnError(bufio.CopyConn(ctx, conn, serverConn))
- }
- type PipeConnWrapper struct {
- R io.Reader
- W buf.Writer
- net.Conn
- }
- func (w *PipeConnWrapper) Close() error {
- return nil
- }
- func (w *PipeConnWrapper) Read(b []byte) (n int, err error) {
- return w.R.Read(b)
- }
- func (w *PipeConnWrapper) Write(p []byte) (n int, err error) {
- n = len(p)
- var mb buf.MultiBuffer
- pLen := len(p)
- for pLen > 0 {
- buffer := buf.New()
- if pLen > buf.Size {
- _, err = buffer.Write(p[:buf.Size])
- p = p[buf.Size:]
- } else {
- buffer.Write(p)
- }
- pLen -= int(buffer.Len())
- mb = append(mb, buffer)
- }
- err = w.W.WriteMultiBuffer(mb)
- if err != nil {
- n = 0
- buf.ReleaseMulti(mb)
- }
- return
- }
|