"io"
"io/fs"
"math"
- "net"
"net/http"
"net/http/pprof"
"sort"
limit "github.com/qydysky/part/limit"
msgq "github.com/qydysky/part/msgq"
psync "github.com/qydysky/part/sync"
+ pweb "github.com/qydysky/part/web"
websocket "github.com/qydysky/part/websocket"
encoder "golang.org/x/text/encoding"
}
// 直播流回放连接限制
- type limitItem struct {
- cidr *net.IPNet
- available int
- }
- var (
- limitCon []limitItem
- limitL psync.RWMutex
- )
+ var climit pweb.CountLimits
if limits, ok := c.C.K_v.LoadV(`直播流回放连接限制`).([]any); ok {
for i := 0; i < len(limits); i++ {
if vm, ok := limits[i].(map[string]any); ok {
} else if max, ok := vm["max"].(float64); !ok {
continue
} else {
- if _, cidrx, err := net.ParseCIDR(cidr); err != nil {
- flog.L(`E: `, err)
- } else {
- limitCon = append(limitCon, limitItem{cidr: cidrx, available: int(max)})
- }
+ climit.SetMaxCount(cidr, int(max))
}
}
}
// 直播流播放器
c.C.SerF.Store(path+"player/", func(w http.ResponseWriter, r *http.Request) {
// 直播流回放连接限制
- if len(limitCon) != 0 {
- ip := net.ParseIP(strings.Split(r.RemoteAddr, ":")[0])
- var isOverflow bool
- ul := limitL.RLock()
- for i := 0; i < len(limitCon); i++ {
- if !limitCon[i].cidr.Contains(ip) {
- continue
- }
- if limitCon[i].available == 0 {
- isOverflow = true
- break
- }
- }
- ul()
- if isOverflow {
- w.WriteHeader(http.StatusTooManyRequests)
- _, _ = w.Write([]byte("已达到设定最大连接数"))
- return
- }
+ if climit.ReachMax(r) {
+ w.WriteHeader(http.StatusTooManyRequests)
+ _, _ = w.Write([]byte("已达到设定最大连接数"))
+ return
}
p := strings.TrimPrefix(r.URL.Path, path+"player/")
// 流地址
c.C.SerF.Store(path+"stream", func(w http.ResponseWriter, r *http.Request) {
// 直播流回放连接限制
- if len(limitCon) != 0 {
- ip := net.ParseIP(strings.Split(r.RemoteAddr, ":")[0])
- var add []int
- ul := limitL.Lock()
- for i := 0; i < len(limitCon); i++ {
- if !limitCon[i].cidr.Contains(ip) {
- continue
- }
- if limitCon[i].available != 0 {
- add = append(add, i)
- }
- }
- if len(add) == 0 {
- ul()
- w.WriteHeader(http.StatusTooManyRequests)
- return
- } else {
- for i := 0; i < len(add); i++ {
- limitCon[add[i]].available -= 1
- }
- ul()
- // 连接退出
- go func() {
- <-r.Context().Done()
- ul := limitL.Lock()
- for i := 0; i < len(add); i++ {
- limitCon[add[i]].available += 1
- }
- ul()
- }()
- }
+ if climit.AddCount(r) {
+ w.WriteHeader(http.StatusTooManyRequests)
+ return
}
//header
github.com/miekg/dns v1.1.54 h1:5jon9mWcb0sFJGpnI99tOMhCPyJ+RPVz5b63MQG0VWI=
github.com/miekg/dns v1.1.54/go.mod h1:uInx36IzPl7FYnDcMeVWxj9byh7DutNykX4G9Sj60FY=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
-github.com/qydysky/part v0.27.9 h1:1VQHeayiAie8xSjVp4ILzfHtzK1QjgDSvcWH7ddUXvc=
-github.com/qydysky/part v0.27.9/go.mod h1:IEMpGB0NBl6MklZmoenSpS5ChhaIL79JYFo6mF1UkAU=
+github.com/qydysky/part v0.27.12 h1:IGVfRuiYYhfaIwlTYZL4QqFNJw7uF0l6uQcaI4Ajnso=
+github.com/qydysky/part v0.27.12/go.mod h1:IEMpGB0NBl6MklZmoenSpS5ChhaIL79JYFo6mF1UkAU=
github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE=
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=