Skip to content

Commit a384bf5

Browse files
authored
Merge pull request #564 from fatedier/dev
bump version to v0.14.1
2 parents 3a2946a + 92046a7 commit a384bf5

File tree

14 files changed

+657
-37
lines changed

14 files changed

+657
-37
lines changed

client/visitor.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,11 @@ func (sv *XtcpVisitor) handleConn(userConn frpNet.Conn) {
259259
sv.Trace("send all detect msg done")
260260

261261
// Listen for visitorConn's address and wait for client connection.
262-
lConn, _ := net.ListenUDP("udp", laddr)
262+
lConn, err := net.ListenUDP("udp", laddr)
263+
if err != nil {
264+
sv.Error("listen on visitorConn's local adress error: %v", err)
265+
return
266+
}
263267
lConn.SetReadDeadline(time.Now().Add(5 * time.Second))
264268
sidBuf := pool.GetBuf(1024)
265269
n, _, err = lConn.ReadFromUDP(sidBuf)

models/config/proxy.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -635,7 +635,7 @@ func (cfg *StcpProxyConf) LoadFromFile(name string, section ini.Section) (err er
635635
if tmpStr == "server" || tmpStr == "visitor" {
636636
cfg.Role = tmpStr
637637
} else {
638-
cfg.Role = "server"
638+
return fmt.Errorf("Parse conf error: incorrect role [%s]", tmpStr)
639639
}
640640

641641
cfg.Sk = section["sk"]
@@ -724,7 +724,7 @@ func (cfg *XtcpProxyConf) LoadFromFile(name string, section ini.Section) (err er
724724
if tmpStr == "server" || tmpStr == "visitor" {
725725
cfg.Role = tmpStr
726726
} else {
727-
cfg.Role = "server"
727+
return fmt.Errorf("Parse conf error: incorrect role [%s]", tmpStr)
728728
}
729729

730730
cfg.Sk = section["sk"]

models/msg/msg.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,5 +181,5 @@ type NatHoleResp struct {
181181
}
182182

183183
type NatHoleSid struct {
184-
Sid string `json"sid"`
184+
Sid string `json:"sid"`
185185
}

models/plugin/http_proxy.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ func (hp *HttpProxy) Handle(conn io.ReadWriteCloser) {
111111
if realConn, ok := conn.(frpNet.Conn); ok {
112112
wrapConn = realConn
113113
} else {
114-
wrapConn = frpNet.WrapReadWriteCloserToConn(conn)
114+
wrapConn = frpNet.WrapReadWriteCloserToConn(conn, realConn)
115115
}
116116

117117
sc, rd := frpNet.NewShareConn(wrapConn)

models/plugin/socks5.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ func (sp *Socks5Plugin) Handle(conn io.ReadWriteCloser) {
5050
if realConn, ok := conn.(frpNet.Conn); ok {
5151
wrapConn = realConn
5252
} else {
53-
wrapConn = frpNet.WrapReadWriteCloserToConn(conn)
53+
wrapConn = frpNet.WrapReadWriteCloserToConn(conn, realConn)
5454
}
5555

5656
sp.Server.ServeConn(wrapConn)

server/manager.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ func (vm *VisitorManager) NewConn(name string, conn frpNet.Conn, timestamp int64
146146
if useCompression {
147147
rwc = frpIo.WithCompression(rwc)
148148
}
149-
err = l.PutConn(frpNet.WrapReadWriteCloserToConn(rwc))
149+
err = l.PutConn(frpNet.WrapReadWriteCloserToConn(rwc, conn))
150150
} else {
151151
err = fmt.Errorf("custom listener for [%s] doesn't exist", name)
152152
return

server/proxy.go

Lines changed: 44 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -189,13 +189,16 @@ func (pxy *TcpProxy) Close() {
189189
type HttpProxy struct {
190190
BaseProxy
191191
cfg *config.HttpProxyConf
192+
193+
closeFuncs []func()
192194
}
193195

194196
func (pxy *HttpProxy) Run() (err error) {
195-
routeConfig := &vhost.VhostRouteConfig{
196-
RewriteHost: pxy.cfg.HostHeaderRewrite,
197-
Username: pxy.cfg.HttpUser,
198-
Password: pxy.cfg.HttpPwd,
197+
routeConfig := vhost.VhostRouteConfig{
198+
RewriteHost: pxy.cfg.HostHeaderRewrite,
199+
Username: pxy.cfg.HttpUser,
200+
Password: pxy.cfg.HttpPwd,
201+
CreateConnFn: pxy.GetRealConn,
199202
}
200203

201204
locations := pxy.cfg.Locations
@@ -206,40 +209,69 @@ func (pxy *HttpProxy) Run() (err error) {
206209
routeConfig.Domain = domain
207210
for _, location := range locations {
208211
routeConfig.Location = location
209-
l, err := pxy.ctl.svr.VhostHttpMuxer.Listen(routeConfig)
212+
err := pxy.ctl.svr.httpReverseProxy.Register(routeConfig)
210213
if err != nil {
211214
return err
212215
}
213-
l.AddLogPrefix(pxy.name)
216+
tmpDomain := routeConfig.Domain
217+
tmpLocation := routeConfig.Location
218+
pxy.closeFuncs = append(pxy.closeFuncs, func() {
219+
pxy.ctl.svr.httpReverseProxy.UnRegister(tmpDomain, tmpLocation)
220+
})
214221
pxy.Info("http proxy listen for host [%s] location [%s]", routeConfig.Domain, routeConfig.Location)
215-
pxy.listeners = append(pxy.listeners, l)
216222
}
217223
}
218224

219225
if pxy.cfg.SubDomain != "" {
220226
routeConfig.Domain = pxy.cfg.SubDomain + "." + config.ServerCommonCfg.SubDomainHost
221227
for _, location := range locations {
222228
routeConfig.Location = location
223-
l, err := pxy.ctl.svr.VhostHttpMuxer.Listen(routeConfig)
229+
err := pxy.ctl.svr.httpReverseProxy.Register(routeConfig)
224230
if err != nil {
225231
return err
226232
}
227-
l.AddLogPrefix(pxy.name)
233+
tmpDomain := routeConfig.Domain
234+
tmpLocation := routeConfig.Location
235+
pxy.closeFuncs = append(pxy.closeFuncs, func() {
236+
pxy.ctl.svr.httpReverseProxy.UnRegister(tmpDomain, tmpLocation)
237+
})
228238
pxy.Info("http proxy listen for host [%s] location [%s]", routeConfig.Domain, routeConfig.Location)
229-
pxy.listeners = append(pxy.listeners, l)
230239
}
231240
}
232-
233-
pxy.startListenHandler(pxy, HandleUserTcpConnection)
234241
return
235242
}
236243

237244
func (pxy *HttpProxy) GetConf() config.ProxyConf {
238245
return pxy.cfg
239246
}
240247

248+
func (pxy *HttpProxy) GetRealConn() (workConn frpNet.Conn, err error) {
249+
tmpConn, errRet := pxy.GetWorkConnFromPool()
250+
if errRet != nil {
251+
err = errRet
252+
return
253+
}
254+
255+
var rwc io.ReadWriteCloser = tmpConn
256+
if pxy.cfg.UseEncryption {
257+
rwc, err = frpIo.WithEncryption(rwc, []byte(config.ServerCommonCfg.PrivilegeToken))
258+
if err != nil {
259+
pxy.Error("create encryption stream error: %v", err)
260+
return
261+
}
262+
}
263+
if pxy.cfg.UseCompression {
264+
rwc = frpIo.WithCompression(rwc)
265+
}
266+
workConn = frpNet.WrapReadWriteCloserToConn(rwc, tmpConn)
267+
return
268+
}
269+
241270
func (pxy *HttpProxy) Close() {
242271
pxy.BaseProxy.Close()
272+
for _, closeFn := range pxy.closeFuncs {
273+
closeFn()
274+
}
243275
}
244276

245277
type HttpsProxy struct {

server/service.go

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ package server
1616

1717
import (
1818
"fmt"
19+
"net"
20+
"net/http"
1921
"time"
2022

2123
"github.com/fatedier/frp/assets"
@@ -44,12 +46,11 @@ type Service struct {
4446
// Accept connections using kcp.
4547
kcpListener frpNet.Listener
4648

47-
// For http proxies, route requests to different clients by hostname and other infomation.
48-
VhostHttpMuxer *vhost.HttpMuxer
49-
5049
// For https proxies, route requests to different clients by hostname and other infomation.
5150
VhostHttpsMuxer *vhost.HttpsMuxer
5251

52+
httpReverseProxy *vhost.HttpReverseProxy
53+
5354
// Manage all controllers.
5455
ctlManager *ControlManager
5556

@@ -93,22 +94,26 @@ func NewService() (svr *Service, err error) {
9394
err = fmt.Errorf("Listen on kcp address udp [%s:%d] error: %v", cfg.BindAddr, cfg.KcpBindPort, err)
9495
return
9596
}
96-
log.Info("frps kcp listen on udp %s:%d", cfg.BindAddr, cfg.BindPort)
97+
log.Info("frps kcp listen on udp %s:%d", cfg.BindAddr, cfg.KcpBindPort)
9798
}
9899

99100
// Create http vhost muxer.
100101
if cfg.VhostHttpPort > 0 {
101-
var l frpNet.Listener
102-
l, err = frpNet.ListenTcp(cfg.ProxyBindAddr, cfg.VhostHttpPort)
103-
if err != nil {
104-
err = fmt.Errorf("Create vhost http listener error, %v", err)
105-
return
102+
rp := vhost.NewHttpReverseProxy()
103+
svr.httpReverseProxy = rp
104+
105+
address := fmt.Sprintf("%s:%d", cfg.ProxyBindAddr, cfg.VhostHttpPort)
106+
server := &http.Server{
107+
Addr: address,
108+
Handler: rp,
106109
}
107-
svr.VhostHttpMuxer, err = vhost.NewHttpMuxer(l, 30*time.Second)
110+
var l net.Listener
111+
l, err = net.Listen("tcp", address)
108112
if err != nil {
109-
err = fmt.Errorf("Create vhost httpMuxer error, %v", err)
113+
err = fmt.Errorf("Create vhost http listener error, %v", err)
110114
return
111115
}
116+
go server.Serve(l)
112117
log.Info("http service listen on %s:%d", cfg.ProxyBindAddr, cfg.VhostHttpPort)
113118
}
114119

utils/net/conn.go

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,32 +49,50 @@ func WrapConn(c net.Conn) Conn {
4949
type WrapReadWriteCloserConn struct {
5050
io.ReadWriteCloser
5151
log.Logger
52+
53+
underConn net.Conn
5254
}
5355

54-
func WrapReadWriteCloserToConn(rwc io.ReadWriteCloser) Conn {
56+
func WrapReadWriteCloserToConn(rwc io.ReadWriteCloser, underConn net.Conn) Conn {
5557
return &WrapReadWriteCloserConn{
5658
ReadWriteCloser: rwc,
5759
Logger: log.NewPrefixLogger(""),
60+
underConn: underConn,
5861
}
5962
}
6063

6164
func (conn *WrapReadWriteCloserConn) LocalAddr() net.Addr {
65+
if conn.underConn != nil {
66+
return conn.underConn.LocalAddr()
67+
}
6268
return (*net.TCPAddr)(nil)
6369
}
6470

6571
func (conn *WrapReadWriteCloserConn) RemoteAddr() net.Addr {
72+
if conn.underConn != nil {
73+
return conn.underConn.RemoteAddr()
74+
}
6675
return (*net.TCPAddr)(nil)
6776
}
6877

6978
func (conn *WrapReadWriteCloserConn) SetDeadline(t time.Time) error {
79+
if conn.underConn != nil {
80+
return conn.underConn.SetDeadline(t)
81+
}
7082
return &net.OpError{Op: "set", Net: "wrap", Source: nil, Addr: nil, Err: errors.New("deadline not supported")}
7183
}
7284

7385
func (conn *WrapReadWriteCloserConn) SetReadDeadline(t time.Time) error {
86+
if conn.underConn != nil {
87+
return conn.underConn.SetReadDeadline(t)
88+
}
7489
return &net.OpError{Op: "set", Net: "wrap", Source: nil, Addr: nil, Err: errors.New("deadline not supported")}
7590
}
7691

7792
func (conn *WrapReadWriteCloserConn) SetWriteDeadline(t time.Time) error {
93+
if conn.underConn != nil {
94+
return conn.underConn.SetWriteDeadline(t)
95+
}
7896
return &net.OpError{Op: "set", Net: "wrap", Source: nil, Addr: nil, Err: errors.New("deadline not supported")}
7997
}
8098

utils/version/version.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import (
1919
"strings"
2020
)
2121

22-
var version string = "0.14.0"
22+
var version string = "0.14.1"
2323

2424
func Full() string {
2525
return version

0 commit comments

Comments
 (0)