mirror of
				https://github.com/cloudreve/cloudreve.git
				synced 2025-11-04 13:16:02 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			38 lines
		
	
	
		
			874 B
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			38 lines
		
	
	
		
			874 B
		
	
	
	
		
			Go
		
	
	
	
	
	
package driver
 | 
						|
 | 
						|
import (
 | 
						|
	"fmt"
 | 
						|
	"github.com/cloudreve/Cloudreve/v4/ent"
 | 
						|
	"net/url"
 | 
						|
	"path"
 | 
						|
	"strings"
 | 
						|
)
 | 
						|
 | 
						|
func ApplyProxyIfNeeded(policy *ent.StoragePolicy, srcUrl *url.URL) (*url.URL, error) {
 | 
						|
	// For custom proxy, generate a new proxyed URL:
 | 
						|
	// [Proxy Scheme][Proxy Host][Proxy Port][ProxyPath + OriginSrcPath][OriginSrcQuery + ProxyQuery]
 | 
						|
	if policy.Settings.CustomProxy {
 | 
						|
		proxy, err := url.Parse(policy.Settings.ProxyServer)
 | 
						|
		if err != nil {
 | 
						|
			return nil, fmt.Errorf("failed to parse proxy URL: %w", err)
 | 
						|
		}
 | 
						|
		proxy.Path = path.Join(proxy.Path, strings.TrimPrefix(srcUrl.Path, "/"))
 | 
						|
		q := proxy.Query()
 | 
						|
		if len(q) == 0 {
 | 
						|
			proxy.RawQuery = srcUrl.RawQuery
 | 
						|
		} else {
 | 
						|
			// Merge query parameters
 | 
						|
			srcQ := srcUrl.Query()
 | 
						|
			for k, _ := range srcQ {
 | 
						|
				q.Set(k, srcQ.Get(k))
 | 
						|
			}
 | 
						|
 | 
						|
			proxy.RawQuery = q.Encode()
 | 
						|
		}
 | 
						|
 | 
						|
		srcUrl = proxy
 | 
						|
	}
 | 
						|
 | 
						|
	return srcUrl, nil
 | 
						|
}
 |