mirror of
https://github.com/eolinker/apinto
synced 2025-12-24 13:28:15 +08:00
1. 修复ai chat时,504状态码返回400的问题
2. 修复自定义变量重启加载失败导致所有配置无法加载的问题
This commit is contained in:
@@ -161,15 +161,20 @@ func (e *executor) DoHttpFilter(ctx http_context.IHttpContext, next eocontext.IC
|
||||
if len(balances) == 0 {
|
||||
body := ctx.Response().GetBody()
|
||||
if len(body) == 0 {
|
||||
ctx.Response().SetBody([]byte(err.Error()))
|
||||
ctx.Response().SetStatus(400, "Bad Request")
|
||||
if ctx.Response().StatusCode() != 504 {
|
||||
ctx.Response().SetBody([]byte(err.Error()))
|
||||
ctx.Response().SetStatus(400, "Bad Request")
|
||||
}
|
||||
|
||||
}
|
||||
return err
|
||||
}
|
||||
err = e.doBalance(ctx, cloneProxy, next) // Fallback to balance logic
|
||||
if err != nil {
|
||||
ctx.Response().SetBody([]byte(err.Error()))
|
||||
ctx.Response().SetStatus(400, "Bad Request")
|
||||
if ctx.Response().StatusCode() != 504 {
|
||||
ctx.Response().SetBody([]byte(err.Error()))
|
||||
ctx.Response().SetStatus(400, "Bad Request")
|
||||
}
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
2
go.mod
2
go.mod
@@ -11,7 +11,7 @@ require (
|
||||
github.com/clbanning/mxj v1.8.4
|
||||
github.com/coocood/freecache v1.2.2
|
||||
github.com/dubbogo/gost v1.13.1
|
||||
github.com/eolinker/eosc v0.21.1
|
||||
github.com/eolinker/eosc v0.21.2
|
||||
github.com/fasthttp/websocket v1.5.0
|
||||
github.com/fullstorydev/grpcurl v1.8.7
|
||||
github.com/go-redis/redis/v8 v8.11.5
|
||||
|
||||
@@ -183,6 +183,7 @@ func (ctx *HttpContext) SendTo(scheme string, node eoscContext.INode, timeout ti
|
||||
|
||||
host := node.Addr()
|
||||
request := ctx.proxyRequest.Request()
|
||||
request.CloseBodyStream()
|
||||
rewriteHost := string(request.Host())
|
||||
upstreamHost := ctx.GetUpstreamHostHandler()
|
||||
if upstreamHost != nil {
|
||||
@@ -205,6 +206,7 @@ func (ctx *HttpContext) SendTo(scheme string, node eoscContext.INode, timeout ti
|
||||
|
||||
beginTime := time.Now()
|
||||
response := fasthttp.AcquireResponse()
|
||||
//var client *fasthttp.HostClient
|
||||
ctx.response.responseError = fasthttp_client.ProxyTimeout(scheme, rewriteHost, node, request, response, timeout)
|
||||
|
||||
agent := newRequestAgent(&ctx.proxyRequest, host, scheme, response.Header, beginTime, time.Now())
|
||||
@@ -230,33 +232,18 @@ func (ctx *HttpContext) SendTo(scheme string, node eoscContext.INode, timeout ti
|
||||
// 流式传输,非200状态码不考虑流式传输
|
||||
ctx.response.Response.SetStatusCode(response.StatusCode())
|
||||
ctx.SetLabel("stream_running", "true")
|
||||
|
||||
ctx.response.Response.SetBodyStreamWriter(func(w *bufio.Writer) {
|
||||
reader := response.BodyStream()
|
||||
defer func() {
|
||||
response.SetConnectionClose()
|
||||
ctx.SetLabel("stream_running", "false")
|
||||
ctx.FastFinish()
|
||||
fasthttp.ReleaseResponse(response)
|
||||
}()
|
||||
reader := response.BodyStream()
|
||||
|
||||
buffer := make([]byte, 4096) // 4KB 缓冲区
|
||||
for {
|
||||
n, err := reader.Read(buffer)
|
||||
if n > 0 {
|
||||
chunk := buffer[:n]
|
||||
chunk, err = ctx.proxyRequest.StreamBodyHandles(ctx, chunk)
|
||||
if err != nil {
|
||||
log.Errorf("exec stream func error: %v", err)
|
||||
}
|
||||
|
||||
n, err = w.Write(chunk)
|
||||
if err != nil {
|
||||
log.Errorf("stream write error: %v", err)
|
||||
break
|
||||
}
|
||||
ctx.Response().SetBody(chunk)
|
||||
|
||||
w.Flush() // 实时发送数据
|
||||
}
|
||||
if err != nil {
|
||||
if err == io.EOF {
|
||||
break
|
||||
@@ -264,6 +251,27 @@ func (ctx *HttpContext) SendTo(scheme string, node eoscContext.INode, timeout ti
|
||||
log.Errorf("stream read error: %v", err)
|
||||
break
|
||||
}
|
||||
chunk := buffer[:n]
|
||||
chunk, err = ctx.proxyRequest.StreamBodyHandles(ctx, chunk)
|
||||
if err != nil {
|
||||
log.Errorf("exec stream func error: %v", err)
|
||||
}
|
||||
|
||||
n, err = w.Write(chunk)
|
||||
if err != nil {
|
||||
log.Errorf("stream write error: %v", err)
|
||||
response.SetConnectionClose()
|
||||
break
|
||||
}
|
||||
ctx.Response().SetBody(chunk)
|
||||
|
||||
err = w.Flush() // 实时发送数据
|
||||
if err != nil {
|
||||
// 停止读取上游数据
|
||||
log.Errorf("stream flush error: %v", err)
|
||||
response.SetConnectionClose()
|
||||
break
|
||||
}
|
||||
}
|
||||
ctx.proxyRequest.ProxyBodyFinish(ctx)
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user