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 символів.

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. //go:build linux || darwin
  2. // +build linux darwin
  3. package network
  4. import (
  5. "net"
  6. "runtime"
  7. "syscall"
  8. "testing"
  9. "time"
  10. "github.com/stretchr/testify/require"
  11. "golang.org/x/sys/unix"
  12. )
  13. func tcpKeepIdleOption() int {
  14. if runtime.GOOS == "darwin" {
  15. return 0x10 // TCP_KEEPALIVE on macOS
  16. }
  17. return 0x4 // TCP_KEEPIDLE on Linux
  18. }
  19. func TestSetCommonSocketOptionsKeepAlive(t *testing.T) {
  20. t.Parallel()
  21. listener, err := net.Listen("tcp", "127.0.0.1:0")
  22. require.NoError(t, err)
  23. defer func() {
  24. err := listener.Close()
  25. require.NoError(t, err)
  26. }()
  27. type dialResult struct {
  28. conn net.Conn
  29. err error
  30. }
  31. dialDone := make(chan dialResult, 1)
  32. go func() {
  33. c, err := net.Dial("tcp", listener.Addr().String())
  34. dialDone <- dialResult{conn: c, err: err}
  35. }()
  36. tcpListener, ok := listener.(*net.TCPListener)
  37. require.True(t, ok, "listener must be a *net.TCPListener")
  38. require.NoError(t, tcpListener.SetDeadline(time.Now().Add(5*time.Second)))
  39. accepted, err := listener.Accept()
  40. require.NoError(t, err)
  41. defer func() {
  42. err := accepted.Close()
  43. require.NoError(t, err)
  44. }()
  45. dr := <-dialDone
  46. require.NoError(t, dr.err)
  47. defer func() {
  48. err := dr.conn.Close()
  49. require.NoError(t, err)
  50. }()
  51. tcpConn := accepted.(*net.TCPConn)
  52. err = setCommonSocketOptions(tcpConn, DefaultKeepAliveConfig)
  53. require.NoError(t, err)
  54. rawConn, err := tcpConn.SyscallConn()
  55. require.NoError(t, err)
  56. err = rawConn.Control(func(fd uintptr) {
  57. val, err := unix.GetsockoptInt(int(fd), syscall.SOL_SOCKET, syscall.SO_KEEPALIVE)
  58. require.NoError(t, err)
  59. require.NotEqual(t, 0, val, "SO_KEEPALIVE should be enabled")
  60. idle, err := unix.GetsockoptInt(int(fd), syscall.IPPROTO_TCP, tcpKeepIdleOption())
  61. require.NoError(t, err)
  62. require.Equal(t, 15, idle, "keepalive idle should match DefaultKeepAliveIdle")
  63. interval, err := unix.GetsockoptInt(int(fd), syscall.IPPROTO_TCP, unix.TCP_KEEPINTVL)
  64. require.NoError(t, err)
  65. require.Equal(t, 15, interval, "keepalive interval should match DefaultKeepAliveInterval")
  66. count, err := unix.GetsockoptInt(int(fd), syscall.IPPROTO_TCP, unix.TCP_KEEPCNT)
  67. require.NoError(t, err)
  68. require.Equal(t, 9, count, "keepalive count should match DefaultKeepAliveCount")
  69. })
  70. require.NoError(t, err)
  71. }