Просмотр исходного кода

feat: Add max execution time parameter to endpoint handling (#88)

Modify endpoint-related functions to support configurable maximum execution time:
- Update EndpointHandler signature to include maxExecutionTime
- Pass max execution timeout from config to endpoint service
- Modify timeout mechanism to use configurable duration instead of hardcoded 240 seconds
Yeuoly месяцев назад: 4
Родитель
Сommit
8ab1e2a91e

+ 8 - 6
internal/server/endpoint.go

@@ -2,10 +2,12 @@ package server
 
 import (
 	"errors"
+	"time"
 
 	"github.com/gin-gonic/gin"
 	"github.com/langgenius/dify-plugin-daemon/internal/db"
 	"github.com/langgenius/dify-plugin-daemon/internal/service"
+	"github.com/langgenius/dify-plugin-daemon/internal/types/app"
 	"github.com/langgenius/dify-plugin-daemon/internal/types/exception"
 	"github.com/langgenius/dify-plugin-daemon/internal/types/models"
 	"github.com/langgenius/dify-plugin-daemon/internal/utils/log"
@@ -17,22 +19,22 @@ import (
 // - Yeuoly
 
 // EndpointHandler is a function type that can be used to handle endpoint requests
-type EndpointHandler func(ctx *gin.Context, hookId string, path string)
+type EndpointHandler func(ctx *gin.Context, hookId string, maxExecutionTime time.Duration, path string)
 
-func (app *App) Endpoint() func(c *gin.Context) {
+func (app *App) Endpoint(config *app.Config) func(c *gin.Context) {
 	return func(c *gin.Context) {
 		hookId := c.Param("hook_id")
 		path := c.Param("path")
 
 		if app.endpointHandler != nil {
-			app.endpointHandler(c, hookId, path)
+			app.endpointHandler(c, hookId, time.Duration(config.PluginMaxExecutionTimeout)*time.Second, path)
 		} else {
-			app.EndpointHandler(c, hookId, path)
+			app.EndpointHandler(c, hookId, time.Duration(config.PluginMaxExecutionTimeout)*time.Second, path)
 		}
 	}
 }
 
-func (app *App) EndpointHandler(ctx *gin.Context, hookId string, path string) {
+func (app *App) EndpointHandler(ctx *gin.Context, hookId string, maxExecutionTime time.Duration, path string) {
 	endpoint, err := db.GetOne[models.Endpoint](
 		db.Equal("hook_id", hookId),
 	)
@@ -71,6 +73,6 @@ func (app *App) EndpointHandler(ctx *gin.Context, hookId string, path string) {
 	if ok, originalError := app.cluster.IsPluginOnCurrentNode(pluginUniqueIdentifier); !ok {
 		app.redirectPluginInvokeByPluginIdentifier(ctx, pluginUniqueIdentifier, originalError)
 	} else {
-		service.Endpoint(ctx, &endpoint, &pluginInstallation, path)
+		service.Endpoint(ctx, &endpoint, &pluginInstallation, maxExecutionTime, path)
 	}
 }

+ 2 - 1
internal/server/endpoint_test.go

@@ -4,6 +4,7 @@ import (
 	"net/http"
 	"strconv"
 	"testing"
+	"time"
 
 	"github.com/gin-gonic/gin"
 	"github.com/langgenius/dify-plugin-daemon/internal/types/app"
@@ -21,7 +22,7 @@ func TestEndpointParams(t *testing.T) {
 	globalHookId := ""
 	globalHookPath := ""
 
-	handler := func(ctx *gin.Context, hook_id string, path string) {
+	handler := func(ctx *gin.Context, hook_id string, maxExecutionTime time.Duration, path string) {
 		globalHookId = hook_id
 		globalHookPath = path
 	}

+ 6 - 6
internal/server/http_server.go

@@ -104,12 +104,12 @@ func (app *App) remoteDebuggingGroup(group *gin.RouterGroup, config *app.Config)
 
 func (app *App) endpointGroup(group *gin.RouterGroup, config *app.Config) {
 	if config.PluginEndpointEnabled != nil && *config.PluginEndpointEnabled {
-		group.HEAD("/:hook_id/*path", app.Endpoint())
-		group.POST("/:hook_id/*path", app.Endpoint())
-		group.GET("/:hook_id/*path", app.Endpoint())
-		group.PUT("/:hook_id/*path", app.Endpoint())
-		group.DELETE("/:hook_id/*path", app.Endpoint())
-		group.OPTIONS("/:hook_id/*path", app.Endpoint())
+		group.HEAD("/:hook_id/*path", app.Endpoint(config))
+		group.POST("/:hook_id/*path", app.Endpoint(config))
+		group.GET("/:hook_id/*path", app.Endpoint(config))
+		group.PUT("/:hook_id/*path", app.Endpoint(config))
+		group.DELETE("/:hook_id/*path", app.Endpoint(config))
+		group.OPTIONS("/:hook_id/*path", app.Endpoint(config))
 	}
 }
 

+ 2 - 1
internal/service/endpoint.go

@@ -31,6 +31,7 @@ func Endpoint(
 	ctx *gin.Context,
 	endpoint *models.Endpoint,
 	pluginInstallation *models.PluginInstallation,
+	maxExecutionTime time.Duration,
 	path string,
 ) {
 	if !endpoint.Enabled {
@@ -195,7 +196,7 @@ func Endpoint(
 	select {
 	case <-ctx.Writer.CloseNotify():
 	case <-done:
-	case <-time.After(240 * time.Second):
+	case <-time.After(maxExecutionTime):
 		ctx.JSON(500, exception.InternalServerError(errors.New("killed by timeout")).ToResponse())
 	}
 }