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

client_intermediate.go 2.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. package packetack
  2. import (
  3. "bytes"
  4. "encoding/binary"
  5. "fmt"
  6. "io"
  7. "net"
  8. "go.uber.org/zap"
  9. "github.com/9seconds/mtg/conntypes"
  10. )
  11. const clientIntermediateQuickAckLength = 0x80000000
  12. type wrapperClientIntermediate struct {
  13. parent conntypes.StreamReadWriteCloser
  14. }
  15. func (w *wrapperClientIntermediate) Read(acks *conntypes.ConnectionAcks) (conntypes.Packet, error) {
  16. buf := bytes.Buffer{}
  17. buf.Grow(4)
  18. if _, err := io.CopyN(&buf, w.parent, 4); err != nil {
  19. return nil, fmt.Errorf("cannot read message length: %w", err)
  20. }
  21. length := binary.LittleEndian.Uint32(buf.Bytes())
  22. if length > clientIntermediateQuickAckLength {
  23. acks.Quick = true
  24. length -= clientIntermediateQuickAckLength
  25. }
  26. buf.Reset()
  27. buf.Grow(int(length))
  28. if _, err := io.CopyN(&buf, w.parent, int64(length)); err != nil {
  29. return nil, fmt.Errorf("cannot read the message: %w", err)
  30. }
  31. return buf.Bytes(), nil
  32. }
  33. func (w *wrapperClientIntermediate) Write(packet conntypes.Packet, acks *conntypes.ConnectionAcks) error {
  34. if acks.Simple {
  35. if _, err := w.parent.Write(packet); err != nil {
  36. return fmt.Errorf("cannot send simpleacked packet: %w", err)
  37. }
  38. return nil
  39. }
  40. length := [4]byte{}
  41. binary.LittleEndian.PutUint32(length[:], uint32(len(packet)))
  42. if _, err := w.parent.Write(append(length[:], packet...)); err != nil {
  43. return fmt.Errorf("cannot send packet: %w", err)
  44. }
  45. return nil
  46. }
  47. func (w *wrapperClientIntermediate) Close() error {
  48. return w.parent.Close()
  49. }
  50. func (w *wrapperClientIntermediate) Conn() net.Conn {
  51. return w.parent.Conn()
  52. }
  53. func (w *wrapperClientIntermediate) LocalAddr() *net.TCPAddr {
  54. return w.parent.LocalAddr()
  55. }
  56. func (w *wrapperClientIntermediate) RemoteAddr() *net.TCPAddr {
  57. return w.parent.RemoteAddr()
  58. }
  59. func (w *wrapperClientIntermediate) Logger() *zap.SugaredLogger {
  60. return w.parent.Logger().Named("client-intermediate")
  61. }
  62. func NewClientIntermediate(parent conntypes.StreamReadWriteCloser) conntypes.PacketAckFullReadWriteCloser {
  63. return &wrapperClientIntermediate{
  64. parent: parent,
  65. }
  66. }