mirror of
https://github.com/go-gitea/gitea.git
synced 2026-07-13 13:16:19 +00:00
65c5a5ff7b
Fixes #38217 ## Problem Turnstile CAPTCHA verification uses `http.DefaultClient`, so the request to `challenges.cloudflare.com` bypasses Gitea's configured HTTP proxy — unlike other outbound HTTP clients such as the update checker (`modules/updatechecker/update_checker.go`) and migrations. In deployments where egress is only permitted through the configured proxy, verification fails. ## Fix Build the client with `proxy.Proxy()` as the transport proxy, mirroring the update checker: ```go func httpClient() *http.Client { return &http.Client{ Transport: &http.Transport{ Proxy: proxy.Proxy(), }, } } ``` The client is built per call (rather than a package-level var) because `proxy.Proxy()` reads `setting.Proxy` when invoked; building it at request time ensures it reflects the loaded settings. When no proxy is configured, behavior is unchanged (`proxy.Proxy()` returns a no-op / `http.ProxyFromEnvironment`). --------- Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
52 lines
868 B
Go
52 lines
868 B
Go
// Copyright 2026 The Gitea Authors. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package util
|
|
|
|
import (
|
|
"sync"
|
|
"sync/atomic"
|
|
)
|
|
|
|
type onceValueResult[T any] struct {
|
|
value T
|
|
panic any
|
|
}
|
|
|
|
// OnceValue is similar to Golang's "sync.OnceValue", but can be reset.
|
|
type OnceValue[T any] struct {
|
|
Func func() T
|
|
mu sync.Mutex
|
|
res atomic.Pointer[onceValueResult[T]]
|
|
}
|
|
|
|
func (o *OnceValue[T]) Value() T {
|
|
res := o.res.Load()
|
|
if res == nil {
|
|
o.mu.Lock()
|
|
defer o.mu.Unlock()
|
|
res = o.res.Load()
|
|
if res == nil {
|
|
res = &onceValueResult[T]{}
|
|
defer func() {
|
|
res.panic = recover()
|
|
o.res.Store(res)
|
|
if res.panic != nil {
|
|
panic(res.panic)
|
|
}
|
|
}()
|
|
res.value = o.Func()
|
|
}
|
|
}
|
|
if res.panic != nil {
|
|
panic(res.panic)
|
|
}
|
|
return res.value
|
|
}
|
|
|
|
func (o *OnceValue[T]) Reset() {
|
|
o.mu.Lock()
|
|
defer o.mu.Unlock()
|
|
o.res.Store(nil)
|
|
}
|