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
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

rewind.go 1.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. package stream
  2. import (
  3. "bytes"
  4. "io"
  5. "net"
  6. "sync"
  7. "time"
  8. "go.uber.org/zap"
  9. "mtg/conntypes"
  10. )
  11. type ReadWriteCloseRewinder interface {
  12. conntypes.StreamReadWriteCloser
  13. Rewind()
  14. }
  15. type wrapperRewind struct {
  16. parent conntypes.StreamReadWriteCloser
  17. buf bytes.Buffer
  18. mutex sync.Mutex
  19. rewinded bool
  20. }
  21. func (w *wrapperRewind) Write(p []byte) (int, error) {
  22. return w.parent.Write(p)
  23. }
  24. func (w *wrapperRewind) WriteTimeout(p []byte, timeout time.Duration) (int, error) {
  25. return w.parent.WriteTimeout(p, timeout)
  26. }
  27. func (w *wrapperRewind) Read(p []byte) (int, error) {
  28. w.mutex.Lock()
  29. defer w.mutex.Unlock()
  30. if w.rewinded {
  31. if n, err := w.buf.Read(p); err != io.EOF {
  32. return n, err
  33. }
  34. }
  35. n, err := w.parent.Read(p)
  36. if !w.rewinded {
  37. w.buf.Write(p[:n])
  38. }
  39. return n, err
  40. }
  41. func (w *wrapperRewind) ReadTimeout(p []byte, timeout time.Duration) (int, error) {
  42. w.mutex.Lock()
  43. defer w.mutex.Unlock()
  44. if w.rewinded {
  45. if n, err := w.buf.Read(p); err != io.EOF {
  46. return n, err
  47. }
  48. }
  49. n, err := w.parent.ReadTimeout(p, timeout)
  50. if !w.rewinded {
  51. w.buf.Write(p[:n])
  52. }
  53. return n, err
  54. }
  55. func (w *wrapperRewind) Conn() net.Conn {
  56. return w.parent.Conn()
  57. }
  58. func (w *wrapperRewind) Logger() *zap.SugaredLogger {
  59. return w.parent.Logger().Named("rewinded")
  60. }
  61. func (w *wrapperRewind) LocalAddr() *net.TCPAddr {
  62. return w.parent.LocalAddr()
  63. }
  64. func (w *wrapperRewind) RemoteAddr() *net.TCPAddr {
  65. return w.parent.RemoteAddr()
  66. }
  67. func (w *wrapperRewind) Close() error {
  68. w.buf.Reset()
  69. return w.parent.Close()
  70. }
  71. func (w *wrapperRewind) Rewind() {
  72. w.mutex.Lock()
  73. w.rewinded = true
  74. w.mutex.Unlock()
  75. }
  76. func NewRewind(parent conntypes.StreamReadWriteCloser) ReadWriteCloseRewinder {
  77. return &wrapperRewind{
  78. parent: parent,
  79. }
  80. }