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 kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

conns.go 1.2KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. package essentials
  2. import (
  3. "fmt"
  4. "io"
  5. "net"
  6. "syscall"
  7. )
  8. // CloseableReader is an [io.Reader] interface that can close its reading end.
  9. type CloseableReader interface {
  10. io.Reader
  11. CloseRead() error
  12. }
  13. // CloseableWriter is an [io.Writer] that can close its writing end.
  14. type CloseableWriter interface {
  15. io.Writer
  16. CloseWrite() error
  17. }
  18. // Conn is an extension of [net.Conn] that can close its ends. This mostly
  19. // implies TCP connections.
  20. type Conn interface {
  21. net.Conn
  22. CloseableReader
  23. CloseableWriter
  24. }
  25. type netConnWrapper struct {
  26. net.Conn
  27. }
  28. func (n netConnWrapper) CloseRead() error {
  29. if conn, ok := n.Conn.(CloseableReader); ok {
  30. return conn.CloseRead()
  31. }
  32. return n.Close()
  33. }
  34. func (n netConnWrapper) CloseWrite() error {
  35. if conn, ok := n.Conn.(CloseableWriter); ok {
  36. return conn.CloseWrite()
  37. }
  38. return n.Close()
  39. }
  40. // WrapConn wraps a generic [net.Conn] into Conn.
  41. func WrapNetConn(conn net.Conn) Conn {
  42. return netConnWrapper{conn}
  43. }
  44. func SetTCPWindowClamp(conn net.Conn, value int) error {
  45. sysConn, ok := conn.(syscall.Conn)
  46. if !ok {
  47. return nil
  48. }
  49. rawConn, err := sysConn.SyscallConn()
  50. if err != nil {
  51. return fmt.Errorf("cannot get raw connection: %w", err)
  52. }
  53. return SetRawTCPWindowClamp(rawConn, value)
  54. }