mirror of
https://gitee.com/IrisVega/frp.git
synced 2024-11-01 22:31:29 +08:00
support encryption and compression in new http reverser proxy
This commit is contained in:
parent
7da61f004b
commit
46358d466d
@ -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)
|
||||||
|
@ -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)
|
||||||
|
@ -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
|
||||||
|
@ -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 {
|
||||||
|
@ -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")}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user