mirror of
https://github.com/miniflux/v2.git
synced 2025-06-27 16:36:00 +00:00
60 lines
1.4 KiB
Go
60 lines
1.4 KiB
Go
// SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved.
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
package proxyrotator // import "miniflux.app/v2/internal/proxyrotator"
|
|
|
|
import (
|
|
"net/url"
|
|
"sync"
|
|
)
|
|
|
|
var ProxyRotatorInstance *ProxyRotator
|
|
|
|
// ProxyRotator manages a list of proxies and rotates through them.
|
|
type ProxyRotator struct {
|
|
proxies []*url.URL
|
|
currentIndex int
|
|
mutex sync.Mutex
|
|
}
|
|
|
|
// NewProxyRotator creates a new ProxyRotator with the given proxy URLs.
|
|
func NewProxyRotator(proxyURLs []string) (*ProxyRotator, error) {
|
|
parsedProxies := make([]*url.URL, 0, len(proxyURLs))
|
|
|
|
for _, p := range proxyURLs {
|
|
proxyURL, err := url.Parse(p)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
parsedProxies = append(parsedProxies, proxyURL)
|
|
}
|
|
|
|
return &ProxyRotator{
|
|
proxies: parsedProxies,
|
|
currentIndex: 0,
|
|
mutex: sync.Mutex{},
|
|
}, nil
|
|
}
|
|
|
|
// GetNextProxy returns the next proxy in the rotation.
|
|
func (pr *ProxyRotator) GetNextProxy() *url.URL {
|
|
pr.mutex.Lock()
|
|
defer pr.mutex.Unlock()
|
|
|
|
if len(pr.proxies) == 0 {
|
|
return nil
|
|
}
|
|
|
|
proxy := pr.proxies[pr.currentIndex]
|
|
pr.currentIndex = (pr.currentIndex + 1) % len(pr.proxies)
|
|
|
|
return proxy
|
|
}
|
|
|
|
// HasProxies checks if there are any proxies available in the rotator.
|
|
func (pr *ProxyRotator) HasProxies() bool {
|
|
pr.mutex.Lock()
|
|
defer pr.mutex.Unlock()
|
|
|
|
return len(pr.proxies) > 0
|
|
}
|