mirror of
https://github.com/Buriburizaem0n/nezha_domains.git
synced 2026-09-19 17:50:12 +00:00
52 lines
1.7 KiB
Go
52 lines
1.7 KiB
Go
//go:build agentcompat
|
|
|
|
package controller
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
type agentcompatMCPRateLimitProbeRequest struct {
|
|
}
|
|
|
|
type agentcompatMCPRateLimitProbeResponse struct {
|
|
SecondAllowedCount int `json:"second_allowed_count"`
|
|
SecondRejectedAtCount int `json:"second_rejected_at_count"`
|
|
MinuteAllowedCount int `json:"minute_allowed_count"`
|
|
MinuteRejectedAtCount int `json:"minute_rejected_at_count"`
|
|
}
|
|
|
|
func agentcompatMCPRateLimitProbeRoute(context *gin.Context) (agentcompatMCPRateLimitProbeResponse, error) {
|
|
var request agentcompatMCPRateLimitProbeRequest
|
|
if err := decodeAgentcompatJSON(context, &request); err != nil {
|
|
return agentcompatMCPRateLimitProbeResponse{}, err
|
|
}
|
|
return runAgentcompatMCPRateLimitProbe(request)
|
|
}
|
|
|
|
func runAgentcompatMCPRateLimitProbe(request agentcompatMCPRateLimitProbeRequest) (agentcompatMCPRateLimitProbeResponse, error) {
|
|
response := agentcompatMCPRateLimitProbeResponse{}
|
|
secondNow := time.Unix(1_700_000_000, 0)
|
|
secondLimiter := newMCPRateLimiterWithClock(10, 120, func() time.Time { return secondNow })
|
|
for requestNumber := 1; requestNumber <= 11; requestNumber++ {
|
|
if secondLimiter.Allow(1) {
|
|
response.SecondAllowedCount++
|
|
} else if response.SecondRejectedAtCount == 0 {
|
|
response.SecondRejectedAtCount = requestNumber
|
|
}
|
|
}
|
|
minuteNow := time.Unix(1_700_000_000, 0)
|
|
minuteLimiter := newMCPRateLimiterWithClock(10_000, 120, func() time.Time { return minuteNow })
|
|
for requestNumber := 1; requestNumber <= 121; requestNumber++ {
|
|
if minuteLimiter.Allow(1) {
|
|
response.MinuteAllowedCount++
|
|
} else if response.MinuteRejectedAtCount == 0 {
|
|
response.MinuteRejectedAtCount = requestNumber
|
|
}
|
|
minuteNow = minuteNow.Add(100 * time.Millisecond)
|
|
}
|
|
return response, nil
|
|
}
|