mirror of
https://github.com/ScuroNeko/mtg.git
synced 2026-08-31 22:04:02 +03:00
FILE / ScuroNeko/mtg
mtglib/internal/doppel/scout_conn.go
Исходный файл и его история в репозитории.
58 lines
1.0 KiB
Go
58 lines
1.0 KiB
Go
package doppel
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/binary"
|
|
"io"
|
|
|
|
"github.com/9seconds/mtg/v2/essentials"
|
|
"github.com/9seconds/mtg/v2/mtglib/internal/tls"
|
|
)
|
|
|
|
type ScoutConn struct {
|
|
tls.Conn
|
|
|
|
results *ScoutConnCollected
|
|
rawBuf *bytes.Buffer
|
|
}
|
|
|
|
func (s ScoutConn) Read(p []byte) (int, error) {
|
|
buf := &bytes.Buffer{}
|
|
|
|
for {
|
|
if n, err := s.rawBuf.Read(p); err == nil {
|
|
return n, nil
|
|
}
|
|
|
|
s.rawBuf.Reset()
|
|
|
|
recordType, length, err := tls.ReadRecord(s.Conn, buf)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
|
|
s.results.Add(recordType)
|
|
s.rawBuf.Write([]byte{recordType})
|
|
s.rawBuf.Write(tls.TLSVersion[:])
|
|
|
|
if err := binary.Write(s.rawBuf, binary.BigEndian, uint16(length)); err != nil {
|
|
return 0, err
|
|
}
|
|
|
|
if _, err := io.Copy(s.rawBuf, buf); err != nil {
|
|
return 0, err
|
|
}
|
|
}
|
|
}
|
|
|
|
func NewScoutConn(conn essentials.Conn, results *ScoutConnCollected) ScoutConn {
|
|
rawBuf := &bytes.Buffer{}
|
|
rawBuf.Grow(tls.MaxRecordSize)
|
|
|
|
return ScoutConn{
|
|
Conn: tls.New(conn, false, false),
|
|
results: results,
|
|
rawBuf: rawBuf,
|
|
}
|
|
}
|