mirror of
https://github.com/miniflux/v2.git
synced 2025-08-26 18:21:01 +00:00
feat: add proxy rotation functionality
This commit is contained in:
parent
d20e8a4e2c
commit
535fd050b7
22 changed files with 351 additions and 56 deletions
60
internal/proxyrotator/proxyrotator.go
Normal file
60
internal/proxyrotator/proxyrotator.go
Normal file
|
@ -0,0 +1,60 @@
|
|||
// 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
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue