Highly-opinionated (ex-bullshit-free) MTPROTO proxy for Telegram. If you use v1.0 or upgrade broke you proxy, please read the chapter Version 2
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

scout_conn.go 1.2KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. package doppel
  2. import (
  3. "bytes"
  4. "encoding/binary"
  5. "io"
  6. "github.com/9seconds/mtg/v2/essentials"
  7. "github.com/9seconds/mtg/v2/mtglib/internal/tls"
  8. )
  9. type ScoutConn struct {
  10. tls.Conn
  11. results *ScoutConnCollected
  12. rawBuf *bytes.Buffer
  13. seenCCS bool
  14. }
  15. func (s *ScoutConn) Read(p []byte) (int, error) {
  16. buf := &bytes.Buffer{}
  17. for {
  18. if n, err := s.rawBuf.Read(p); err == nil {
  19. return n, nil
  20. }
  21. s.rawBuf.Reset()
  22. recordType, length, err := tls.ReadRecord(s.Conn, buf)
  23. if err != nil {
  24. return 0, err
  25. }
  26. if recordType == tls.TypeChangeCipherSpec {
  27. s.seenCCS = true
  28. }
  29. s.results.Add(recordType, int(length))
  30. s.rawBuf.Write([]byte{recordType})
  31. s.rawBuf.Write(tls.TLSVersion[:])
  32. if err := binary.Write(s.rawBuf, binary.BigEndian, uint16(length)); err != nil {
  33. return 0, err
  34. }
  35. if _, err := io.Copy(s.rawBuf, buf); err != nil {
  36. return 0, err
  37. }
  38. }
  39. }
  40. func (s *ScoutConn) Write(p []byte) (int, error) {
  41. if s.seenCCS {
  42. s.results.MarkWrite()
  43. }
  44. return s.Conn.Write(p)
  45. }
  46. func NewScoutConn(conn essentials.Conn, results *ScoutConnCollected) *ScoutConn {
  47. rawBuf := &bytes.Buffer{}
  48. rawBuf.Grow(tls.MaxRecordSize)
  49. return &ScoutConn{
  50. Conn: tls.New(conn, false, false),
  51. results: results,
  52. rawBuf: rawBuf,
  53. }
  54. }