|
@@ -26,6 +26,7 @@ import (
|
|
"github.com/fatedier/frp/models/msg"
|
|
"github.com/fatedier/frp/models/msg"
|
|
"github.com/fatedier/frp/utils/log"
|
|
"github.com/fatedier/frp/utils/log"
|
|
frpNet "github.com/fatedier/frp/utils/net"
|
|
frpNet "github.com/fatedier/frp/utils/net"
|
|
|
|
+ "github.com/fatedier/frp/utils/net/mux"
|
|
"github.com/fatedier/frp/utils/util"
|
|
"github.com/fatedier/frp/utils/util"
|
|
"github.com/fatedier/frp/utils/version"
|
|
"github.com/fatedier/frp/utils/version"
|
|
"github.com/fatedier/frp/utils/vhost"
|
|
"github.com/fatedier/frp/utils/vhost"
|
|
@@ -41,6 +42,9 @@ var ServerService *Service
|
|
|
|
|
|
// Server service.
|
|
// Server service.
|
|
type Service struct {
|
|
type Service struct {
|
|
|
|
+ // Dispatch connections to different handlers listen on same port.
|
|
|
|
+ muxer *mux.Mux
|
|
|
|
+
|
|
// Accept connections from client.
|
|
// Accept connections from client.
|
|
listener frpNet.Listener
|
|
listener frpNet.Listener
|
|
|
|
|
|
@@ -88,12 +92,33 @@ func NewService() (svr *Service, err error) {
|
|
return
|
|
return
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ var (
|
|
|
|
+ httpMuxOn bool
|
|
|
|
+ httpsMuxOn bool
|
|
|
|
+ )
|
|
|
|
+ if cfg.BindAddr == cfg.ProxyBindAddr {
|
|
|
|
+ if cfg.BindPort == cfg.VhostHttpPort {
|
|
|
|
+ httpMuxOn = true
|
|
|
|
+ }
|
|
|
|
+ if cfg.BindPort == cfg.VhostHttpsPort {
|
|
|
|
+ httpsMuxOn = true
|
|
|
|
+ }
|
|
|
|
+ if httpMuxOn || httpsMuxOn {
|
|
|
|
+ svr.muxer = mux.NewMux()
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
// Listen for accepting connections from client.
|
|
// Listen for accepting connections from client.
|
|
- svr.listener, err = frpNet.ListenTcp(cfg.BindAddr, cfg.BindPort)
|
|
|
|
|
|
+ ln, err := net.Listen("tcp", fmt.Sprintf("%s:%d", cfg.BindAddr, cfg.BindPort))
|
|
if err != nil {
|
|
if err != nil {
|
|
err = fmt.Errorf("Create server listener error, %v", err)
|
|
err = fmt.Errorf("Create server listener error, %v", err)
|
|
return
|
|
return
|
|
}
|
|
}
|
|
|
|
+ if svr.muxer != nil {
|
|
|
|
+ go svr.muxer.Serve(ln)
|
|
|
|
+ ln = svr.muxer.DefaultListener()
|
|
|
|
+ }
|
|
|
|
+ svr.listener = frpNet.WrapLogListener(ln)
|
|
log.Info("frps tcp listen on %s:%d", cfg.BindAddr, cfg.BindPort)
|
|
log.Info("frps tcp listen on %s:%d", cfg.BindAddr, cfg.BindPort)
|
|
|
|
|
|
// Listen for accepting connections from client using kcp protocol.
|
|
// Listen for accepting connections from client using kcp protocol.
|
|
@@ -117,10 +142,14 @@ func NewService() (svr *Service, err error) {
|
|
Handler: rp,
|
|
Handler: rp,
|
|
}
|
|
}
|
|
var l net.Listener
|
|
var l net.Listener
|
|
- l, err = net.Listen("tcp", address)
|
|
|
|
- if err != nil {
|
|
|
|
- err = fmt.Errorf("Create vhost http listener error, %v", err)
|
|
|
|
- return
|
|
|
|
|
|
+ if httpMuxOn {
|
|
|
|
+ l = svr.muxer.ListenHttp(0)
|
|
|
|
+ } else {
|
|
|
|
+ l, err = net.Listen("tcp", address)
|
|
|
|
+ if err != nil {
|
|
|
|
+ err = fmt.Errorf("Create vhost http listener error, %v", err)
|
|
|
|
+ return
|
|
|
|
+ }
|
|
}
|
|
}
|
|
go server.Serve(l)
|
|
go server.Serve(l)
|
|
log.Info("http service listen on %s:%d", cfg.ProxyBindAddr, cfg.VhostHttpPort)
|
|
log.Info("http service listen on %s:%d", cfg.ProxyBindAddr, cfg.VhostHttpPort)
|
|
@@ -128,13 +157,18 @@ func NewService() (svr *Service, err error) {
|
|
|
|
|
|
// Create https vhost muxer.
|
|
// Create https vhost muxer.
|
|
if cfg.VhostHttpsPort > 0 {
|
|
if cfg.VhostHttpsPort > 0 {
|
|
- var l frpNet.Listener
|
|
|
|
- l, err = frpNet.ListenTcp(cfg.ProxyBindAddr, cfg.VhostHttpsPort)
|
|
|
|
- if err != nil {
|
|
|
|
- err = fmt.Errorf("Create vhost https listener error, %v", err)
|
|
|
|
- return
|
|
|
|
|
|
+ var l net.Listener
|
|
|
|
+ if httpsMuxOn {
|
|
|
|
+ l = svr.muxer.ListenHttps(0)
|
|
|
|
+ } else {
|
|
|
|
+ l, err = net.Listen("tcp", fmt.Sprintf("%s:%d", cfg.ProxyBindAddr, cfg.VhostHttpsPort))
|
|
|
|
+ if err != nil {
|
|
|
|
+ err = fmt.Errorf("Create server listener error, %v", err)
|
|
|
|
+ return
|
|
|
|
+ }
|
|
}
|
|
}
|
|
- svr.VhostHttpsMuxer, err = vhost.NewHttpsMuxer(l, 30*time.Second)
|
|
|
|
|
|
+
|
|
|
|
+ svr.VhostHttpsMuxer, err = vhost.NewHttpsMuxer(frpNet.WrapLogListener(l), 30*time.Second)
|
|
if err != nil {
|
|
if err != nil {
|
|
err = fmt.Errorf("Create vhost httpsMuxer error, %v", err)
|
|
err = fmt.Errorf("Create vhost httpsMuxer error, %v", err)
|
|
return
|
|
return
|