@@ -23,6 +23,7 @@ import (
2323
2424 "github.com/fatedier/frp/models/config"
2525 "github.com/fatedier/frp/models/msg"
26+ "github.com/fatedier/frp/models/plugin"
2627 "github.com/fatedier/frp/models/proto/tcp"
2728 "github.com/fatedier/frp/models/proto/udp"
2829 "github.com/fatedier/frp/utils/errors"
@@ -81,57 +82,84 @@ type BaseProxy struct {
8182type TcpProxy struct {
8283 BaseProxy
8384
84- cfg * config.TcpProxyConf
85+ cfg * config.TcpProxyConf
86+ proxyPlugin plugin.Plugin
8587}
8688
8789func (pxy * TcpProxy ) Run () (err error ) {
90+ if pxy .cfg .Plugin != "" {
91+ pxy .proxyPlugin , err = plugin .Create (pxy .cfg .Plugin , pxy .cfg .PluginParams )
92+ if err != nil {
93+ return
94+ }
95+ }
8896 return
8997}
9098
9199func (pxy * TcpProxy ) Close () {
100+ if pxy .proxyPlugin != nil {
101+ pxy .proxyPlugin .Close ()
102+ }
92103}
93104
94105func (pxy * TcpProxy ) InWorkConn (conn frpNet.Conn ) {
95- defer conn .Close ()
96- HandleTcpWorkConnection (& pxy .cfg .LocalSvrConf , & pxy .cfg .BaseProxyConf , conn )
106+ HandleTcpWorkConnection (& pxy .cfg .LocalSvrConf , pxy .proxyPlugin , & pxy .cfg .BaseProxyConf , conn )
97107}
98108
99109// HTTP
100110type HttpProxy struct {
101111 BaseProxy
102112
103- cfg * config.HttpProxyConf
113+ cfg * config.HttpProxyConf
114+ proxyPlugin plugin.Plugin
104115}
105116
106117func (pxy * HttpProxy ) Run () (err error ) {
118+ if pxy .cfg .Plugin != "" {
119+ pxy .proxyPlugin , err = plugin .Create (pxy .cfg .Plugin , pxy .cfg .PluginParams )
120+ if err != nil {
121+ return
122+ }
123+ }
107124 return
108125}
109126
110127func (pxy * HttpProxy ) Close () {
128+ if pxy .proxyPlugin != nil {
129+ pxy .proxyPlugin .Close ()
130+ }
111131}
112132
113133func (pxy * HttpProxy ) InWorkConn (conn frpNet.Conn ) {
114- defer conn .Close ()
115- HandleTcpWorkConnection (& pxy .cfg .LocalSvrConf , & pxy .cfg .BaseProxyConf , conn )
134+ HandleTcpWorkConnection (& pxy .cfg .LocalSvrConf , pxy .proxyPlugin , & pxy .cfg .BaseProxyConf , conn )
116135}
117136
118137// HTTPS
119138type HttpsProxy struct {
120139 BaseProxy
121140
122- cfg * config.HttpsProxyConf
141+ cfg * config.HttpsProxyConf
142+ proxyPlugin plugin.Plugin
123143}
124144
125145func (pxy * HttpsProxy ) Run () (err error ) {
146+ if pxy .cfg .Plugin != "" {
147+ pxy .proxyPlugin , err = plugin .Create (pxy .cfg .Plugin , pxy .cfg .PluginParams )
148+ if err != nil {
149+ return
150+ }
151+ }
126152 return
127153}
128154
129155func (pxy * HttpsProxy ) Close () {
156+ if pxy .proxyPlugin != nil {
157+ pxy .proxyPlugin .Close ()
158+ }
130159}
131160
132161func (pxy * HttpsProxy ) InWorkConn (conn frpNet.Conn ) {
133- defer conn .Close ()
134- HandleTcpWorkConnection (& pxy .cfg .LocalSvrConf , & pxy .cfg .BaseProxyConf , conn )
162+ HandleTcpWorkConnection (& pxy .cfg .LocalSvrConf , pxy .proxyPlugin , & pxy .cfg .BaseProxyConf , conn )
135163}
136164
137165// UDP
@@ -240,14 +268,13 @@ func (pxy *UdpProxy) InWorkConn(conn frpNet.Conn) {
240268}
241269
242270// Common handler for tcp work connections.
243- func HandleTcpWorkConnection (localInfo * config.LocalSvrConf , baseInfo * config.BaseProxyConf , workConn frpNet.Conn ) {
244- localConn , err := frpNet .ConnectTcpServer (fmt .Sprintf ("%s:%d" , localInfo .LocalIp , localInfo .LocalPort ))
245- if err != nil {
246- workConn .Error ("connect to local service [%s:%d] error: %v" , localInfo .LocalIp , localInfo .LocalPort , err )
247- return
248- }
271+ func HandleTcpWorkConnection (localInfo * config.LocalSvrConf , proxyPlugin plugin.Plugin ,
272+ baseInfo * config.BaseProxyConf , workConn frpNet.Conn ) {
249273
250- var remote io.ReadWriteCloser
274+ var (
275+ remote io.ReadWriteCloser
276+ err error
277+ )
251278 remote = workConn
252279 if baseInfo .UseEncryption {
253280 remote , err = tcp .WithEncryption (remote , []byte (config .ClientCommonCfg .PrivilegeToken ))
@@ -259,8 +286,23 @@ func HandleTcpWorkConnection(localInfo *config.LocalSvrConf, baseInfo *config.Ba
259286 if baseInfo .UseCompression {
260287 remote = tcp .WithCompression (remote )
261288 }
262- workConn .Debug ("join connections, localConn(l[%s] r[%s]) workConn(l[%s] r[%s])" , localConn .LocalAddr ().String (),
263- localConn .RemoteAddr ().String (), workConn .LocalAddr ().String (), workConn .RemoteAddr ().String ())
264- tcp .Join (localConn , remote )
265- workConn .Debug ("join connections closed" )
289+
290+ if proxyPlugin != nil {
291+ // if plugin is set, let plugin handle connections first
292+ workConn .Debug ("handle by plugin: %s" , proxyPlugin .Name ())
293+ proxyPlugin .Handle (remote )
294+ workConn .Debug ("handle by plugin finished" )
295+ return
296+ } else {
297+ localConn , err := frpNet .ConnectTcpServer (fmt .Sprintf ("%s:%d" , localInfo .LocalIp , localInfo .LocalPort ))
298+ if err != nil {
299+ workConn .Error ("connect to local service [%s:%d] error: %v" , localInfo .LocalIp , localInfo .LocalPort , err )
300+ return
301+ }
302+
303+ workConn .Debug ("join connections, localConn(l[%s] r[%s]) workConn(l[%s] r[%s])" , localConn .LocalAddr ().String (),
304+ localConn .RemoteAddr ().String (), workConn .LocalAddr ().String (), workConn .RemoteAddr ().String ())
305+ tcp .Join (localConn , remote )
306+ workConn .Debug ("join connections closed" )
307+ }
266308}
0 commit comments