| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 | 
							- package middleware
 
- import (
 
- 	"net/http"
 
- 	"sync"
 
- 	"github.com/gin-gonic/gin"
 
- 	"github.com/langgenius/dify-sandbox/internal/types"
 
- 	"github.com/langgenius/dify-sandbox/internal/utils/log"
 
- )
 
- func MaxWorker(max int) gin.HandlerFunc {
 
- 	log.Info("setting max workers to %d", max)
 
- 	sem := make(chan struct{}, max)
 
- 	return func(c *gin.Context) {
 
- 		sem <- struct{}{}
 
- 		defer func() {
 
- 			<-sem
 
- 		}()
 
- 		c.Next()
 
- 	}
 
- }
 
- type MaxRequestIface struct {
 
- 	current int
 
- 	lock    *sync.RWMutex
 
- }
 
- func MaxRequest(max int) gin.HandlerFunc {
 
- 	log.Info("setting max requests to %d", max)
 
- 	m := &MaxRequestIface{
 
- 		current: 0,
 
- 		lock:    &sync.RWMutex{},
 
- 	}
 
- 	return func(c *gin.Context) {
 
- 		m.lock.RLock()
 
- 		if m.current >= max {
 
- 			m.lock.RUnlock()
 
- 			c.JSON(http.StatusServiceUnavailable, types.ErrorResponse(-503, "Too many requests"))
 
- 			c.Abort()
 
- 			return
 
- 		}
 
- 		m.lock.RUnlock()
 
- 		m.lock.Lock()
 
- 		m.current++
 
- 		m.lock.Unlock()
 
- 		c.Next()
 
- 		m.lock.Lock()
 
- 		m.current--
 
- 		m.lock.Unlock()
 
- 	}
 
- }
 
 
  |