mirror of
https://github.com/Sagit-chu/flvx.git
synced 2026-10-10 11:36:36 +08:00
修复ui 添加gost静默http服务
This commit is contained in:
@@ -38,6 +38,7 @@ func Register(r *gin.Engine, opts *Options) {
|
||||
AllowPrivateNetwork: true,
|
||||
})),
|
||||
gin.Recovery(),
|
||||
GlobalInterceptor(),
|
||||
)
|
||||
if opts.AccessLog {
|
||||
r.Use(mwLogger())
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user