Skip to content

Commit f2f695b

Browse files
authored
Merge pull request #50834 from Ladicek/redis-client-proxy-registry
Proxy Registry: refactoring, Redis Client: add support for Proxy Registry
2 parents 835d012 + 29a907f commit f2f695b

File tree

29 files changed

+622
-381
lines changed

29 files changed

+622
-381
lines changed

extensions/proxy-registry/deployment/pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,12 @@
2929
<groupId>io.quarkus</groupId>
3030
<artifactId>quarkus-credentials-deployment</artifactId>
3131
</dependency>
32+
33+
<dependency>
34+
<groupId>io.quarkus</groupId>
35+
<artifactId>quarkus-junit5-internal</artifactId>
36+
<scope>test</scope>
37+
</dependency>
3238
</dependencies>
3339

3440
<build>

extensions/proxy-registry/deployment/src/main/java/io/quarkus/proxy/config/deployment/ProxyConfigProcessor.java

Lines changed: 0 additions & 32 deletions
This file was deleted.
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package io.quarkus.proxy.deployment;
2+
3+
import java.util.function.Supplier;
4+
5+
import io.quarkus.builder.item.SimpleBuildItem;
6+
import io.quarkus.proxy.ProxyConfigurationRegistry;
7+
8+
/**
9+
* A build item that indicates that the proxy registry has been initialized.
10+
*/
11+
public final class ProxyRegistryBuildItem extends SimpleBuildItem {
12+
private final Supplier<ProxyConfigurationRegistry> registry;
13+
14+
public ProxyRegistryBuildItem(Supplier<ProxyConfigurationRegistry> registry) {
15+
this.registry = registry;
16+
}
17+
18+
public Supplier<ProxyConfigurationRegistry> registry() {
19+
return registry;
20+
}
21+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package io.quarkus.proxy.deployment;
2+
3+
import java.util.function.Supplier;
4+
5+
import jakarta.inject.Singleton;
6+
7+
import io.quarkus.arc.deployment.SyntheticBeanBuildItem;
8+
import io.quarkus.deployment.annotations.BuildProducer;
9+
import io.quarkus.deployment.annotations.BuildStep;
10+
import io.quarkus.deployment.annotations.ExecutionTime;
11+
import io.quarkus.deployment.annotations.Record;
12+
import io.quarkus.proxy.ProxyConfigurationRegistry;
13+
import io.quarkus.proxy.runtime.ProxyConfigurationRecorder;
14+
import io.quarkus.proxy.runtime.ProxyConfigurationRegistryImpl;
15+
16+
public class ProxyRegistryProcessor {
17+
@BuildStep
18+
@Record(ExecutionTime.RUNTIME_INIT)
19+
void initializeProxyConfigurationRegistry(
20+
ProxyConfigurationRecorder recorder,
21+
BuildProducer<ProxyRegistryBuildItem> registry,
22+
BuildProducer<SyntheticBeanBuildItem> syntheticBeans) {
23+
24+
Supplier<ProxyConfigurationRegistry> supplier = recorder.init();
25+
26+
registry.produce(new ProxyRegistryBuildItem(supplier));
27+
28+
syntheticBeans.produce(SyntheticBeanBuildItem.create(ProxyConfigurationRegistryImpl.class)
29+
.addType(ProxyConfigurationRegistry.class)
30+
.supplier(supplier)
31+
.scope(Singleton.class)
32+
.unremovable()
33+
.setRuntimeInit()
34+
.done());
35+
36+
}
37+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package io.quarkus.proxy.test;
2+
3+
import static org.junit.jupiter.api.Assertions.assertTrue;
4+
5+
import java.util.Optional;
6+
7+
import jakarta.inject.Inject;
8+
9+
import org.junit.jupiter.api.Test;
10+
import org.junit.jupiter.api.extension.RegisterExtension;
11+
12+
import io.quarkus.proxy.ProxyConfiguration;
13+
import io.quarkus.proxy.ProxyConfigurationRegistry;
14+
import io.quarkus.test.QuarkusUnitTest;
15+
16+
public class DefaultProxyMissingTest {
17+
@RegisterExtension
18+
static final QuarkusUnitTest config = new QuarkusUnitTest();
19+
20+
@Inject
21+
ProxyConfigurationRegistry registry;
22+
23+
@Test
24+
public void test() {
25+
Optional<ProxyConfiguration> proxy = registry.get(Optional.empty());
26+
assertTrue(proxy.isEmpty());
27+
}
28+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package io.quarkus.proxy.test;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
import static org.junit.jupiter.api.Assertions.assertTrue;
5+
6+
import java.time.Duration;
7+
import java.util.List;
8+
import java.util.Optional;
9+
10+
import jakarta.inject.Inject;
11+
12+
import org.junit.jupiter.api.Test;
13+
import org.junit.jupiter.api.extension.RegisterExtension;
14+
15+
import io.quarkus.proxy.ProxyConfiguration;
16+
import io.quarkus.proxy.ProxyConfigurationRegistry;
17+
import io.quarkus.proxy.ProxyType;
18+
import io.quarkus.test.QuarkusUnitTest;
19+
20+
public class DefaultProxyPresentTest {
21+
@RegisterExtension
22+
static final QuarkusUnitTest config = new QuarkusUnitTest()
23+
.withConfigurationResource("default-proxy-present.properties");
24+
25+
@Inject
26+
ProxyConfigurationRegistry registry;
27+
28+
@Test
29+
public void test() {
30+
Optional<ProxyConfiguration> proxy = registry.get(Optional.empty());
31+
assertTrue(proxy.isPresent());
32+
ProxyConfiguration cfg = proxy.get();
33+
assertEquals("localhost", cfg.host());
34+
assertEquals(3128, cfg.port());
35+
assertEquals(Optional.of("user"), cfg.username());
36+
assertEquals(Optional.of("pwd"), cfg.password());
37+
assertEquals(Optional.of(List.of("localhost", "example.com")), cfg.nonProxyHosts());
38+
assertEquals(Optional.of(Duration.ofSeconds(1)), cfg.proxyConnectTimeout());
39+
assertEquals(ProxyType.HTTP, cfg.type());
40+
}
41+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package io.quarkus.proxy.test;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
import static org.junit.jupiter.api.Assertions.assertThrows;
5+
import static org.junit.jupiter.api.Assertions.assertTrue;
6+
7+
import java.time.Duration;
8+
import java.util.List;
9+
import java.util.Optional;
10+
11+
import jakarta.inject.Inject;
12+
13+
import org.junit.jupiter.api.Test;
14+
import org.junit.jupiter.api.extension.RegisterExtension;
15+
16+
import io.quarkus.proxy.ProxyConfiguration;
17+
import io.quarkus.proxy.ProxyConfigurationRegistry;
18+
import io.quarkus.proxy.ProxyType;
19+
import io.quarkus.test.QuarkusUnitTest;
20+
21+
public class NamedProxyTest {
22+
@RegisterExtension
23+
static final QuarkusUnitTest config = new QuarkusUnitTest()
24+
.withConfigurationResource("named-proxy.properties");
25+
26+
@Inject
27+
ProxyConfigurationRegistry registry;
28+
29+
@Test
30+
public void testPresent() {
31+
Optional<ProxyConfiguration> proxy = registry.get(Optional.of("my-proxy"));
32+
assertTrue(proxy.isPresent());
33+
ProxyConfiguration cfg = proxy.get();
34+
assertEquals("localhost", cfg.host());
35+
assertEquals(3128, cfg.port());
36+
assertEquals(Optional.of("user"), cfg.username());
37+
assertEquals(Optional.of("pwd"), cfg.password());
38+
assertEquals(Optional.of(List.of("localhost", "example.com")), cfg.nonProxyHosts());
39+
assertEquals(Optional.of(Duration.ofSeconds(1)), cfg.proxyConnectTimeout());
40+
assertEquals(ProxyType.HTTP, cfg.type());
41+
}
42+
43+
@Test
44+
public void testMissing() {
45+
assertThrows(IllegalStateException.class, () -> registry.get(Optional.of("missing")));
46+
}
47+
48+
@Test
49+
public void testNone() {
50+
Optional<ProxyConfiguration> proxy = registry.get(Optional.of("none"));
51+
assertTrue(proxy.isPresent());
52+
ProxyConfiguration cfg = proxy.get();
53+
assertEquals("none", cfg.host());
54+
assertEquals(0, cfg.port());
55+
assertEquals(Optional.empty(), cfg.username());
56+
assertEquals(Optional.empty(), cfg.password());
57+
assertEquals(Optional.empty(), cfg.nonProxyHosts());
58+
assertEquals(Optional.empty(), cfg.proxyConnectTimeout());
59+
assertEquals(ProxyType.HTTP, cfg.type());
60+
}
61+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
quarkus.proxy.host=localhost
2+
quarkus.proxy.port=3128
3+
quarkus.proxy.username=user
4+
quarkus.proxy.password=pwd
5+
quarkus.proxy.non-proxy-hosts=localhost,example.com
6+
quarkus.proxy.proxy-connect-timeout=1s
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
quarkus.proxy.my-proxy.host=localhost
2+
quarkus.proxy.my-proxy.port=3128
3+
quarkus.proxy.my-proxy.username=user
4+
quarkus.proxy.my-proxy.password=pwd
5+
quarkus.proxy.my-proxy.non-proxy-hosts=localhost,example.com
6+
quarkus.proxy.my-proxy.proxy-connect-timeout=1s
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package io.quarkus.proxy;
2+
3+
import java.time.Duration;
4+
import java.util.List;
5+
import java.util.Optional;
6+
7+
public interface ProxyConfiguration {
8+
/**
9+
* Proxy host
10+
*/
11+
String host();
12+
13+
/**
14+
* Proxy port
15+
*/
16+
int port();
17+
18+
/**
19+
* Proxy username
20+
*/
21+
Optional<String> username();
22+
23+
/**
24+
* Proxy password
25+
*/
26+
Optional<String> password();
27+
28+
/**
29+
* Hostnames or IP addresses to exclude from proxying.
30+
*/
31+
Optional<List<String>> nonProxyHosts();
32+
33+
/**
34+
* Proxy connection timeout.
35+
*/
36+
Optional<Duration> proxyConnectTimeout();
37+
38+
/**
39+
* Proxy type.
40+
*/
41+
ProxyType type();
42+
43+
/**
44+
* @return this {@link ProxyConfiguration} if {@link #type()} returns {@link ProxyType#HTTP};
45+
* otherwise throws {@link IllegalStateException}
46+
* @throws IllegalStateException if {@link #type()} does not return {@link ProxyType#HTTP}
47+
*/
48+
default ProxyConfiguration assertHttpType() {
49+
if (type() != ProxyType.HTTP) {
50+
throw new IllegalStateException("Proxy type HTTP is required");
51+
}
52+
return this;
53+
}
54+
}

0 commit comments

Comments
 (0)