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
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

conns.go 1.7KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. package mtglib
  2. import (
  3. "context"
  4. "fmt"
  5. "net"
  6. "time"
  7. )
  8. type connStandard struct {
  9. conn net.Conn
  10. idleTimeout time.Duration
  11. }
  12. func (c connStandard) Read(b []byte) (int, error) {
  13. if err := c.conn.SetReadDeadline(time.Now().Add(c.idleTimeout)); err != nil {
  14. return 0, fmt.Errorf("cannot set read deadline: %w", err)
  15. }
  16. return c.conn.Read(b)
  17. }
  18. func (c connStandard) Write(b []byte) (int, error) {
  19. if err := c.conn.SetWriteDeadline(time.Now().Add(c.idleTimeout)); err != nil {
  20. return 0, fmt.Errorf("cannot set write deadline: %w", err)
  21. }
  22. return c.conn.Write(b)
  23. }
  24. func (c connStandard) Close() error {
  25. return c.conn.Close()
  26. }
  27. func (c connStandard) LocalAddr() net.Addr {
  28. return c.conn.LocalAddr()
  29. }
  30. func (c connStandard) RemoteAddr() net.Addr {
  31. return c.conn.RemoteAddr()
  32. }
  33. func (c connStandard) SetDeadline(t time.Time) error {
  34. return c.conn.SetDeadline(t)
  35. }
  36. func (c connStandard) SetReadDeadline(t time.Time) error {
  37. return c.conn.SetReadDeadline(t)
  38. }
  39. func (c connStandard) SetWriteDeadline(t time.Time) error {
  40. return c.conn.SetWriteDeadline(t)
  41. }
  42. type connEventTraffic struct {
  43. net.Conn
  44. connID string
  45. stream EventStream
  46. ctx context.Context
  47. }
  48. func (c connEventTraffic) Read(b []byte) (int, error) {
  49. n, err := c.Conn.Read(b)
  50. if n > 0 {
  51. c.stream.Send(c.ctx, EventTraffic{
  52. CreatedAt: time.Now(),
  53. ConnID: c.connID,
  54. Traffic: uint(n),
  55. IsRead: true,
  56. })
  57. }
  58. return n, err // nolint: wrapcheck
  59. }
  60. func (c connEventTraffic) Write(b []byte) (int, error) {
  61. n, err := c.Conn.Write(b)
  62. if n > 0 {
  63. c.stream.Send(c.ctx, EventTraffic{
  64. CreatedAt: time.Now(),
  65. ConnID: c.connID,
  66. Traffic: uint(n),
  67. IsRead: false,
  68. })
  69. }
  70. return n, err // nolint: wrapcheck
  71. }