mirror of
https://github.com/fatedier/frp.git
synced 2026-03-08 02:49:10 +08:00
refactor: fix modernize lint issues (#5215)
This commit is contained in:
@@ -18,6 +18,7 @@ linters:
|
|||||||
- lll
|
- lll
|
||||||
- makezero
|
- makezero
|
||||||
- misspell
|
- misspell
|
||||||
|
- modernize
|
||||||
- prealloc
|
- prealloc
|
||||||
- predeclared
|
- predeclared
|
||||||
- revive
|
- revive
|
||||||
@@ -47,6 +48,9 @@ linters:
|
|||||||
ignore-rules:
|
ignore-rules:
|
||||||
- cancelled
|
- cancelled
|
||||||
- marshalled
|
- marshalled
|
||||||
|
modernize:
|
||||||
|
disable:
|
||||||
|
- omitzero
|
||||||
unparam:
|
unparam:
|
||||||
check-exported: false
|
check-exported: false
|
||||||
exclusions:
|
exclusions:
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
RegisterProxyFactory(reflect.TypeOf(&v1.SUDPProxyConfig{}), NewSUDPProxy)
|
RegisterProxyFactory(reflect.TypeFor[*v1.SUDPProxyConfig](), NewSUDPProxy)
|
||||||
}
|
}
|
||||||
|
|
||||||
type SUDPProxy struct {
|
type SUDPProxy struct {
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
RegisterProxyFactory(reflect.TypeOf(&v1.UDPProxyConfig{}), NewUDPProxy)
|
RegisterProxyFactory(reflect.TypeFor[*v1.UDPProxyConfig](), NewUDPProxy)
|
||||||
}
|
}
|
||||||
|
|
||||||
type UDPProxy struct {
|
type UDPProxy struct {
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
RegisterProxyFactory(reflect.TypeOf(&v1.XTCPProxyConfig{}), NewXTCPProxy)
|
RegisterProxyFactory(reflect.TypeFor[*v1.XTCPProxyConfig](), NewXTCPProxy)
|
||||||
}
|
}
|
||||||
|
|
||||||
type XTCPProxy struct {
|
type XTCPProxy struct {
|
||||||
|
|||||||
@@ -39,14 +39,14 @@ const (
|
|||||||
// Proxy
|
// Proxy
|
||||||
var (
|
var (
|
||||||
proxyConfTypeMap = map[ProxyType]reflect.Type{
|
proxyConfTypeMap = map[ProxyType]reflect.Type{
|
||||||
ProxyTypeTCP: reflect.TypeOf(TCPProxyConf{}),
|
ProxyTypeTCP: reflect.TypeFor[TCPProxyConf](),
|
||||||
ProxyTypeUDP: reflect.TypeOf(UDPProxyConf{}),
|
ProxyTypeUDP: reflect.TypeFor[UDPProxyConf](),
|
||||||
ProxyTypeTCPMUX: reflect.TypeOf(TCPMuxProxyConf{}),
|
ProxyTypeTCPMUX: reflect.TypeFor[TCPMuxProxyConf](),
|
||||||
ProxyTypeHTTP: reflect.TypeOf(HTTPProxyConf{}),
|
ProxyTypeHTTP: reflect.TypeFor[HTTPProxyConf](),
|
||||||
ProxyTypeHTTPS: reflect.TypeOf(HTTPSProxyConf{}),
|
ProxyTypeHTTPS: reflect.TypeFor[HTTPSProxyConf](),
|
||||||
ProxyTypeSTCP: reflect.TypeOf(STCPProxyConf{}),
|
ProxyTypeSTCP: reflect.TypeFor[STCPProxyConf](),
|
||||||
ProxyTypeXTCP: reflect.TypeOf(XTCPProxyConf{}),
|
ProxyTypeXTCP: reflect.TypeFor[XTCPProxyConf](),
|
||||||
ProxyTypeSUDP: reflect.TypeOf(SUDPProxyConf{}),
|
ProxyTypeSUDP: reflect.TypeFor[SUDPProxyConf](),
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -32,9 +32,9 @@ const (
|
|||||||
// Visitor
|
// Visitor
|
||||||
var (
|
var (
|
||||||
visitorConfTypeMap = map[VisitorType]reflect.Type{
|
visitorConfTypeMap = map[VisitorType]reflect.Type{
|
||||||
VisitorTypeSTCP: reflect.TypeOf(STCPVisitorConf{}),
|
VisitorTypeSTCP: reflect.TypeFor[STCPVisitorConf](),
|
||||||
VisitorTypeXTCP: reflect.TypeOf(XTCPVisitorConf{}),
|
VisitorTypeXTCP: reflect.TypeFor[XTCPVisitorConf](),
|
||||||
VisitorTypeSUDP: reflect.TypeOf(SUDPVisitorConf{}),
|
VisitorTypeSUDP: reflect.TypeFor[SUDPVisitorConf](),
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ func parseNumberRangePair(firstRangeStr, secondRangeStr string) ([]NumberPair, e
|
|||||||
return nil, fmt.Errorf("first and second range numbers are not in pairs")
|
return nil, fmt.Errorf("first and second range numbers are not in pairs")
|
||||||
}
|
}
|
||||||
pairs := make([]NumberPair, 0, len(firstRangeNumbers))
|
pairs := make([]NumberPair, 0, len(firstRangeNumbers))
|
||||||
for i := 0; i < len(firstRangeNumbers); i++ {
|
for i := range firstRangeNumbers {
|
||||||
pairs = append(pairs, NumberPair{
|
pairs = append(pairs, NumberPair{
|
||||||
First: firstRangeNumbers[i],
|
First: firstRangeNumbers[i],
|
||||||
Second: secondRangeNumbers[i],
|
Second: secondRangeNumbers[i],
|
||||||
|
|||||||
@@ -137,8 +137,8 @@ func (p PortsRangeSlice) String() string {
|
|||||||
func NewPortsRangeSliceFromString(str string) ([]PortsRange, error) {
|
func NewPortsRangeSliceFromString(str string) ([]PortsRange, error) {
|
||||||
str = strings.TrimSpace(str)
|
str = strings.TrimSpace(str)
|
||||||
out := []PortsRange{}
|
out := []PortsRange{}
|
||||||
numRanges := strings.Split(str, ",")
|
numRanges := strings.SplitSeq(str, ",")
|
||||||
for _, numRangeStr := range numRanges {
|
for numRangeStr := range numRanges {
|
||||||
// 1000-2000 or 2001
|
// 1000-2000 or 2001
|
||||||
numArray := strings.Split(numRangeStr, "-")
|
numArray := strings.Split(numRangeStr, "-")
|
||||||
// length: only 1 or 2 is correct
|
// length: only 1 or 2 is correct
|
||||||
|
|||||||
@@ -239,14 +239,14 @@ const (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var proxyConfigTypeMap = map[ProxyType]reflect.Type{
|
var proxyConfigTypeMap = map[ProxyType]reflect.Type{
|
||||||
ProxyTypeTCP: reflect.TypeOf(TCPProxyConfig{}),
|
ProxyTypeTCP: reflect.TypeFor[TCPProxyConfig](),
|
||||||
ProxyTypeUDP: reflect.TypeOf(UDPProxyConfig{}),
|
ProxyTypeUDP: reflect.TypeFor[UDPProxyConfig](),
|
||||||
ProxyTypeHTTP: reflect.TypeOf(HTTPProxyConfig{}),
|
ProxyTypeHTTP: reflect.TypeFor[HTTPProxyConfig](),
|
||||||
ProxyTypeHTTPS: reflect.TypeOf(HTTPSProxyConfig{}),
|
ProxyTypeHTTPS: reflect.TypeFor[HTTPSProxyConfig](),
|
||||||
ProxyTypeTCPMUX: reflect.TypeOf(TCPMuxProxyConfig{}),
|
ProxyTypeTCPMUX: reflect.TypeFor[TCPMuxProxyConfig](),
|
||||||
ProxyTypeSTCP: reflect.TypeOf(STCPProxyConfig{}),
|
ProxyTypeSTCP: reflect.TypeFor[STCPProxyConfig](),
|
||||||
ProxyTypeXTCP: reflect.TypeOf(XTCPProxyConfig{}),
|
ProxyTypeXTCP: reflect.TypeFor[XTCPProxyConfig](),
|
||||||
ProxyTypeSUDP: reflect.TypeOf(SUDPProxyConfig{}),
|
ProxyTypeSUDP: reflect.TypeFor[SUDPProxyConfig](),
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewProxyConfigurerByType(proxyType ProxyType) ProxyConfigurer {
|
func NewProxyConfigurerByType(proxyType ProxyType) ProxyConfigurer {
|
||||||
|
|||||||
@@ -37,16 +37,16 @@ const (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var clientPluginOptionsTypeMap = map[string]reflect.Type{
|
var clientPluginOptionsTypeMap = map[string]reflect.Type{
|
||||||
PluginHTTP2HTTPS: reflect.TypeOf(HTTP2HTTPSPluginOptions{}),
|
PluginHTTP2HTTPS: reflect.TypeFor[HTTP2HTTPSPluginOptions](),
|
||||||
PluginHTTPProxy: reflect.TypeOf(HTTPProxyPluginOptions{}),
|
PluginHTTPProxy: reflect.TypeFor[HTTPProxyPluginOptions](),
|
||||||
PluginHTTPS2HTTP: reflect.TypeOf(HTTPS2HTTPPluginOptions{}),
|
PluginHTTPS2HTTP: reflect.TypeFor[HTTPS2HTTPPluginOptions](),
|
||||||
PluginHTTPS2HTTPS: reflect.TypeOf(HTTPS2HTTPSPluginOptions{}),
|
PluginHTTPS2HTTPS: reflect.TypeFor[HTTPS2HTTPSPluginOptions](),
|
||||||
PluginHTTP2HTTP: reflect.TypeOf(HTTP2HTTPPluginOptions{}),
|
PluginHTTP2HTTP: reflect.TypeFor[HTTP2HTTPPluginOptions](),
|
||||||
PluginSocks5: reflect.TypeOf(Socks5PluginOptions{}),
|
PluginSocks5: reflect.TypeFor[Socks5PluginOptions](),
|
||||||
PluginStaticFile: reflect.TypeOf(StaticFilePluginOptions{}),
|
PluginStaticFile: reflect.TypeFor[StaticFilePluginOptions](),
|
||||||
PluginUnixDomainSocket: reflect.TypeOf(UnixDomainSocketPluginOptions{}),
|
PluginUnixDomainSocket: reflect.TypeFor[UnixDomainSocketPluginOptions](),
|
||||||
PluginTLS2Raw: reflect.TypeOf(TLS2RawPluginOptions{}),
|
PluginTLS2Raw: reflect.TypeFor[TLS2RawPluginOptions](),
|
||||||
PluginVirtualNet: reflect.TypeOf(VirtualNetPluginOptions{}),
|
PluginVirtualNet: reflect.TypeFor[VirtualNetPluginOptions](),
|
||||||
}
|
}
|
||||||
|
|
||||||
type ClientPluginOptions interface {
|
type ClientPluginOptions interface {
|
||||||
|
|||||||
@@ -79,9 +79,9 @@ const (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var visitorConfigTypeMap = map[VisitorType]reflect.Type{
|
var visitorConfigTypeMap = map[VisitorType]reflect.Type{
|
||||||
VisitorTypeSTCP: reflect.TypeOf(STCPVisitorConfig{}),
|
VisitorTypeSTCP: reflect.TypeFor[STCPVisitorConfig](),
|
||||||
VisitorTypeXTCP: reflect.TypeOf(XTCPVisitorConfig{}),
|
VisitorTypeXTCP: reflect.TypeFor[XTCPVisitorConfig](),
|
||||||
VisitorTypeSUDP: reflect.TypeOf(SUDPVisitorConfig{}),
|
VisitorTypeSUDP: reflect.TypeFor[SUDPVisitorConfig](),
|
||||||
}
|
}
|
||||||
|
|
||||||
type TypedVisitorConfig struct {
|
type TypedVisitorConfig struct {
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ const (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var visitorPluginOptionsTypeMap = map[string]reflect.Type{
|
var visitorPluginOptionsTypeMap = map[string]reflect.Type{
|
||||||
VisitorPluginVirtualNet: reflect.TypeOf(VirtualNetVisitorPluginOptions{}),
|
VisitorPluginVirtualNet: reflect.TypeFor[VirtualNetVisitorPluginOptions](),
|
||||||
}
|
}
|
||||||
|
|
||||||
type VisitorPluginOptions interface {
|
type VisitorPluginOptions interface {
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ var msgTypeMap = map[byte]any{
|
|||||||
TypeNatHoleReport: NatHoleReport{},
|
TypeNatHoleReport: NatHoleReport{},
|
||||||
}
|
}
|
||||||
|
|
||||||
var TypeNameNatHoleResp = reflect.TypeOf(&NatHoleResp{}).Elem().Name()
|
var TypeNameNatHoleResp = reflect.TypeFor[NatHoleResp]().Name()
|
||||||
|
|
||||||
type ClientSpec struct {
|
type ClientSpec struct {
|
||||||
// Due to the support of VirtualClient, frps needs to know the client type in order to
|
// Due to the support of VirtualClient, frps needs to know the client type in order to
|
||||||
|
|||||||
@@ -151,7 +151,7 @@ func getBehaviorScoresByMode(mode int, defaultScore int) []*BehaviorScore {
|
|||||||
func getBehaviorScoresByMode2(mode int, senderScore, receiverScore int) []*BehaviorScore {
|
func getBehaviorScoresByMode2(mode int, senderScore, receiverScore int) []*BehaviorScore {
|
||||||
behaviors := getBehaviorByMode(mode)
|
behaviors := getBehaviorByMode(mode)
|
||||||
scores := make([]*BehaviorScore, 0, len(behaviors))
|
scores := make([]*BehaviorScore, 0, len(behaviors))
|
||||||
for i := 0; i < len(behaviors); i++ {
|
for i := range behaviors {
|
||||||
score := receiverScore
|
score := receiverScore
|
||||||
if behaviors[i].A.Role == DetectRoleSender {
|
if behaviors[i].A.Role == DetectRoleSender {
|
||||||
score = senderScore
|
score = senderScore
|
||||||
|
|||||||
@@ -410,7 +410,7 @@ func sendSidMessageToRandomPorts(
|
|||||||
xl := xlog.FromContextSafe(ctx)
|
xl := xlog.FromContextSafe(ctx)
|
||||||
used := sets.New[int]()
|
used := sets.New[int]()
|
||||||
getUnusedPort := func() int {
|
getUnusedPort := func() int {
|
||||||
for i := 0; i < 10; i++ {
|
for range 10 {
|
||||||
port := rand.IntN(65535-1024) + 1024
|
port := rand.IntN(65535-1024) + 1024
|
||||||
if !used.Has(port) {
|
if !used.Has(port) {
|
||||||
used.Insert(port)
|
used.Insert(port)
|
||||||
@@ -420,7 +420,7 @@ func sendSidMessageToRandomPorts(
|
|||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
for i := 0; i < count; i++ {
|
for range count {
|
||||||
select {
|
select {
|
||||||
case <-ctx.Done():
|
case <-ctx.Done():
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -153,10 +153,7 @@ func (p *VirtualNetPlugin) run() {
|
|||||||
|
|
||||||
// Exponential backoff: 60s, 120s, 240s, 300s (capped)
|
// Exponential backoff: 60s, 120s, 240s, 300s (capped)
|
||||||
baseDelay := 60 * time.Second
|
baseDelay := 60 * time.Second
|
||||||
reconnectDelay = baseDelay * time.Duration(1<<uint(p.consecutiveErrors-1))
|
reconnectDelay = min(baseDelay*time.Duration(1<<uint(p.consecutiveErrors-1)), 300*time.Second)
|
||||||
if reconnectDelay > 300*time.Second {
|
|
||||||
reconnectDelay = 300 * time.Second
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
// Reset consecutive errors on successful connection
|
// Reset consecutive errors on successful connection
|
||||||
if p.consecutiveErrors > 0 {
|
if p.consecutiveErrors > 0 {
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ package featuregate
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"maps"
|
||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
@@ -93,9 +94,7 @@ type featureGate struct {
|
|||||||
// NewFeatureGate creates a new feature gate with the default features
|
// NewFeatureGate creates a new feature gate with the default features
|
||||||
func NewFeatureGate() MutableFeatureGate {
|
func NewFeatureGate() MutableFeatureGate {
|
||||||
known := map[Feature]FeatureSpec{}
|
known := map[Feature]FeatureSpec{}
|
||||||
for k, v := range defaultFeatures {
|
maps.Copy(known, defaultFeatures)
|
||||||
known[k] = v
|
|
||||||
}
|
|
||||||
|
|
||||||
f := &featureGate{}
|
f := &featureGate{}
|
||||||
f.known.Store(known)
|
f.known.Store(known)
|
||||||
@@ -110,13 +109,9 @@ func (f *featureGate) SetFromMap(m map[string]bool) error {
|
|||||||
|
|
||||||
// Copy existing state
|
// Copy existing state
|
||||||
known := map[Feature]FeatureSpec{}
|
known := map[Feature]FeatureSpec{}
|
||||||
for k, v := range f.known.Load().(map[Feature]FeatureSpec) {
|
maps.Copy(known, f.known.Load().(map[Feature]FeatureSpec))
|
||||||
known[k] = v
|
|
||||||
}
|
|
||||||
enabled := map[Feature]bool{}
|
enabled := map[Feature]bool{}
|
||||||
for k, v := range f.enabled.Load().(map[Feature]bool) {
|
maps.Copy(enabled, f.enabled.Load().(map[Feature]bool))
|
||||||
enabled[k] = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// Apply the new settings
|
// Apply the new settings
|
||||||
for k, v := range m {
|
for k, v := range m {
|
||||||
@@ -148,9 +143,7 @@ func (f *featureGate) Add(features map[Feature]FeatureSpec) error {
|
|||||||
|
|
||||||
// Copy existing state
|
// Copy existing state
|
||||||
known := map[Feature]FeatureSpec{}
|
known := map[Feature]FeatureSpec{}
|
||||||
for k, v := range f.known.Load().(map[Feature]FeatureSpec) {
|
maps.Copy(known, f.known.Load().(map[Feature]FeatureSpec))
|
||||||
known[k] = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add new features
|
// Add new features
|
||||||
for name, spec := range features {
|
for name, spec := range features {
|
||||||
|
|||||||
@@ -89,11 +89,11 @@ func ParseBasicAuth(auth string) (username, password string, ok bool) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
cs := string(c)
|
cs := string(c)
|
||||||
s := strings.IndexByte(cs, ':')
|
before, after, found := strings.Cut(cs, ":")
|
||||||
if s < 0 {
|
if !found {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
return cs[:s], cs[s+1:], true
|
return before, after, true
|
||||||
}
|
}
|
||||||
|
|
||||||
func BasicAuth(username, passwd string) string {
|
func BasicAuth(username, passwd string) string {
|
||||||
|
|||||||
@@ -86,11 +86,7 @@ func (c *FakeUDPConn) Read(b []byte) (n int, err error) {
|
|||||||
c.lastActive = time.Now()
|
c.lastActive = time.Now()
|
||||||
c.mu.Unlock()
|
c.mu.Unlock()
|
||||||
|
|
||||||
if len(b) < len(content) {
|
n = min(len(b), len(content))
|
||||||
n = len(b)
|
|
||||||
} else {
|
|
||||||
n = len(content)
|
|
||||||
}
|
|
||||||
copy(b, content)
|
copy(b, content)
|
||||||
return n, nil
|
return n, nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -68,8 +68,8 @@ func ParseRangeNumbers(rangeStr string) (numbers []int64, err error) {
|
|||||||
rangeStr = strings.TrimSpace(rangeStr)
|
rangeStr = strings.TrimSpace(rangeStr)
|
||||||
numbers = make([]int64, 0)
|
numbers = make([]int64, 0)
|
||||||
// e.g. 1000-2000,2001,2002,3000-4000
|
// e.g. 1000-2000,2001,2002,3000-4000
|
||||||
numRanges := strings.Split(rangeStr, ",")
|
numRanges := strings.SplitSeq(rangeStr, ",")
|
||||||
for _, numRangeStr := range numRanges {
|
for numRangeStr := range numRanges {
|
||||||
// 1000-2000 or 2001
|
// 1000-2000 or 2001
|
||||||
numArray := strings.Split(numRangeStr, "-")
|
numArray := strings.Split(numRangeStr, "-")
|
||||||
// length: only 1 or 2 is correct
|
// length: only 1 or 2 is correct
|
||||||
|
|||||||
@@ -158,10 +158,7 @@ type Control struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func NewControl(ctx context.Context, sessionCtx *SessionContext) (*Control, error) {
|
func NewControl(ctx context.Context, sessionCtx *SessionContext) (*Control, error) {
|
||||||
poolCount := sessionCtx.LoginMsg.PoolCount
|
poolCount := min(sessionCtx.LoginMsg.PoolCount, int(sessionCtx.ServerCfg.Transport.MaxPoolCount))
|
||||||
if poolCount > int(sessionCtx.ServerCfg.Transport.MaxPoolCount) {
|
|
||||||
poolCount = int(sessionCtx.ServerCfg.Transport.MaxPoolCount)
|
|
||||||
}
|
|
||||||
ctl := &Control{
|
ctl := &Control{
|
||||||
sessionCtx: sessionCtx,
|
sessionCtx: sessionCtx,
|
||||||
workConnCh: make(chan net.Conn, poolCount+10),
|
workConnCh: make(chan net.Conn, poolCount+10),
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
RegisterProxyFactory(reflect.TypeOf(&v1.HTTPProxyConfig{}), NewHTTPProxy)
|
RegisterProxyFactory(reflect.TypeFor[*v1.HTTPProxyConfig](), NewHTTPProxy)
|
||||||
}
|
}
|
||||||
|
|
||||||
type HTTPProxy struct {
|
type HTTPProxy struct {
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
RegisterProxyFactory(reflect.TypeOf(&v1.HTTPSProxyConfig{}), NewHTTPSProxy)
|
RegisterProxyFactory(reflect.TypeFor[*v1.HTTPSProxyConfig](), NewHTTPSProxy)
|
||||||
}
|
}
|
||||||
|
|
||||||
type HTTPSProxy struct {
|
type HTTPSProxy struct {
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
RegisterProxyFactory(reflect.TypeOf(&v1.STCPProxyConfig{}), NewSTCPProxy)
|
RegisterProxyFactory(reflect.TypeFor[*v1.STCPProxyConfig](), NewSTCPProxy)
|
||||||
}
|
}
|
||||||
|
|
||||||
type STCPProxy struct {
|
type STCPProxy struct {
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
RegisterProxyFactory(reflect.TypeOf(&v1.SUDPProxyConfig{}), NewSUDPProxy)
|
RegisterProxyFactory(reflect.TypeFor[*v1.SUDPProxyConfig](), NewSUDPProxy)
|
||||||
}
|
}
|
||||||
|
|
||||||
type SUDPProxy struct {
|
type SUDPProxy struct {
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
RegisterProxyFactory(reflect.TypeOf(&v1.TCPProxyConfig{}), NewTCPProxy)
|
RegisterProxyFactory(reflect.TypeFor[*v1.TCPProxyConfig](), NewTCPProxy)
|
||||||
}
|
}
|
||||||
|
|
||||||
type TCPProxy struct {
|
type TCPProxy struct {
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
RegisterProxyFactory(reflect.TypeOf(&v1.TCPMuxProxyConfig{}), NewTCPMuxProxy)
|
RegisterProxyFactory(reflect.TypeFor[*v1.TCPMuxProxyConfig](), NewTCPMuxProxy)
|
||||||
}
|
}
|
||||||
|
|
||||||
type TCPMuxProxy struct {
|
type TCPMuxProxy struct {
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
RegisterProxyFactory(reflect.TypeOf(&v1.UDPProxyConfig{}), NewUDPProxy)
|
RegisterProxyFactory(reflect.TypeFor[*v1.UDPProxyConfig](), NewUDPProxy)
|
||||||
}
|
}
|
||||||
|
|
||||||
type UDPProxy struct {
|
type UDPProxy struct {
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
RegisterProxyFactory(reflect.TypeOf(&v1.XTCPProxyConfig{}), NewXTCPProxy)
|
RegisterProxyFactory(reflect.TypeFor[*v1.XTCPProxyConfig](), NewXTCPProxy)
|
||||||
}
|
}
|
||||||
|
|
||||||
type XTCPProxy struct {
|
type XTCPProxy struct {
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package framework
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"maps"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"time"
|
"time"
|
||||||
@@ -20,9 +21,7 @@ func (f *Framework) RunProcesses(serverTemplates []string, clientTemplates []str
|
|||||||
ExpectNoError(err)
|
ExpectNoError(err)
|
||||||
ExpectTrue(len(templates) > 0)
|
ExpectTrue(len(templates) > 0)
|
||||||
|
|
||||||
for name, port := range ports {
|
maps.Copy(f.usedPorts, ports)
|
||||||
f.usedPorts[name] = port
|
|
||||||
}
|
|
||||||
|
|
||||||
currentServerProcesses := make([]*process.Process, 0, len(serverTemplates))
|
currentServerProcesses := make([]*process.Process, 0, len(serverTemplates))
|
||||||
for i := range serverTemplates {
|
for i := range serverTemplates {
|
||||||
|
|||||||
@@ -26,7 +26,8 @@ var _ = ginkgo.Describe("[Feature: Basic]", func() {
|
|||||||
proxyType := t
|
proxyType := t
|
||||||
ginkgo.It(fmt.Sprintf("Expose a %s echo server", strings.ToUpper(proxyType)), func() {
|
ginkgo.It(fmt.Sprintf("Expose a %s echo server", strings.ToUpper(proxyType)), func() {
|
||||||
serverConf := consts.LegacyDefaultServerConfig
|
serverConf := consts.LegacyDefaultServerConfig
|
||||||
clientConf := consts.LegacyDefaultClientConfig
|
var clientConf strings.Builder
|
||||||
|
clientConf.WriteString(consts.LegacyDefaultClientConfig)
|
||||||
|
|
||||||
localPortName := ""
|
localPortName := ""
|
||||||
protocol := "tcp"
|
protocol := "tcp"
|
||||||
@@ -78,10 +79,10 @@ var _ = ginkgo.Describe("[Feature: Basic]", func() {
|
|||||||
|
|
||||||
// build all client config
|
// build all client config
|
||||||
for _, test := range tests {
|
for _, test := range tests {
|
||||||
clientConf += getProxyConf(test.proxyName, test.portName, test.extraConfig) + "\n"
|
clientConf.WriteString(getProxyConf(test.proxyName, test.portName, test.extraConfig) + "\n")
|
||||||
}
|
}
|
||||||
// run frps and frpc
|
// run frps and frpc
|
||||||
f.RunProcesses([]string{serverConf}, []string{clientConf})
|
f.RunProcesses([]string{serverConf}, []string{clientConf.String()})
|
||||||
|
|
||||||
for _, test := range tests {
|
for _, test := range tests {
|
||||||
framework.NewRequestExpect(f).
|
framework.NewRequestExpect(f).
|
||||||
@@ -102,7 +103,8 @@ var _ = ginkgo.Describe("[Feature: Basic]", func() {
|
|||||||
vhost_http_port = %d
|
vhost_http_port = %d
|
||||||
`, vhostHTTPPort)
|
`, vhostHTTPPort)
|
||||||
|
|
||||||
clientConf := consts.LegacyDefaultClientConfig
|
var clientConf strings.Builder
|
||||||
|
clientConf.WriteString(consts.LegacyDefaultClientConfig)
|
||||||
|
|
||||||
getProxyConf := func(proxyName string, customDomains string, extra string) string {
|
getProxyConf := func(proxyName string, customDomains string, extra string) string {
|
||||||
return fmt.Sprintf(`
|
return fmt.Sprintf(`
|
||||||
@@ -147,13 +149,13 @@ var _ = ginkgo.Describe("[Feature: Basic]", func() {
|
|||||||
if tests[i].customDomains == "" {
|
if tests[i].customDomains == "" {
|
||||||
tests[i].customDomains = test.proxyName + ".example.com"
|
tests[i].customDomains = test.proxyName + ".example.com"
|
||||||
}
|
}
|
||||||
clientConf += getProxyConf(test.proxyName, tests[i].customDomains, test.extraConfig) + "\n"
|
clientConf.WriteString(getProxyConf(test.proxyName, tests[i].customDomains, test.extraConfig) + "\n")
|
||||||
}
|
}
|
||||||
// run frps and frpc
|
// run frps and frpc
|
||||||
f.RunProcesses([]string{serverConf}, []string{clientConf})
|
f.RunProcesses([]string{serverConf}, []string{clientConf.String()})
|
||||||
|
|
||||||
for _, test := range tests {
|
for _, test := range tests {
|
||||||
for _, domain := range strings.Split(test.customDomains, ",") {
|
for domain := range strings.SplitSeq(test.customDomains, ",") {
|
||||||
domain = strings.TrimSpace(domain)
|
domain = strings.TrimSpace(domain)
|
||||||
framework.NewRequestExpect(f).
|
framework.NewRequestExpect(f).
|
||||||
Explain(test.proxyName + "-" + domain).
|
Explain(test.proxyName + "-" + domain).
|
||||||
@@ -185,7 +187,8 @@ var _ = ginkgo.Describe("[Feature: Basic]", func() {
|
|||||||
`, vhostHTTPSPort)
|
`, vhostHTTPSPort)
|
||||||
|
|
||||||
localPort := f.AllocPort()
|
localPort := f.AllocPort()
|
||||||
clientConf := consts.LegacyDefaultClientConfig
|
var clientConf strings.Builder
|
||||||
|
clientConf.WriteString(consts.LegacyDefaultClientConfig)
|
||||||
getProxyConf := func(proxyName string, customDomains string, extra string) string {
|
getProxyConf := func(proxyName string, customDomains string, extra string) string {
|
||||||
return fmt.Sprintf(`
|
return fmt.Sprintf(`
|
||||||
[%s]
|
[%s]
|
||||||
@@ -229,10 +232,10 @@ var _ = ginkgo.Describe("[Feature: Basic]", func() {
|
|||||||
if tests[i].customDomains == "" {
|
if tests[i].customDomains == "" {
|
||||||
tests[i].customDomains = test.proxyName + ".example.com"
|
tests[i].customDomains = test.proxyName + ".example.com"
|
||||||
}
|
}
|
||||||
clientConf += getProxyConf(test.proxyName, tests[i].customDomains, test.extraConfig) + "\n"
|
clientConf.WriteString(getProxyConf(test.proxyName, tests[i].customDomains, test.extraConfig) + "\n")
|
||||||
}
|
}
|
||||||
// run frps and frpc
|
// run frps and frpc
|
||||||
f.RunProcesses([]string{serverConf}, []string{clientConf})
|
f.RunProcesses([]string{serverConf}, []string{clientConf.String()})
|
||||||
|
|
||||||
tlsConfig, err := transport.NewServerTLSConfig("", "", "")
|
tlsConfig, err := transport.NewServerTLSConfig("", "", "")
|
||||||
framework.ExpectNoError(err)
|
framework.ExpectNoError(err)
|
||||||
@@ -244,7 +247,7 @@ var _ = ginkgo.Describe("[Feature: Basic]", func() {
|
|||||||
f.RunServer("", localServer)
|
f.RunServer("", localServer)
|
||||||
|
|
||||||
for _, test := range tests {
|
for _, test := range tests {
|
||||||
for _, domain := range strings.Split(test.customDomains, ",") {
|
for domain := range strings.SplitSeq(test.customDomains, ",") {
|
||||||
domain = strings.TrimSpace(domain)
|
domain = strings.TrimSpace(domain)
|
||||||
framework.NewRequestExpect(f).
|
framework.NewRequestExpect(f).
|
||||||
Explain(test.proxyName + "-" + domain).
|
Explain(test.proxyName + "-" + domain).
|
||||||
@@ -282,9 +285,12 @@ var _ = ginkgo.Describe("[Feature: Basic]", func() {
|
|||||||
proxyType := t
|
proxyType := t
|
||||||
ginkgo.It(fmt.Sprintf("Expose echo server with %s", strings.ToUpper(proxyType)), func() {
|
ginkgo.It(fmt.Sprintf("Expose echo server with %s", strings.ToUpper(proxyType)), func() {
|
||||||
serverConf := consts.LegacyDefaultServerConfig
|
serverConf := consts.LegacyDefaultServerConfig
|
||||||
clientServerConf := consts.LegacyDefaultClientConfig + "\nuser = user1"
|
var clientServerConf strings.Builder
|
||||||
clientVisitorConf := consts.LegacyDefaultClientConfig + "\nuser = user1"
|
clientServerConf.WriteString(consts.LegacyDefaultClientConfig + "\nuser = user1")
|
||||||
clientUser2VisitorConf := consts.LegacyDefaultClientConfig + "\nuser = user2"
|
var clientVisitorConf strings.Builder
|
||||||
|
clientVisitorConf.WriteString(consts.LegacyDefaultClientConfig + "\nuser = user1")
|
||||||
|
var clientUser2VisitorConf strings.Builder
|
||||||
|
clientUser2VisitorConf.WriteString(consts.LegacyDefaultClientConfig + "\nuser = user2")
|
||||||
|
|
||||||
localPortName := ""
|
localPortName := ""
|
||||||
protocol := "tcp"
|
protocol := "tcp"
|
||||||
@@ -400,20 +406,20 @@ var _ = ginkgo.Describe("[Feature: Basic]", func() {
|
|||||||
|
|
||||||
// build all client config
|
// build all client config
|
||||||
for _, test := range tests {
|
for _, test := range tests {
|
||||||
clientServerConf += getProxyServerConf(test.proxyName, test.commonExtraConfig+"\n"+test.proxyExtraConfig) + "\n"
|
clientServerConf.WriteString(getProxyServerConf(test.proxyName, test.commonExtraConfig+"\n"+test.proxyExtraConfig) + "\n")
|
||||||
}
|
}
|
||||||
for _, test := range tests {
|
for _, test := range tests {
|
||||||
config := getProxyVisitorConf(
|
config := getProxyVisitorConf(
|
||||||
test.proxyName, test.bindPortName, test.visitorSK, test.commonExtraConfig+"\n"+test.visitorExtraConfig,
|
test.proxyName, test.bindPortName, test.visitorSK, test.commonExtraConfig+"\n"+test.visitorExtraConfig,
|
||||||
) + "\n"
|
) + "\n"
|
||||||
if test.deployUser2Client {
|
if test.deployUser2Client {
|
||||||
clientUser2VisitorConf += config
|
clientUser2VisitorConf.WriteString(config)
|
||||||
} else {
|
} else {
|
||||||
clientVisitorConf += config
|
clientVisitorConf.WriteString(config)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// run frps and frpc
|
// run frps and frpc
|
||||||
f.RunProcesses([]string{serverConf}, []string{clientServerConf, clientVisitorConf, clientUser2VisitorConf})
|
f.RunProcesses([]string{serverConf}, []string{clientServerConf.String(), clientVisitorConf.String(), clientUser2VisitorConf.String()})
|
||||||
|
|
||||||
for _, test := range tests {
|
for _, test := range tests {
|
||||||
timeout := time.Second
|
timeout := time.Second
|
||||||
@@ -440,7 +446,8 @@ var _ = ginkgo.Describe("[Feature: Basic]", func() {
|
|||||||
ginkgo.Describe("TCPMUX", func() {
|
ginkgo.Describe("TCPMUX", func() {
|
||||||
ginkgo.It("Type tcpmux", func() {
|
ginkgo.It("Type tcpmux", func() {
|
||||||
serverConf := consts.LegacyDefaultServerConfig
|
serverConf := consts.LegacyDefaultServerConfig
|
||||||
clientConf := consts.LegacyDefaultClientConfig
|
var clientConf strings.Builder
|
||||||
|
clientConf.WriteString(consts.LegacyDefaultClientConfig)
|
||||||
|
|
||||||
tcpmuxHTTPConnectPortName := port.GenName("TCPMUX")
|
tcpmuxHTTPConnectPortName := port.GenName("TCPMUX")
|
||||||
serverConf += fmt.Sprintf(`
|
serverConf += fmt.Sprintf(`
|
||||||
@@ -483,14 +490,14 @@ var _ = ginkgo.Describe("[Feature: Basic]", func() {
|
|||||||
|
|
||||||
// build all client config
|
// build all client config
|
||||||
for _, test := range tests {
|
for _, test := range tests {
|
||||||
clientConf += getProxyConf(test.proxyName, test.extraConfig) + "\n"
|
clientConf.WriteString(getProxyConf(test.proxyName, test.extraConfig) + "\n")
|
||||||
|
|
||||||
localServer := streamserver.New(streamserver.TCP, streamserver.WithBindPort(f.AllocPort()), streamserver.WithRespContent([]byte(test.proxyName)))
|
localServer := streamserver.New(streamserver.TCP, streamserver.WithBindPort(f.AllocPort()), streamserver.WithRespContent([]byte(test.proxyName)))
|
||||||
f.RunServer(port.GenName(test.proxyName), localServer)
|
f.RunServer(port.GenName(test.proxyName), localServer)
|
||||||
}
|
}
|
||||||
|
|
||||||
// run frps and frpc
|
// run frps and frpc
|
||||||
f.RunProcesses([]string{serverConf}, []string{clientConf})
|
f.RunProcesses([]string{serverConf}, []string{clientConf.String()})
|
||||||
|
|
||||||
// Request without HTTP connect should get error
|
// Request without HTTP connect should get error
|
||||||
framework.NewRequestExpect(f).
|
framework.NewRequestExpect(f).
|
||||||
|
|||||||
@@ -48,12 +48,10 @@ var _ = ginkgo.Describe("[Feature: Group]", func() {
|
|||||||
return true
|
return true
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
for i := 0; i < 10; i++ {
|
for range 10 {
|
||||||
wait.Add(1)
|
wait.Go(func() {
|
||||||
go func() {
|
|
||||||
defer wait.Done()
|
|
||||||
expectFn()
|
expectFn()
|
||||||
}()
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
wait.Wait()
|
wait.Wait()
|
||||||
@@ -94,7 +92,7 @@ var _ = ginkgo.Describe("[Feature: Group]", func() {
|
|||||||
|
|
||||||
fooCount := 0
|
fooCount := 0
|
||||||
barCount := 0
|
barCount := 0
|
||||||
for i := 0; i < 10; i++ {
|
for i := range 10 {
|
||||||
framework.NewRequestExpect(f).Explain("times " + strconv.Itoa(i)).Port(remotePort).Ensure(func(resp *request.Response) bool {
|
framework.NewRequestExpect(f).Explain("times " + strconv.Itoa(i)).Port(remotePort).Ensure(func(resp *request.Response) bool {
|
||||||
switch string(resp.Content) {
|
switch string(resp.Content) {
|
||||||
case "foo":
|
case "foo":
|
||||||
@@ -150,7 +148,7 @@ var _ = ginkgo.Describe("[Feature: Group]", func() {
|
|||||||
|
|
||||||
// check foo and bar is ok
|
// check foo and bar is ok
|
||||||
results := []string{}
|
results := []string{}
|
||||||
for i := 0; i < 10; i++ {
|
for range 10 {
|
||||||
framework.NewRequestExpect(f).Port(remotePort).Ensure(validateFooBarResponse, func(resp *request.Response) bool {
|
framework.NewRequestExpect(f).Port(remotePort).Ensure(validateFooBarResponse, func(resp *request.Response) bool {
|
||||||
results = append(results, string(resp.Content))
|
results = append(results, string(resp.Content))
|
||||||
return true
|
return true
|
||||||
@@ -161,7 +159,7 @@ var _ = ginkgo.Describe("[Feature: Group]", func() {
|
|||||||
// close bar server, check foo is ok
|
// close bar server, check foo is ok
|
||||||
barServer.Close()
|
barServer.Close()
|
||||||
time.Sleep(2 * time.Second)
|
time.Sleep(2 * time.Second)
|
||||||
for i := 0; i < 10; i++ {
|
for range 10 {
|
||||||
framework.NewRequestExpect(f).Port(remotePort).ExpectResp([]byte("foo")).Ensure()
|
framework.NewRequestExpect(f).Port(remotePort).ExpectResp([]byte("foo")).Ensure()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -169,7 +167,7 @@ var _ = ginkgo.Describe("[Feature: Group]", func() {
|
|||||||
f.RunServer("", barServer)
|
f.RunServer("", barServer)
|
||||||
time.Sleep(2 * time.Second)
|
time.Sleep(2 * time.Second)
|
||||||
results = []string{}
|
results = []string{}
|
||||||
for i := 0; i < 10; i++ {
|
for range 10 {
|
||||||
framework.NewRequestExpect(f).Port(remotePort).Ensure(validateFooBarResponse, func(resp *request.Response) bool {
|
framework.NewRequestExpect(f).Port(remotePort).Ensure(validateFooBarResponse, func(resp *request.Response) bool {
|
||||||
results = append(results, string(resp.Content))
|
results = append(results, string(resp.Content))
|
||||||
return true
|
return true
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import (
|
|||||||
"crypto/tls"
|
"crypto/tls"
|
||||||
"fmt"
|
"fmt"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/onsi/ginkgo/v2"
|
"github.com/onsi/ginkgo/v2"
|
||||||
|
|
||||||
@@ -22,7 +23,8 @@ var _ = ginkgo.Describe("[Feature: Client-Plugins]", func() {
|
|||||||
ginkgo.Describe("UnixDomainSocket", func() {
|
ginkgo.Describe("UnixDomainSocket", func() {
|
||||||
ginkgo.It("Expose a unix domain socket echo server", func() {
|
ginkgo.It("Expose a unix domain socket echo server", func() {
|
||||||
serverConf := consts.LegacyDefaultServerConfig
|
serverConf := consts.LegacyDefaultServerConfig
|
||||||
clientConf := consts.LegacyDefaultClientConfig
|
var clientConf strings.Builder
|
||||||
|
clientConf.WriteString(consts.LegacyDefaultClientConfig)
|
||||||
|
|
||||||
getProxyConf := func(proxyName string, portName string, extra string) string {
|
getProxyConf := func(proxyName string, portName string, extra string) string {
|
||||||
return fmt.Sprintf(`
|
return fmt.Sprintf(`
|
||||||
@@ -65,10 +67,10 @@ var _ = ginkgo.Describe("[Feature: Client-Plugins]", func() {
|
|||||||
|
|
||||||
// build all client config
|
// build all client config
|
||||||
for _, test := range tests {
|
for _, test := range tests {
|
||||||
clientConf += getProxyConf(test.proxyName, test.portName, test.extraConfig) + "\n"
|
clientConf.WriteString(getProxyConf(test.proxyName, test.portName, test.extraConfig) + "\n")
|
||||||
}
|
}
|
||||||
// run frps and frpc
|
// run frps and frpc
|
||||||
f.RunProcesses([]string{serverConf}, []string{clientConf})
|
f.RunProcesses([]string{serverConf}, []string{clientConf.String()})
|
||||||
|
|
||||||
for _, test := range tests {
|
for _, test := range tests {
|
||||||
framework.NewRequestExpect(f).Port(f.PortByName(test.portName)).Ensure()
|
framework.NewRequestExpect(f).Port(f.PortByName(test.portName)).Ensure()
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ func (pa *Allocator) GetByName(portName string) int {
|
|||||||
pa.mu.Lock()
|
pa.mu.Lock()
|
||||||
defer pa.mu.Unlock()
|
defer pa.mu.Unlock()
|
||||||
|
|
||||||
for i := 0; i < 20; i++ {
|
for range 20 {
|
||||||
port := pa.getByRange(builder.rangePortFrom, builder.rangePortTo)
|
port := pa.getByRange(builder.rangePortFrom, builder.rangePortTo)
|
||||||
if port == 0 {
|
if port == 0 {
|
||||||
return 0
|
return 0
|
||||||
|
|||||||
@@ -26,7 +26,8 @@ var _ = ginkgo.Describe("[Feature: Basic]", func() {
|
|||||||
proxyType := t
|
proxyType := t
|
||||||
ginkgo.It(fmt.Sprintf("Expose a %s echo server", strings.ToUpper(proxyType)), func() {
|
ginkgo.It(fmt.Sprintf("Expose a %s echo server", strings.ToUpper(proxyType)), func() {
|
||||||
serverConf := consts.DefaultServerConfig
|
serverConf := consts.DefaultServerConfig
|
||||||
clientConf := consts.DefaultClientConfig
|
var clientConf strings.Builder
|
||||||
|
clientConf.WriteString(consts.DefaultClientConfig)
|
||||||
|
|
||||||
localPortName := ""
|
localPortName := ""
|
||||||
protocol := "tcp"
|
protocol := "tcp"
|
||||||
@@ -79,10 +80,10 @@ var _ = ginkgo.Describe("[Feature: Basic]", func() {
|
|||||||
|
|
||||||
// build all client config
|
// build all client config
|
||||||
for _, test := range tests {
|
for _, test := range tests {
|
||||||
clientConf += getProxyConf(test.proxyName, test.portName, test.extraConfig) + "\n"
|
clientConf.WriteString(getProxyConf(test.proxyName, test.portName, test.extraConfig) + "\n")
|
||||||
}
|
}
|
||||||
// run frps and frpc
|
// run frps and frpc
|
||||||
f.RunProcesses([]string{serverConf}, []string{clientConf})
|
f.RunProcesses([]string{serverConf}, []string{clientConf.String()})
|
||||||
|
|
||||||
for _, test := range tests {
|
for _, test := range tests {
|
||||||
framework.NewRequestExpect(f).
|
framework.NewRequestExpect(f).
|
||||||
@@ -103,7 +104,8 @@ var _ = ginkgo.Describe("[Feature: Basic]", func() {
|
|||||||
vhostHTTPPort = %d
|
vhostHTTPPort = %d
|
||||||
`, vhostHTTPPort)
|
`, vhostHTTPPort)
|
||||||
|
|
||||||
clientConf := consts.DefaultClientConfig
|
var clientConf strings.Builder
|
||||||
|
clientConf.WriteString(consts.DefaultClientConfig)
|
||||||
|
|
||||||
getProxyConf := func(proxyName string, customDomains string, extra string) string {
|
getProxyConf := func(proxyName string, customDomains string, extra string) string {
|
||||||
return fmt.Sprintf(`
|
return fmt.Sprintf(`
|
||||||
@@ -149,13 +151,13 @@ var _ = ginkgo.Describe("[Feature: Basic]", func() {
|
|||||||
if tests[i].customDomains == "" {
|
if tests[i].customDomains == "" {
|
||||||
tests[i].customDomains = fmt.Sprintf(`["%s"]`, test.proxyName+".example.com")
|
tests[i].customDomains = fmt.Sprintf(`["%s"]`, test.proxyName+".example.com")
|
||||||
}
|
}
|
||||||
clientConf += getProxyConf(test.proxyName, tests[i].customDomains, test.extraConfig) + "\n"
|
clientConf.WriteString(getProxyConf(test.proxyName, tests[i].customDomains, test.extraConfig) + "\n")
|
||||||
}
|
}
|
||||||
// run frps and frpc
|
// run frps and frpc
|
||||||
f.RunProcesses([]string{serverConf}, []string{clientConf})
|
f.RunProcesses([]string{serverConf}, []string{clientConf.String()})
|
||||||
|
|
||||||
for _, test := range tests {
|
for _, test := range tests {
|
||||||
for _, domain := range strings.Split(test.customDomains, ",") {
|
for domain := range strings.SplitSeq(test.customDomains, ",") {
|
||||||
domain = strings.TrimSpace(domain)
|
domain = strings.TrimSpace(domain)
|
||||||
domain = strings.TrimLeft(domain, "[\"")
|
domain = strings.TrimLeft(domain, "[\"")
|
||||||
domain = strings.TrimRight(domain, "]\"")
|
domain = strings.TrimRight(domain, "]\"")
|
||||||
@@ -189,7 +191,8 @@ var _ = ginkgo.Describe("[Feature: Basic]", func() {
|
|||||||
`, vhostHTTPSPort)
|
`, vhostHTTPSPort)
|
||||||
|
|
||||||
localPort := f.AllocPort()
|
localPort := f.AllocPort()
|
||||||
clientConf := consts.DefaultClientConfig
|
var clientConf strings.Builder
|
||||||
|
clientConf.WriteString(consts.DefaultClientConfig)
|
||||||
getProxyConf := func(proxyName string, customDomains string, extra string) string {
|
getProxyConf := func(proxyName string, customDomains string, extra string) string {
|
||||||
return fmt.Sprintf(`
|
return fmt.Sprintf(`
|
||||||
[[proxies]]
|
[[proxies]]
|
||||||
@@ -234,10 +237,10 @@ var _ = ginkgo.Describe("[Feature: Basic]", func() {
|
|||||||
if tests[i].customDomains == "" {
|
if tests[i].customDomains == "" {
|
||||||
tests[i].customDomains = fmt.Sprintf(`["%s"]`, test.proxyName+".example.com")
|
tests[i].customDomains = fmt.Sprintf(`["%s"]`, test.proxyName+".example.com")
|
||||||
}
|
}
|
||||||
clientConf += getProxyConf(test.proxyName, tests[i].customDomains, test.extraConfig) + "\n"
|
clientConf.WriteString(getProxyConf(test.proxyName, tests[i].customDomains, test.extraConfig) + "\n")
|
||||||
}
|
}
|
||||||
// run frps and frpc
|
// run frps and frpc
|
||||||
f.RunProcesses([]string{serverConf}, []string{clientConf})
|
f.RunProcesses([]string{serverConf}, []string{clientConf.String()})
|
||||||
|
|
||||||
tlsConfig, err := transport.NewServerTLSConfig("", "", "")
|
tlsConfig, err := transport.NewServerTLSConfig("", "", "")
|
||||||
framework.ExpectNoError(err)
|
framework.ExpectNoError(err)
|
||||||
@@ -249,7 +252,7 @@ var _ = ginkgo.Describe("[Feature: Basic]", func() {
|
|||||||
f.RunServer("", localServer)
|
f.RunServer("", localServer)
|
||||||
|
|
||||||
for _, test := range tests {
|
for _, test := range tests {
|
||||||
for _, domain := range strings.Split(test.customDomains, ",") {
|
for domain := range strings.SplitSeq(test.customDomains, ",") {
|
||||||
domain = strings.TrimSpace(domain)
|
domain = strings.TrimSpace(domain)
|
||||||
domain = strings.TrimLeft(domain, "[\"")
|
domain = strings.TrimLeft(domain, "[\"")
|
||||||
domain = strings.TrimRight(domain, "]\"")
|
domain = strings.TrimRight(domain, "]\"")
|
||||||
@@ -289,9 +292,12 @@ var _ = ginkgo.Describe("[Feature: Basic]", func() {
|
|||||||
proxyType := t
|
proxyType := t
|
||||||
ginkgo.It(fmt.Sprintf("Expose echo server with %s", strings.ToUpper(proxyType)), func() {
|
ginkgo.It(fmt.Sprintf("Expose echo server with %s", strings.ToUpper(proxyType)), func() {
|
||||||
serverConf := consts.DefaultServerConfig
|
serverConf := consts.DefaultServerConfig
|
||||||
clientServerConf := consts.DefaultClientConfig + "\nuser = \"user1\""
|
var clientServerConf strings.Builder
|
||||||
clientVisitorConf := consts.DefaultClientConfig + "\nuser = \"user1\""
|
clientServerConf.WriteString(consts.DefaultClientConfig + "\nuser = \"user1\"")
|
||||||
clientUser2VisitorConf := consts.DefaultClientConfig + "\nuser = \"user2\""
|
var clientVisitorConf strings.Builder
|
||||||
|
clientVisitorConf.WriteString(consts.DefaultClientConfig + "\nuser = \"user1\"")
|
||||||
|
var clientUser2VisitorConf strings.Builder
|
||||||
|
clientUser2VisitorConf.WriteString(consts.DefaultClientConfig + "\nuser = \"user2\"")
|
||||||
|
|
||||||
localPortName := ""
|
localPortName := ""
|
||||||
protocol := "tcp"
|
protocol := "tcp"
|
||||||
@@ -407,20 +413,20 @@ var _ = ginkgo.Describe("[Feature: Basic]", func() {
|
|||||||
|
|
||||||
// build all client config
|
// build all client config
|
||||||
for _, test := range tests {
|
for _, test := range tests {
|
||||||
clientServerConf += getProxyServerConf(test.proxyName, test.commonExtraConfig+"\n"+test.proxyExtraConfig) + "\n"
|
clientServerConf.WriteString(getProxyServerConf(test.proxyName, test.commonExtraConfig+"\n"+test.proxyExtraConfig) + "\n")
|
||||||
}
|
}
|
||||||
for _, test := range tests {
|
for _, test := range tests {
|
||||||
config := getProxyVisitorConf(
|
config := getProxyVisitorConf(
|
||||||
test.proxyName, test.bindPortName, test.visitorSK, test.commonExtraConfig+"\n"+test.visitorExtraConfig,
|
test.proxyName, test.bindPortName, test.visitorSK, test.commonExtraConfig+"\n"+test.visitorExtraConfig,
|
||||||
) + "\n"
|
) + "\n"
|
||||||
if test.deployUser2Client {
|
if test.deployUser2Client {
|
||||||
clientUser2VisitorConf += config
|
clientUser2VisitorConf.WriteString(config)
|
||||||
} else {
|
} else {
|
||||||
clientVisitorConf += config
|
clientVisitorConf.WriteString(config)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// run frps and frpc
|
// run frps and frpc
|
||||||
f.RunProcesses([]string{serverConf}, []string{clientServerConf, clientVisitorConf, clientUser2VisitorConf})
|
f.RunProcesses([]string{serverConf}, []string{clientServerConf.String(), clientVisitorConf.String(), clientUser2VisitorConf.String()})
|
||||||
|
|
||||||
for _, test := range tests {
|
for _, test := range tests {
|
||||||
timeout := time.Second
|
timeout := time.Second
|
||||||
@@ -447,7 +453,8 @@ var _ = ginkgo.Describe("[Feature: Basic]", func() {
|
|||||||
ginkgo.Describe("TCPMUX", func() {
|
ginkgo.Describe("TCPMUX", func() {
|
||||||
ginkgo.It("Type tcpmux", func() {
|
ginkgo.It("Type tcpmux", func() {
|
||||||
serverConf := consts.DefaultServerConfig
|
serverConf := consts.DefaultServerConfig
|
||||||
clientConf := consts.DefaultClientConfig
|
var clientConf strings.Builder
|
||||||
|
clientConf.WriteString(consts.DefaultClientConfig)
|
||||||
|
|
||||||
tcpmuxHTTPConnectPortName := port.GenName("TCPMUX")
|
tcpmuxHTTPConnectPortName := port.GenName("TCPMUX")
|
||||||
serverConf += fmt.Sprintf(`
|
serverConf += fmt.Sprintf(`
|
||||||
@@ -491,14 +498,14 @@ var _ = ginkgo.Describe("[Feature: Basic]", func() {
|
|||||||
|
|
||||||
// build all client config
|
// build all client config
|
||||||
for _, test := range tests {
|
for _, test := range tests {
|
||||||
clientConf += getProxyConf(test.proxyName, test.extraConfig) + "\n"
|
clientConf.WriteString(getProxyConf(test.proxyName, test.extraConfig) + "\n")
|
||||||
|
|
||||||
localServer := streamserver.New(streamserver.TCP, streamserver.WithBindPort(f.AllocPort()), streamserver.WithRespContent([]byte(test.proxyName)))
|
localServer := streamserver.New(streamserver.TCP, streamserver.WithBindPort(f.AllocPort()), streamserver.WithRespContent([]byte(test.proxyName)))
|
||||||
f.RunServer(port.GenName(test.proxyName), localServer)
|
f.RunServer(port.GenName(test.proxyName), localServer)
|
||||||
}
|
}
|
||||||
|
|
||||||
// run frps and frpc
|
// run frps and frpc
|
||||||
f.RunProcesses([]string{serverConf}, []string{clientConf})
|
f.RunProcesses([]string{serverConf}, []string{clientConf.String()})
|
||||||
|
|
||||||
// Request without HTTP connect should get error
|
// Request without HTTP connect should get error
|
||||||
framework.NewRequestExpect(f).
|
framework.NewRequestExpect(f).
|
||||||
|
|||||||
@@ -50,12 +50,10 @@ var _ = ginkgo.Describe("[Feature: Group]", func() {
|
|||||||
return true
|
return true
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
for i := 0; i < 10; i++ {
|
for range 10 {
|
||||||
wait.Add(1)
|
wait.Go(func() {
|
||||||
go func() {
|
|
||||||
defer wait.Done()
|
|
||||||
expectFn()
|
expectFn()
|
||||||
}()
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
wait.Wait()
|
wait.Wait()
|
||||||
@@ -98,7 +96,7 @@ var _ = ginkgo.Describe("[Feature: Group]", func() {
|
|||||||
|
|
||||||
fooCount := 0
|
fooCount := 0
|
||||||
barCount := 0
|
barCount := 0
|
||||||
for i := 0; i < 10; i++ {
|
for i := range 10 {
|
||||||
framework.NewRequestExpect(f).Explain("times " + strconv.Itoa(i)).Port(remotePort).Ensure(func(resp *request.Response) bool {
|
framework.NewRequestExpect(f).Explain("times " + strconv.Itoa(i)).Port(remotePort).Ensure(func(resp *request.Response) bool {
|
||||||
switch string(resp.Content) {
|
switch string(resp.Content) {
|
||||||
case "foo":
|
case "foo":
|
||||||
@@ -163,7 +161,7 @@ var _ = ginkgo.Describe("[Feature: Group]", func() {
|
|||||||
|
|
||||||
fooCount := 0
|
fooCount := 0
|
||||||
barCount := 0
|
barCount := 0
|
||||||
for i := 0; i < 10; i++ {
|
for i := range 10 {
|
||||||
framework.NewRequestExpect(f).
|
framework.NewRequestExpect(f).
|
||||||
Explain("times " + strconv.Itoa(i)).
|
Explain("times " + strconv.Itoa(i)).
|
||||||
Port(vhostHTTPSPort).
|
Port(vhostHTTPSPort).
|
||||||
@@ -230,7 +228,7 @@ var _ = ginkgo.Describe("[Feature: Group]", func() {
|
|||||||
|
|
||||||
// check foo and bar is ok
|
// check foo and bar is ok
|
||||||
results := []string{}
|
results := []string{}
|
||||||
for i := 0; i < 10; i++ {
|
for range 10 {
|
||||||
framework.NewRequestExpect(f).Port(remotePort).Ensure(validateFooBarResponse, func(resp *request.Response) bool {
|
framework.NewRequestExpect(f).Port(remotePort).Ensure(validateFooBarResponse, func(resp *request.Response) bool {
|
||||||
results = append(results, string(resp.Content))
|
results = append(results, string(resp.Content))
|
||||||
return true
|
return true
|
||||||
@@ -241,7 +239,7 @@ var _ = ginkgo.Describe("[Feature: Group]", func() {
|
|||||||
// close bar server, check foo is ok
|
// close bar server, check foo is ok
|
||||||
barServer.Close()
|
barServer.Close()
|
||||||
time.Sleep(2 * time.Second)
|
time.Sleep(2 * time.Second)
|
||||||
for i := 0; i < 10; i++ {
|
for range 10 {
|
||||||
framework.NewRequestExpect(f).Port(remotePort).ExpectResp([]byte("foo")).Ensure()
|
framework.NewRequestExpect(f).Port(remotePort).ExpectResp([]byte("foo")).Ensure()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -249,7 +247,7 @@ var _ = ginkgo.Describe("[Feature: Group]", func() {
|
|||||||
f.RunServer("", barServer)
|
f.RunServer("", barServer)
|
||||||
time.Sleep(2 * time.Second)
|
time.Sleep(2 * time.Second)
|
||||||
results = []string{}
|
results = []string{}
|
||||||
for i := 0; i < 10; i++ {
|
for range 10 {
|
||||||
framework.NewRequestExpect(f).Port(remotePort).Ensure(validateFooBarResponse, func(resp *request.Response) bool {
|
framework.NewRequestExpect(f).Port(remotePort).Ensure(validateFooBarResponse, func(resp *request.Response) bool {
|
||||||
results = append(results, string(resp.Content))
|
results = append(results, string(resp.Content))
|
||||||
return true
|
return true
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/onsi/ginkgo/v2"
|
"github.com/onsi/ginkgo/v2"
|
||||||
|
|
||||||
@@ -23,7 +24,8 @@ var _ = ginkgo.Describe("[Feature: Client-Plugins]", func() {
|
|||||||
ginkgo.Describe("UnixDomainSocket", func() {
|
ginkgo.Describe("UnixDomainSocket", func() {
|
||||||
ginkgo.It("Expose a unix domain socket echo server", func() {
|
ginkgo.It("Expose a unix domain socket echo server", func() {
|
||||||
serverConf := consts.DefaultServerConfig
|
serverConf := consts.DefaultServerConfig
|
||||||
clientConf := consts.DefaultClientConfig
|
var clientConf strings.Builder
|
||||||
|
clientConf.WriteString(consts.DefaultClientConfig)
|
||||||
|
|
||||||
getProxyConf := func(proxyName string, portName string, extra string) string {
|
getProxyConf := func(proxyName string, portName string, extra string) string {
|
||||||
return fmt.Sprintf(`
|
return fmt.Sprintf(`
|
||||||
@@ -69,10 +71,10 @@ var _ = ginkgo.Describe("[Feature: Client-Plugins]", func() {
|
|||||||
|
|
||||||
// build all client config
|
// build all client config
|
||||||
for _, test := range tests {
|
for _, test := range tests {
|
||||||
clientConf += getProxyConf(test.proxyName, test.portName, test.extraConfig) + "\n"
|
clientConf.WriteString(getProxyConf(test.proxyName, test.portName, test.extraConfig) + "\n")
|
||||||
}
|
}
|
||||||
// run frps and frpc
|
// run frps and frpc
|
||||||
f.RunProcesses([]string{serverConf}, []string{clientConf})
|
f.RunProcesses([]string{serverConf}, []string{clientConf.String()})
|
||||||
|
|
||||||
for _, test := range tests {
|
for _, test := range tests {
|
||||||
framework.NewRequestExpect(f).Port(f.PortByName(test.portName)).Ensure()
|
framework.NewRequestExpect(f).Port(f.PortByName(test.portName)).Ensure()
|
||||||
|
|||||||
Reference in New Issue
Block a user