Skip to content

Commit

Permalink
Merge pull request #564 from fatedier/dev
Browse files Browse the repository at this point in the history
bump version to v0.14.1
  • Loading branch information
fatedier authored Dec 14, 2017
2 parents 3a2946a + 92046a7 commit a384bf5
Show file tree
Hide file tree
Showing 14 changed files with 657 additions and 37 deletions.
6 changes: 5 additions & 1 deletion client/visitor.go
Original file line number Diff line number Diff line change
Expand Up @@ -259,7 +259,11 @@ func (sv *XtcpVisitor) handleConn(userConn frpNet.Conn) {
sv.Trace("send all detect msg done")

// Listen for visitorConn's address and wait for client connection.
lConn, _ := net.ListenUDP("udp", laddr)
lConn, err := net.ListenUDP("udp", laddr)
if err != nil {
sv.Error("listen on visitorConn's local adress error: %v", err)
return
}
lConn.SetReadDeadline(time.Now().Add(5 * time.Second))
sidBuf := pool.GetBuf(1024)
n, _, err = lConn.ReadFromUDP(sidBuf)
Expand Down
4 changes: 2 additions & 2 deletions models/config/proxy.go
Original file line number Diff line number Diff line change
Expand Up @@ -635,7 +635,7 @@ func (cfg *StcpProxyConf) LoadFromFile(name string, section ini.Section) (err er
if tmpStr == "server" || tmpStr == "visitor" {
cfg.Role = tmpStr
} else {
cfg.Role = "server"
return fmt.Errorf("Parse conf error: incorrect role [%s]", tmpStr)
}

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

cfg.Sk = section["sk"]
Expand Down
2 changes: 1 addition & 1 deletion models/msg/msg.go
Original file line number Diff line number Diff line change
Expand Up @@ -181,5 +181,5 @@ type NatHoleResp struct {
}

type NatHoleSid struct {
Sid string `json"sid"`
Sid string `json:"sid"`
}
2 changes: 1 addition & 1 deletion models/plugin/http_proxy.go
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ func (hp *HttpProxy) Handle(conn io.ReadWriteCloser) {
if realConn, ok := conn.(frpNet.Conn); ok {
wrapConn = realConn
} else {
wrapConn = frpNet.WrapReadWriteCloserToConn(conn)
wrapConn = frpNet.WrapReadWriteCloserToConn(conn, realConn)
}

sc, rd := frpNet.NewShareConn(wrapConn)
Expand Down
2 changes: 1 addition & 1 deletion models/plugin/socks5.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ func (sp *Socks5Plugin) Handle(conn io.ReadWriteCloser) {
if realConn, ok := conn.(frpNet.Conn); ok {
wrapConn = realConn
} else {
wrapConn = frpNet.WrapReadWriteCloserToConn(conn)
wrapConn = frpNet.WrapReadWriteCloserToConn(conn, realConn)
}

sp.Server.ServeConn(wrapConn)
Expand Down
2 changes: 1 addition & 1 deletion server/manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@ func (vm *VisitorManager) NewConn(name string, conn frpNet.Conn, timestamp int64
if useCompression {
rwc = frpIo.WithCompression(rwc)
}
err = l.PutConn(frpNet.WrapReadWriteCloserToConn(rwc))
err = l.PutConn(frpNet.WrapReadWriteCloserToConn(rwc, conn))
} else {
err = fmt.Errorf("custom listener for [%s] doesn't exist", name)
return
Expand Down
56 changes: 44 additions & 12 deletions server/proxy.go
Original file line number Diff line number Diff line change
Expand Up @@ -189,13 +189,16 @@ func (pxy *TcpProxy) Close() {
type HttpProxy struct {
BaseProxy
cfg *config.HttpProxyConf

closeFuncs []func()
}

func (pxy *HttpProxy) Run() (err error) {
routeConfig := &vhost.VhostRouteConfig{
RewriteHost: pxy.cfg.HostHeaderRewrite,
Username: pxy.cfg.HttpUser,
Password: pxy.cfg.HttpPwd,
routeConfig := vhost.VhostRouteConfig{
RewriteHost: pxy.cfg.HostHeaderRewrite,
Username: pxy.cfg.HttpUser,
Password: pxy.cfg.HttpPwd,
CreateConnFn: pxy.GetRealConn,
}

locations := pxy.cfg.Locations
Expand All @@ -206,40 +209,69 @@ func (pxy *HttpProxy) Run() (err error) {
routeConfig.Domain = domain
for _, location := range locations {
routeConfig.Location = location
l, err := pxy.ctl.svr.VhostHttpMuxer.Listen(routeConfig)
err := pxy.ctl.svr.httpReverseProxy.Register(routeConfig)
if err != nil {
return err
}
l.AddLogPrefix(pxy.name)
tmpDomain := routeConfig.Domain
tmpLocation := routeConfig.Location
pxy.closeFuncs = append(pxy.closeFuncs, func() {
pxy.ctl.svr.httpReverseProxy.UnRegister(tmpDomain, tmpLocation)
})
pxy.Info("http proxy listen for host [%s] location [%s]", routeConfig.Domain, routeConfig.Location)
pxy.listeners = append(pxy.listeners, l)
}
}

if pxy.cfg.SubDomain != "" {
routeConfig.Domain = pxy.cfg.SubDomain + "." + config.ServerCommonCfg.SubDomainHost
for _, location := range locations {
routeConfig.Location = location
l, err := pxy.ctl.svr.VhostHttpMuxer.Listen(routeConfig)
err := pxy.ctl.svr.httpReverseProxy.Register(routeConfig)
if err != nil {
return err
}
l.AddLogPrefix(pxy.name)
tmpDomain := routeConfig.Domain
tmpLocation := routeConfig.Location
pxy.closeFuncs = append(pxy.closeFuncs, func() {
pxy.ctl.svr.httpReverseProxy.UnRegister(tmpDomain, tmpLocation)
})
pxy.Info("http proxy listen for host [%s] location [%s]", routeConfig.Domain, routeConfig.Location)
pxy.listeners = append(pxy.listeners, l)
}
}

pxy.startListenHandler(pxy, HandleUserTcpConnection)
return
}

func (pxy *HttpProxy) GetConf() config.ProxyConf {
return pxy.cfg
}

func (pxy *HttpProxy) GetRealConn() (workConn frpNet.Conn, err error) {
tmpConn, errRet := pxy.GetWorkConnFromPool()
if errRet != nil {
err = errRet
return
}

var rwc io.ReadWriteCloser = tmpConn
if pxy.cfg.UseEncryption {
rwc, err = frpIo.WithEncryption(rwc, []byte(config.ServerCommonCfg.PrivilegeToken))
if err != nil {
pxy.Error("create encryption stream error: %v", err)
return
}
}
if pxy.cfg.UseCompression {
rwc = frpIo.WithCompression(rwc)
}
workConn = frpNet.WrapReadWriteCloserToConn(rwc, tmpConn)
return
}

func (pxy *HttpProxy) Close() {
pxy.BaseProxy.Close()
for _, closeFn := range pxy.closeFuncs {
closeFn()
}
}

type HttpsProxy struct {
Expand Down
27 changes: 16 additions & 11 deletions server/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ package server

import (
"fmt"
"net"
"net/http"
"time"

"github.com/fatedier/frp/assets"
Expand Down Expand Up @@ -44,12 +46,11 @@ type Service struct {
// Accept connections using kcp.
kcpListener frpNet.Listener

// For http proxies, route requests to different clients by hostname and other infomation.
VhostHttpMuxer *vhost.HttpMuxer

// For https proxies, route requests to different clients by hostname and other infomation.
VhostHttpsMuxer *vhost.HttpsMuxer

httpReverseProxy *vhost.HttpReverseProxy

// Manage all controllers.
ctlManager *ControlManager

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

// Create http vhost muxer.
if cfg.VhostHttpPort > 0 {
var l frpNet.Listener
l, err = frpNet.ListenTcp(cfg.ProxyBindAddr, cfg.VhostHttpPort)
if err != nil {
err = fmt.Errorf("Create vhost http listener error, %v", err)
return
rp := vhost.NewHttpReverseProxy()
svr.httpReverseProxy = rp

address := fmt.Sprintf("%s:%d", cfg.ProxyBindAddr, cfg.VhostHttpPort)
server := &http.Server{
Addr: address,
Handler: rp,
}
svr.VhostHttpMuxer, err = vhost.NewHttpMuxer(l, 30*time.Second)
var l net.Listener
l, err = net.Listen("tcp", address)
if err != nil {
err = fmt.Errorf("Create vhost httpMuxer error, %v", err)
err = fmt.Errorf("Create vhost http listener error, %v", err)
return
}
go server.Serve(l)
log.Info("http service listen on %s:%d", cfg.ProxyBindAddr, cfg.VhostHttpPort)
}

Expand Down
20 changes: 19 additions & 1 deletion utils/net/conn.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,32 +49,50 @@ func WrapConn(c net.Conn) Conn {
type WrapReadWriteCloserConn struct {
io.ReadWriteCloser
log.Logger

underConn net.Conn
}

func WrapReadWriteCloserToConn(rwc io.ReadWriteCloser) Conn {
func WrapReadWriteCloserToConn(rwc io.ReadWriteCloser, underConn net.Conn) Conn {
return &WrapReadWriteCloserConn{
ReadWriteCloser: rwc,
Logger: log.NewPrefixLogger(""),
underConn: underConn,
}
}

func (conn *WrapReadWriteCloserConn) LocalAddr() net.Addr {
if conn.underConn != nil {
return conn.underConn.LocalAddr()
}
return (*net.TCPAddr)(nil)
}

func (conn *WrapReadWriteCloserConn) RemoteAddr() net.Addr {
if conn.underConn != nil {
return conn.underConn.RemoteAddr()
}
return (*net.TCPAddr)(nil)
}

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

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

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

Expand Down
2 changes: 1 addition & 1 deletion utils/version/version.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ import (
"strings"
)

var version string = "0.14.0"
var version string = "0.14.1"

func Full() string {
return version
Expand Down
Loading

0 comments on commit a384bf5

Please sign in to comment.