1 package org.eclipse.aether.util.repository;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.util.ArrayList;
23 import java.util.HashMap;
24 import java.util.List;
25 import java.util.Locale;
26 import java.util.Map;
27 import static java.util.Objects.requireNonNull;
28 import java.util.StringTokenizer;
29 import java.util.regex.Pattern;
30
31 import org.eclipse.aether.repository.Proxy;
32 import org.eclipse.aether.repository.ProxySelector;
33 import org.eclipse.aether.repository.RemoteRepository;
34
35
36
37
38 public final class DefaultProxySelector
39 implements ProxySelector
40 {
41
42 private final List<ProxyDef> proxies = new ArrayList<>();
43
44
45
46
47
48
49
50
51
52 public DefaultProxySelector add( Proxy proxy, String nonProxyHosts )
53 {
54 requireNonNull( proxy, "proxy cannot be null" );
55 proxies.add( new ProxyDef( proxy, nonProxyHosts ) );
56
57 return this;
58 }
59
60 public Proxy getProxy( RemoteRepository repository )
61 {
62 requireNonNull( repository, "repository cannot be null" );
63 Map<String, ProxyDef> candidates = new HashMap<>();
64
65 String host = repository.getHost();
66 for ( ProxyDef proxy : proxies )
67 {
68 if ( !proxy.nonProxyHosts.isNonProxyHost( host ) )
69 {
70 String key = proxy.proxy.getType().toLowerCase( Locale.ENGLISH );
71 if ( !candidates.containsKey( key ) )
72 {
73 candidates.put( key, proxy );
74 }
75 }
76 }
77
78 String protocol = repository.getProtocol().toLowerCase( Locale.ENGLISH );
79
80 if ( "davs".equals( protocol ) )
81 {
82 protocol = "https";
83 }
84 else if ( "dav".equals( protocol ) )
85 {
86 protocol = "http";
87 }
88 else if ( protocol.startsWith( "dav:" ) )
89 {
90 protocol = protocol.substring( "dav:".length() );
91 }
92
93 ProxyDef proxy = candidates.get( protocol );
94 if ( proxy == null && "https".equals( protocol ) )
95 {
96 proxy = candidates.get( "http" );
97 }
98
99 return ( proxy != null ) ? proxy.proxy : null;
100 }
101
102 static class NonProxyHosts
103 {
104
105 private final Pattern[] patterns;
106
107 NonProxyHosts( String nonProxyHosts )
108 {
109 List<Pattern> patterns = new ArrayList<>();
110 if ( nonProxyHosts != null )
111 {
112 for ( StringTokenizer tokenizer = new StringTokenizer( nonProxyHosts, "|" );
113 tokenizer.hasMoreTokens(); )
114 {
115 String pattern = tokenizer.nextToken();
116 pattern = pattern.replace( ".", "\\." ).replace( "*", ".*" );
117 patterns.add( Pattern.compile( pattern, Pattern.CASE_INSENSITIVE ) );
118 }
119 }
120 this.patterns = patterns.toArray( new Pattern[0] );
121 }
122
123 boolean isNonProxyHost( String host )
124 {
125 if ( host != null )
126 {
127 for ( Pattern pattern : patterns )
128 {
129 if ( pattern.matcher( host ).matches() )
130 {
131 return true;
132 }
133 }
134 }
135 return false;
136 }
137
138 }
139
140 static class ProxyDef
141 {
142
143 final Proxy proxy;
144
145 final NonProxyHosts nonProxyHosts;
146
147 ProxyDef( Proxy proxy, String nonProxyHosts )
148 {
149 this.proxy = proxy;
150 this.nonProxyHosts = new NonProxyHosts( nonProxyHosts );
151 }
152
153 }
154
155 }