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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. package tls
  2. import (
  3. "bytes"
  4. "encoding/binary"
  5. "fmt"
  6. "io"
  7. )
  8. func ReadRecord(r io.Reader, w io.Writer) (byte, int64, error) {
  9. buf := [SizeHeader]byte{}
  10. if _, err := io.ReadFull(r, buf[:]); err != nil {
  11. return 0, 0, err
  12. }
  13. pVer := buf[SizeRecordType:]
  14. pLen := pVer[SizeVersion:]
  15. if !bytes.Equal(TLSVersion[:], pVer[:SizeVersion]) {
  16. return 0, 0, fmt.Errorf("incorrect tls version %v", pVer)
  17. }
  18. length := int64(binary.BigEndian.Uint16(pLen[:SizeSize]))
  19. _, err := io.CopyN(w, r, length)
  20. return buf[0], length, err
  21. }
  22. func WriteRecord(w io.Writer, payload []byte) error {
  23. buf := [MaxRecordSize]byte{}
  24. buf[0] = TypeApplicationData
  25. bufV := buf[SizeRecordType:]
  26. copy(bufV[:SizeVersion], TLSVersion[:])
  27. bufS := bufV[SizeVersion:]
  28. binary.BigEndian.PutUint16(bufS[:SizeSize], uint16(len(payload)))
  29. bufP := buf[SizeHeader:]
  30. if n := copy(bufP, payload); n != len(payload) {
  31. return fmt.Errorf("copied %d bytes of payload instead of %d", n, len(payload))
  32. }
  33. _, err := w.Write(buf[:SizeHeader+len(payload)])
  34. return err
  35. }