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
Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

sync_pair.go 999B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package relay
  2. import (
  3. "bufio"
  4. "errors"
  5. "fmt"
  6. "io"
  7. "net"
  8. "os"
  9. "time"
  10. )
  11. type syncPair struct {
  12. writer *bufio.Writer
  13. copyBuf []byte
  14. reader net.Conn
  15. }
  16. func (s *syncPair) Sync() (int64, error) {
  17. return io.CopyBuffer(s, s, s.copyBuf) // nolint: wrapcheck
  18. }
  19. func (s *syncPair) Read(p []byte) (int, error) {
  20. n, err := s.readBlocking(p, false)
  21. if errors.Is(err, os.ErrDeadlineExceeded) {
  22. if err := s.writer.Flush(); err != nil {
  23. return 0, fmt.Errorf("cannot flush writer hand-side: %w", err)
  24. }
  25. return s.readBlocking(p, true)
  26. }
  27. return n, err
  28. }
  29. func (s *syncPair) Write(p []byte) (int, error) {
  30. return s.writer.Write(p) // nolint: wrapcheck
  31. }
  32. func (s *syncPair) readBlocking(p []byte, blocking bool) (int, error) {
  33. var deadline time.Time
  34. if !blocking {
  35. deadline = time.Now().Add(readTimeout)
  36. }
  37. if err := s.reader.SetReadDeadline(deadline); err != nil {
  38. return 0, fmt.Errorf("cannot set read deadline: %w", err)
  39. }
  40. return s.reader.Read(p) // nolint: wrapcheck
  41. }