mirror of
				https://github.com/TeaOSLab/EdgeNode.git
				synced 2025-11-04 07:40:56 +08:00 
			
		
		
		
	HTTP源站读取错误时自动尝试下一个源站
This commit is contained in:
		@@ -21,10 +21,28 @@ func (this *HTTPRequest) doReverseProxy() {
 | 
				
			|||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var retries = 3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var failedOriginIds []int64
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for i := 0; i < retries; i++ {
 | 
				
			||||||
 | 
							originId, shouldRetry := this.doOriginRequest(failedOriginIds, i == 0, i == retries-1)
 | 
				
			||||||
 | 
							if !shouldRetry {
 | 
				
			||||||
 | 
								break
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if originId > 0 {
 | 
				
			||||||
 | 
								failedOriginIds = append(failedOriginIds, originId)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 请求源站
 | 
				
			||||||
 | 
					func (this *HTTPRequest) doOriginRequest(failedOriginIds []int64, isFirstTry bool, isLastRetry bool) (originId 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
 | 
				
			||||||
	var requestURIHasVariables = this.reverseProxy.RequestURIHasVariables()
 | 
						var requestURIHasVariables = this.reverseProxy.RequestURIHasVariables()
 | 
				
			||||||
 | 
						var oldURI = this.uri
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var requestHost = ""
 | 
						var requestHost = ""
 | 
				
			||||||
	if this.reverseProxy.RequestHostType == serverconfigs.RequestHostTypeCustomized {
 | 
						if this.reverseProxy.RequestHostType == serverconfigs.RequestHostTypeCustomized {
 | 
				
			||||||
@@ -51,7 +69,12 @@ func (this *HTTPRequest) doReverseProxy() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	// 自定义源站
 | 
						// 自定义源站
 | 
				
			||||||
	if origin == nil {
 | 
						if origin == nil {
 | 
				
			||||||
		origin = this.reverseProxy.NextOrigin(requestCall)
 | 
							if !isFirstTry {
 | 
				
			||||||
 | 
								origin = this.reverseProxy.AnyOrigin(requestCall, failedOriginIds)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if origin == nil {
 | 
				
			||||||
 | 
								origin = this.reverseProxy.NextOrigin(requestCall)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		requestCall.CallResponseCallbacks(this.writer)
 | 
							requestCall.CallResponseCallbacks(this.writer)
 | 
				
			||||||
		if origin == nil {
 | 
							if origin == nil {
 | 
				
			||||||
			err := errors.New(this.URL() + ": no available origin sites for reverse proxy")
 | 
								err := errors.New(this.URL() + ": no available origin sites for reverse proxy")
 | 
				
			||||||
@@ -59,6 +82,7 @@ func (this *HTTPRequest) doReverseProxy() {
 | 
				
			|||||||
			this.write50x(err, http.StatusBadGateway, "No origin site yet", "尚未配置源站", true)
 | 
								this.write50x(err, http.StatusBadGateway, "No origin site yet", "尚未配置源站", true)
 | 
				
			||||||
			return
 | 
								return
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							originId = origin.Id
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if len(origin.StripPrefix) > 0 {
 | 
							if len(origin.StripPrefix) > 0 {
 | 
				
			||||||
			stripPrefix = origin.StripPrefix
 | 
								stripPrefix = origin.StripPrefix
 | 
				
			||||||
@@ -236,6 +260,23 @@ func (this *HTTPRequest) doReverseProxy() {
 | 
				
			|||||||
			SharedOriginStateManager.Fail(origin, requestHost, this.reverseProxy, func() {
 | 
								SharedOriginStateManager.Fail(origin, requestHost, this.reverseProxy, func() {
 | 
				
			||||||
				this.reverseProxy.ResetScheduling()
 | 
									this.reverseProxy.ResetScheduling()
 | 
				
			||||||
			})
 | 
								})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// 是否需要重试
 | 
				
			||||||
 | 
								if originId > 0 && !isLastRetry {
 | 
				
			||||||
 | 
									shouldRetry = true
 | 
				
			||||||
 | 
									this.uri = oldURI // 恢复备份
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									if resp != nil && resp.Body != nil {
 | 
				
			||||||
 | 
										_ = resp.Body.Close()
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									if httpErr.Err != io.EOF {
 | 
				
			||||||
 | 
										remotelogs.Warn("HTTP_REQUEST_REVERSE_PROXY", this.URL()+": Request origin server failed: "+err.Error())
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									return
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if httpErr.Timeout() {
 | 
								if httpErr.Timeout() {
 | 
				
			||||||
				this.write50x(err, http.StatusGatewayTimeout, "Read origin site timeout", "源站读取超时", true)
 | 
									this.write50x(err, http.StatusGatewayTimeout, "Read origin site timeout", "源站读取超时", true)
 | 
				
			||||||
			} else if httpErr.Temporary() {
 | 
								} else if httpErr.Temporary() {
 | 
				
			||||||
@@ -410,4 +451,6 @@ func (this *HTTPRequest) doReverseProxy() {
 | 
				
			|||||||
	if (err == nil || err == io.EOF) && (closeErr == nil || closeErr == io.EOF) {
 | 
						if (err == nil || err == io.EOF) && (closeErr == nil || closeErr == io.EOF) {
 | 
				
			||||||
		this.writer.SetOk()
 | 
							this.writer.SetOk()
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user