源站支持404内容自动重试其他源站

This commit is contained in:
GoEdgeLab
2023-11-15 19:06:15 +08:00
parent a01b268ac8
commit 92045abeca

View File

@@ -27,9 +27,10 @@ func (this *HTTPRequest) doReverseProxy() {
var failedOriginIds []int64 var failedOriginIds []int64
var failedLnNodeIds []int64 var failedLnNodeIds []int64
var failStatusCode int
for i := 0; i < retries; i++ { for i := 0; i < retries; i++ {
originId, lnNodeId, shouldRetry := this.doOriginRequest(failedOriginIds, failedLnNodeIds, i == 0, i == retries-1) originId, lnNodeId, shouldRetry := this.doOriginRequest(failedOriginIds, failedLnNodeIds, i == 0, i == retries-1, &failStatusCode)
if !shouldRetry { if !shouldRetry {
break break
} }
@@ -43,7 +44,7 @@ func (this *HTTPRequest) doReverseProxy() {
} }
// 请求源站 // 请求源站
func (this *HTTPRequest) doOriginRequest(failedOriginIds []int64, failedLnNodeIds []int64, isFirstTry bool, isLastRetry bool) (originId int64, lnNodeId int64, shouldRetry bool) { func (this *HTTPRequest) doOriginRequest(failedOriginIds []int64, failedLnNodeIds []int64, isFirstTry bool, isLastRetry bool, failStatusCode *int) (originId int64, lnNodeId int64, shouldRetry bool) {
// 对URL的处理 // 对URL的处理
var stripPrefix = this.reverseProxy.StripPrefix var stripPrefix = this.reverseProxy.StripPrefix
var requestURI = this.reverseProxy.RequestURI var requestURI = this.reverseProxy.RequestURI
@@ -91,6 +92,10 @@ func (this *HTTPRequest) doOriginRequest(failedOriginIds []int64, failedLnNodeId
} }
if origin == nil { if origin == nil {
origin = this.reverseProxy.NextOrigin(requestCall) origin = this.reverseProxy.NextOrigin(requestCall)
if origin != nil && origin.Id > 0 && (*failStatusCode >= 403 && *failStatusCode <= 404) && lists.ContainsInt64(failedOriginIds, origin.Id) {
this.writeCode(*failStatusCode, "", "")
return
}
} }
requestCall.CallResponseCallbacks(this.writer) requestCall.CallResponseCallbacks(this.writer)
if origin == nil { if origin == nil {
@@ -376,11 +381,11 @@ func (this *HTTPRequest) doOriginRequest(failedOriginIds []int64, failedLnNodeId
return return
} }
// 50x // 40x && 50x
*failStatusCode = resp.StatusCode
if resp != nil && if resp != nil &&
resp.StatusCode >= 500 && ((resp.StatusCode >= 500 && resp.StatusCode < 510 && this.reverseProxy.Retry50X) ||
resp.StatusCode < 510 && (resp.StatusCode >= 403 && resp.StatusCode <= 404 && this.reverseProxy.Retry40X)) &&
this.reverseProxy.Retry50X &&
(originId > 0 || (lnNodeId > 0 && hasMultipleLnNodes)) && (originId > 0 || (lnNodeId > 0 && hasMultipleLnNodes)) &&
!isLastRetry { !isLastRetry {
if resp.Body != nil { if resp.Body != nil {