Files
upstream-centrifugo/internal/proxy/test_grpc_server.go
upstream-mirror b352a9a30d
Some checks failed
test / Lint (push) Failing after 3s
test / Test with Go 1.26.8 (push) Failing after 2s
snapshot of https://github.com/centrifugal/centrifugo.git (master, 2026-09-16; blobs > 131072B omitted)
2026-09-16 01:17:21 +05:00

202 lines
5.0 KiB
Go

package proxy
import (
"context"
"github.com/centrifugal/centrifugo/v6/internal/proxyproto"
)
type proxyGRPCTestServer struct {
flag string
opts proxyGRPCTestServerOptions
proxyproto.UnimplementedCentrifugoProxyServer
}
type proxyGRPCTestServerOptions struct {
User string
ExpireAt int64
B64Data string
Channels []string
Data []byte
}
func newProxyGRPCTestServer(flag string, opts proxyGRPCTestServerOptions) proxyGRPCTestServer {
return proxyGRPCTestServer{
flag: flag,
opts: opts,
}
}
func (p proxyGRPCTestServer) Connect(_ context.Context, _ *proxyproto.ConnectRequest) (*proxyproto.ConnectResponse, error) {
switch p.flag {
case "result":
return &proxyproto.ConnectResponse{
Result: &proxyproto.ConnectResult{
User: p.opts.User,
ExpireAt: p.opts.ExpireAt,
B64Data: p.opts.B64Data,
},
}, nil
case "subscription":
return &proxyproto.ConnectResponse{
Result: &proxyproto.ConnectResult{
User: p.opts.User,
Channels: p.opts.Channels,
},
}, nil
case "subscription error":
return &proxyproto.ConnectResponse{
Result: &proxyproto.ConnectResult{
User: p.opts.User,
Channels: p.opts.Channels,
},
}, nil
case "subscription with recover":
subs := make(map[string]*proxyproto.SubscribeOptions, len(p.opts.Channels))
for _, ch := range p.opts.Channels {
subs[ch] = &proxyproto.SubscribeOptions{CacheRecover: true}
}
return &proxyproto.ConnectResponse{
Result: &proxyproto.ConnectResult{
User: p.opts.User,
Subs: subs,
},
}, nil
case "custom disconnect":
return &proxyproto.ConnectResponse{
Disconnect: p.newDisconnect(),
}, nil
case "custom error":
return &proxyproto.ConnectResponse{
Error: p.newCustomError(),
}, nil
default:
return &proxyproto.ConnectResponse{}, nil
}
}
func (p proxyGRPCTestServer) Refresh(_ context.Context, _ *proxyproto.RefreshRequest) (*proxyproto.RefreshResponse, error) {
switch p.flag {
case "with credentials":
return &proxyproto.RefreshResponse{
Result: &proxyproto.RefreshResult{
B64Info: p.opts.B64Data,
ExpireAt: p.opts.ExpireAt,
},
}, nil
case "expired":
return &proxyproto.RefreshResponse{
Result: &proxyproto.RefreshResult{
Expired: true,
},
}, nil
default:
return &proxyproto.RefreshResponse{}, nil
}
}
func (p proxyGRPCTestServer) Subscribe(_ context.Context, _ *proxyproto.SubscribeRequest) (*proxyproto.SubscribeResponse, error) {
switch p.flag {
case "result":
return &proxyproto.SubscribeResponse{
Result: &proxyproto.SubscribeResult{
B64Info: p.opts.B64Data,
B64Data: p.opts.B64Data,
},
}, nil
case "override":
return &proxyproto.SubscribeResponse{
Result: &proxyproto.SubscribeResult{
B64Info: p.opts.B64Data,
Override: &proxyproto.SubscribeOptionOverride{
Presence: &proxyproto.BoolValue{Value: true},
JoinLeave: &proxyproto.BoolValue{Value: false},
ForcePushJoinLeave: &proxyproto.BoolValue{Value: false},
ForcePositioning: &proxyproto.BoolValue{Value: true},
ForceRecovery: &proxyproto.BoolValue{Value: true},
},
},
}, nil
case "custom disconnect":
return &proxyproto.SubscribeResponse{
Disconnect: p.newDisconnect(),
}, nil
case "custom error":
return &proxyproto.SubscribeResponse{
Error: p.newCustomError(),
}, nil
default:
return &proxyproto.SubscribeResponse{}, nil
}
}
func (p proxyGRPCTestServer) Publish(_ context.Context, _ *proxyproto.PublishRequest) (*proxyproto.PublishResponse, error) {
switch p.flag {
case "result":
return &proxyproto.PublishResponse{
Result: &proxyproto.PublishResult{
B64Data: p.opts.B64Data,
},
}, nil
case "skip history":
return &proxyproto.PublishResponse{
Result: &proxyproto.PublishResult{
B64Data: p.opts.B64Data,
SkipHistory: true,
},
}, nil
case "custom disconnect":
return &proxyproto.PublishResponse{
Disconnect: p.newDisconnect(),
}, nil
case "custom error":
return &proxyproto.PublishResponse{
Error: p.newCustomError(),
}, nil
default:
return &proxyproto.PublishResponse{}, nil
}
}
func (p proxyGRPCTestServer) RPC(_ context.Context, _ *proxyproto.RPCRequest) (*proxyproto.RPCResponse, error) {
switch p.flag {
case "result":
return &proxyproto.RPCResponse{
Result: &proxyproto.RPCResult{
Data: p.opts.Data,
},
}, nil
case "custom disconnect":
return &proxyproto.RPCResponse{
Disconnect: p.newDisconnect(),
}, nil
case "custom error":
return &proxyproto.RPCResponse{
Error: p.newCustomError(),
}, nil
case "custom data":
return &proxyproto.RPCResponse{
Result: &proxyproto.RPCResult{
B64Data: p.opts.B64Data,
},
}, nil
default:
return &proxyproto.RPCResponse{}, nil
}
}
func (p proxyGRPCTestServer) newDisconnect() *proxyproto.Disconnect {
return &proxyproto.Disconnect{
Code: 4000,
Reason: "custom disconnect",
}
}
func (p proxyGRPCTestServer) newCustomError() *proxyproto.Error {
return &proxyproto.Error{
Code: 1000,
Message: "custom error",
}
}