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 kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

utils.go 1.2KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  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. copy(buf[SizeHeader:], payload)
  25. return WriteRecordInPlace(w, buf[:], len(payload))
  26. }
  27. func WriteRecordInPlace(w io.Writer, buf []byte, payloadLen int) error {
  28. if payloadLen > MaxRecordPayloadSize {
  29. return fmt.Errorf("payload %d exceeds max %d", payloadLen, MaxRecordPayloadSize)
  30. }
  31. buf[0] = TypeApplicationData
  32. copy(buf[SizeRecordType:SizeRecordType+SizeVersion], TLSVersion[:])
  33. binary.BigEndian.PutUint16(
  34. buf[SizeRecordType+SizeVersion:SizeRecordType+SizeVersion+SizeSize],
  35. uint16(payloadLen),
  36. )
  37. _, err := w.Write(buf[:SizeHeader+payloadLen])
  38. return err
  39. }