From 1062ccaaee7fcbea7275cfe351a260d849798b2e Mon Sep 17 00:00:00 2001 From: Guy Lewin Date: Mon, 17 Feb 2020 11:18:56 +0200 Subject: [PATCH] Include proxy file --- server/proxy/tcphttptunnel.go | 83 +++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 server/proxy/tcphttptunnel.go diff --git a/server/proxy/tcphttptunnel.go b/server/proxy/tcphttptunnel.go new file mode 100644 index 00000000..743efb1e --- /dev/null +++ b/server/proxy/tcphttptunnel.go @@ -0,0 +1,83 @@ +// Copyright 2020 guylewin, guy@lewin.co.il +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package proxy + +import ( + "github.com/fatedier/frp/models/config" + "github.com/fatedier/frp/utils/util" + "github.com/fatedier/frp/utils/vhost" + "strings" +) + +type TcpHttpTunnelProxy struct { + *BaseProxy + cfg *config.TcpHttpTunnelProxyConf + + realPort int +} + +func (pxy *TcpHttpTunnelProxy) Run() (remoteAddr string, err error) { + xl := pxy.xl + routeConfig := &vhost.VhostRouteConfig{} + + defer func() { + if err != nil { + pxy.Close() + } + }() + addrs := make([]string, 0) + for _, domain := range pxy.cfg.CustomDomains { + if domain == "" { + continue + } + + routeConfig.Domain = domain + l, errRet := pxy.rc.VhostTcpMuxer.Listen(pxy.ctx, routeConfig) + if errRet != nil { + err = errRet + return + } + xl.Info("tcp http tunnel server listen for host [%s]", routeConfig.Domain) + pxy.listeners = append(pxy.listeners, l) + addrs = append(addrs, util.CanonicalAddr(routeConfig.Domain, pxy.serverCfg.TcpHttpTunnelPort)) + } + + if pxy.cfg.SubDomain != "" { + routeConfig.Domain = pxy.cfg.SubDomain + "." + pxy.serverCfg.SubDomainHost + l, errRet := pxy.rc.VhostTcpMuxer.Listen(pxy.ctx, routeConfig) + if errRet != nil { + err = errRet + return + } + xl.Info("tcp http tunnel server listen for host [%s]", routeConfig.Domain) + pxy.listeners = append(pxy.listeners, l) + addrs = append(addrs, util.CanonicalAddr(routeConfig.Domain, pxy.serverCfg.TcpHttpTunnelPort)) + } + + pxy.startListenHandler(pxy, HandleUserTcpConnection) + remoteAddr = strings.Join(addrs, ",") + return +} + +func (pxy *TcpHttpTunnelProxy) GetConf() config.ProxyConf { + return pxy.cfg +} + +func (pxy *TcpHttpTunnelProxy) Close() { + pxy.BaseProxy.Close() + if pxy.cfg.Group == "" { + pxy.rc.TcpPortManager.Release(pxy.realPort) + } +}