/
sniffing_proxy.go
84 lines (74 loc) · 1.72 KB
/
sniffing_proxy.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
package main
import (
"github.com/uhoh-itsmaciek/femebe"
"github.com/uhoh-itsmaciek/femebe/core"
"github.com/uhoh-itsmaciek/femebe/proto"
)
type sniffingRouter struct {
backendPid uint32
secretKey uint32
fe core.Stream
be core.Stream
feBuf core.Message
beBuf core.Message
feCh chan<- *core.Message
beCh chan<- *core.Message
}
// Make a new Router that copies all messages on the given streams to
// the provided channels
func NewSniffingRouter(fe, be core.Stream, feCh, beCh chan<- *core.Message) femebe.Router {
return &sniffingRouter{
backendPid: 0,
secretKey: 0,
fe: fe,
be: be,
feCh: feCh,
beCh: beCh,
}
}
func (s *sniffingRouter) BackendKeyData() (uint32, uint32) {
return s.backendPid, s.secretKey
}
func (s *sniffingRouter) RouteFrontend() (err error) {
// route the next message from frontend to backend,
// blocking and flushing if necessary
err = s.fe.Next(&s.feBuf)
if err != nil {
return
}
var clone core.Message
clone.InitFromMessage(&s.feBuf)
s.feCh <- &clone
err = s.be.Send(&s.feBuf)
if err != nil {
return
}
if !s.fe.HasNext() {
return s.be.Flush()
}
return
}
func (s *sniffingRouter) RouteBackend() error {
// route the next message from backend to frotnend,
// blocking and flushing if necessary
err := s.be.Next(&s.beBuf)
if err != nil {
return err
}
if proto.IsBackendKeyData(&s.beBuf) {
beInfo, err := proto.ReadBackendKeyData(&s.beBuf)
if err != nil {
return err
}
s.backendPid = beInfo.BackendPid
s.secretKey = beInfo.SecretKey
}
var clone core.Message
clone.InitFromMessage(&s.beBuf)
s.beCh <- &clone
err = s.fe.Send(&s.beBuf)
if !s.be.HasNext() {
return s.fe.Flush()
}
return nil
}