修复ui 添加gost静默http服务

This commit is contained in:
qaq
2025-06-20 11:14:28 +08:00
parent f6a777da43
commit 52d9d18371
23 changed files with 815 additions and 237 deletions
+1
View File
@@ -38,6 +38,7 @@ func Register(r *gin.Engine, opts *Options) {
AllowPrivateNetwork: true,
})),
gin.Recovery(),
GlobalInterceptor(),
)
if opts.AccessLog {
r.Use(mwLogger())
+46
View File
@@ -2,6 +2,7 @@ package api
import (
"net/http"
"strings"
"time"
"github.com/gin-gonic/gin"
@@ -45,3 +46,48 @@ func mwBasicAuth(auther auth.Authenticator) gin.HandlerFunc {
}
}
}
// GlobalInterceptor 全局HTTP请求拦截器
func GlobalInterceptor() gin.HandlerFunc {
return func(c *gin.Context) {
// 检查认证参数,如果没有认证就静默关闭
if !hasValidAuth(c) {
// 获取底层连接并直接关闭
if hijacker, ok := c.Writer.(http.Hijacker); ok {
if conn, _, err := hijacker.Hijack(); err == nil {
conn.Close() // 直接关闭连接,不发送任何数据
return
}
}
// 如果无法hijack连接,则中止请求但不返回响应
c.Abort()
return
}
c.Next()
}
}
// hasValidAuth 检查请求是否包含有效的认证信息
func hasValidAuth(c *gin.Context) bool {
// 获取Authorization头
authHeader := c.GetHeader("Authorization")
if authHeader == "" {
return false
}
// 检查是否是Basic认证
if !strings.HasPrefix(authHeader, "Basic ") {
return false
}
// 解析Basic认证
_, _, ok := c.Request.BasicAuth()
if !ok {
return false
}
return true
}
+43 -1
View File
@@ -68,7 +68,7 @@ func (l *tlsListener) Init(md md.Metadata) (err error) {
ln = limiter_wrapper.WrapListener(l.options.Service, ln, l.options.TrafficLimiter)
ln = climiter.WrapListener(l.options.ConnLimiter, ln)
l.ln = tls.NewListener(ln, l.options.TLSConfig)
l.ln = newSilentTLSListener(ln, l.options.TLSConfig, l.logger)
return
}
@@ -99,3 +99,45 @@ func (l *tlsListener) Addr() net.Addr {
func (l *tlsListener) Close() error {
return l.ln.Close()
}
// silentTLSListener 是一个自定义的TLS监听器,对非TLS连接静默处理
type silentTLSListener struct {
net.Listener
config *tls.Config
logger logger.Logger
}
func newSilentTLSListener(inner net.Listener, config *tls.Config, logger logger.Logger) net.Listener {
return &silentTLSListener{
Listener: inner,
config: config,
logger: logger,
}
}
func (l *silentTLSListener) Accept() (net.Conn, error) {
for {
conn, err := l.Listener.Accept()
if err != nil {
return nil, err
}
// 创建TLS连接
tlsConn := tls.Server(conn, l.config)
// 设置握手超时
tlsConn.SetDeadline(time.Now().Add(10 * time.Second))
// 尝试TLS握手
if err := tlsConn.Handshake(); err != nil {
conn.Close()
continue // 继续接受下一个连接
}
// 清除超时设置
tlsConn.SetDeadline(time.Time{})
return tlsConn, nil
}
}