support encryption and compression in new http reverser proxy

This commit is contained in:
fatedier 2017-12-13 04:28:58 +08:00
parent 7da61f004b
commit 46358d466d
6 changed files with 49 additions and 8 deletions

View File

@ -111,7 +111,7 @@ func (hp *HttpProxy) Handle(conn io.ReadWriteCloser) {
if realConn, ok := conn.(frpNet.Conn); ok { if realConn, ok := conn.(frpNet.Conn); ok {
wrapConn = realConn wrapConn = realConn
} else { } else {
wrapConn = frpNet.WrapReadWriteCloserToConn(conn) wrapConn = frpNet.WrapReadWriteCloserToConn(conn, realConn)
} }
sc, rd := frpNet.NewShareConn(wrapConn) sc, rd := frpNet.NewShareConn(wrapConn)

View File

@ -50,7 +50,7 @@ func (sp *Socks5Plugin) Handle(conn io.ReadWriteCloser) {
if realConn, ok := conn.(frpNet.Conn); ok { if realConn, ok := conn.(frpNet.Conn); ok {
wrapConn = realConn wrapConn = realConn
} else { } else {
wrapConn = frpNet.WrapReadWriteCloserToConn(conn) wrapConn = frpNet.WrapReadWriteCloserToConn(conn, realConn)
} }
sp.Server.ServeConn(wrapConn) sp.Server.ServeConn(wrapConn)

View File

@ -146,7 +146,7 @@ func (vm *VisitorManager) NewConn(name string, conn frpNet.Conn, timestamp int64
if useCompression { if useCompression {
rwc = frpIo.WithCompression(rwc) rwc = frpIo.WithCompression(rwc)
} }
err = l.PutConn(frpNet.WrapReadWriteCloserToConn(rwc)) err = l.PutConn(frpNet.WrapReadWriteCloserToConn(rwc, conn))
} else { } else {
err = fmt.Errorf("custom listener for [%s] doesn't exist", name) err = fmt.Errorf("custom listener for [%s] doesn't exist", name)
return return

View File

@ -208,7 +208,7 @@ func (pxy *HttpProxy) Run() (err error) {
routeConfig.Domain = domain routeConfig.Domain = domain
for _, location := range locations { for _, location := range locations {
routeConfig.Location = location routeConfig.Location = location
err := pxy.ctl.svr.httpReverseProxy.Register(routeConfig.Domain, routeConfig.Location, routeConfig.RewriteHost, pxy.GetWorkConnFromPool) err := pxy.ctl.svr.httpReverseProxy.Register(routeConfig.Domain, routeConfig.Location, routeConfig.RewriteHost, pxy.GetRealConn)
if err != nil { if err != nil {
return err return err
} }
@ -225,7 +225,7 @@ func (pxy *HttpProxy) Run() (err error) {
routeConfig.Domain = pxy.cfg.SubDomain + "." + config.ServerCommonCfg.SubDomainHost routeConfig.Domain = pxy.cfg.SubDomain + "." + config.ServerCommonCfg.SubDomainHost
for _, location := range locations { for _, location := range locations {
routeConfig.Location = location routeConfig.Location = location
err := pxy.ctl.svr.httpReverseProxy.Register(routeConfig.Domain, routeConfig.Location, routeConfig.RewriteHost, pxy.GetWorkConnFromPool) err := pxy.ctl.svr.httpReverseProxy.Register(routeConfig.Domain, routeConfig.Location, routeConfig.RewriteHost, pxy.GetRealConn)
if err != nil { if err != nil {
return err return err
} }
@ -244,6 +244,28 @@ func (pxy *HttpProxy) GetConf() config.ProxyConf {
return pxy.cfg 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() { func (pxy *HttpProxy) Close() {
pxy.BaseProxy.Close() pxy.BaseProxy.Close()
for _, closeFn := range pxy.closeFuncs { for _, closeFn := range pxy.closeFuncs {

View File

@ -49,32 +49,50 @@ func WrapConn(c net.Conn) Conn {
type WrapReadWriteCloserConn struct { type WrapReadWriteCloserConn struct {
io.ReadWriteCloser io.ReadWriteCloser
log.Logger log.Logger
underConn net.Conn
} }
func WrapReadWriteCloserToConn(rwc io.ReadWriteCloser) Conn { func WrapReadWriteCloserToConn(rwc io.ReadWriteCloser, underConn net.Conn) Conn {
return &WrapReadWriteCloserConn{ return &WrapReadWriteCloserConn{
ReadWriteCloser: rwc, ReadWriteCloser: rwc,
Logger: log.NewPrefixLogger(""), Logger: log.NewPrefixLogger(""),
underConn: underConn,
} }
} }
func (conn *WrapReadWriteCloserConn) LocalAddr() net.Addr { func (conn *WrapReadWriteCloserConn) LocalAddr() net.Addr {
if conn.underConn != nil {
return conn.underConn.LocalAddr()
}
return (*net.TCPAddr)(nil) return (*net.TCPAddr)(nil)
} }
func (conn *WrapReadWriteCloserConn) RemoteAddr() net.Addr { func (conn *WrapReadWriteCloserConn) RemoteAddr() net.Addr {
if conn.underConn != nil {
return conn.underConn.RemoteAddr()
}
return (*net.TCPAddr)(nil) return (*net.TCPAddr)(nil)
} }
func (conn *WrapReadWriteCloserConn) SetDeadline(t time.Time) error { 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")} 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 { 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")} 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 { 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")} return &net.OpError{Op: "set", Net: "wrap", Source: nil, Addr: nil, Err: errors.New("deadline not supported")}
} }

View File

@ -15,6 +15,7 @@
package vhost package vhost
import ( import (
"bytes"
"context" "context"
"errors" "errors"
"log" "log"
@ -74,8 +75,8 @@ func NewHttpReverseProxy() *HttpReverseProxy {
host = rp.GetRealHost(host, url) host = rp.GetRealHost(host, url)
if host != "" { if host != "" {
req.Host = host req.Host = host
req.URL.Host = req.Host
} }
req.URL.Host = req.Host
}, },
Transport: &http.Transport{ Transport: &http.Transport{
ResponseHeaderTimeout: responseHeaderTimeout, ResponseHeaderTimeout: responseHeaderTimeout,
@ -172,6 +173,6 @@ type wrapLogger struct{}
func newWrapLogger() *wrapLogger { return &wrapLogger{} } func newWrapLogger() *wrapLogger { return &wrapLogger{} }
func (l *wrapLogger) Write(p []byte) (n int, err error) { func (l *wrapLogger) Write(p []byte) (n int, err error) {
frpLog.Warn("%s", string(p)) frpLog.Warn("%s", string(bytes.TrimRight(p, "\n")))
return len(p), nil return len(p), nil
} }