Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix stream has already been operated upon or closed #457

Merged
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@
import org.carapaceproxy.utils.CertificatesUtils;
import org.carapaceproxy.utils.PrometheusUtils;
import reactor.netty.DisposableServer;
import reactor.netty.FutureMono;
import reactor.netty.NettyPipeline;
import reactor.netty.http.server.HttpServer;

Expand Down Expand Up @@ -148,6 +149,7 @@ private void stopListener(HostPort hostport) throws InterruptedException {
ListeningChannel channel = listeningChannels.remove(hostport);
if (channel != null) {
channel.channel.disposeNow(Duration.ofSeconds(10));
FutureMono.from(channel.getConfig().getGroup().close()).block(Duration.ofSeconds(30));
NiccoMlt marked this conversation as resolved.
Show resolved Hide resolved
}
}

Expand Down Expand Up @@ -283,6 +285,7 @@ public void channelRead(ChannelHandlerContext ctx, Object msg) {
.doOnConnection(conn -> {
CURRENT_CONNECTED_CLIENTS_GAUGE.inc();
conn.channel().closeFuture().addListener(e -> CURRENT_CONNECTED_CLIENTS_GAUGE.dec());
config.getGroup().add(conn.channel());
})
.httpRequestDecoder(option -> option.maxHeaderSize(currentConfiguration.getMaxHeaderSize()))
.handle((request, response) -> { // Custom request-response handling
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,10 @@

import java.util.Collections;
import java.util.Set;

import io.netty.channel.group.ChannelGroup;
import io.netty.channel.group.DefaultChannelGroup;
import io.netty.util.concurrent.DefaultEventExecutor;
import lombok.Data;

/**
Expand All @@ -44,6 +48,8 @@ public class NetworkListenerConfiguration {
private int keepAliveCount;
private int maxKeepAliveRequests;

private ChannelGroup group;

public HostPort getKey() {
return new HostPort(host, port);
}
Expand Down Expand Up @@ -96,6 +102,7 @@ public NetworkListenerConfiguration(String host,
this.keepAliveInterval = keepAliveInterval;
this.keepAliveCount = keepAliveCount;
this.maxKeepAliveRequests = maxKeepAliveRequests;
this.group = new DefaultChannelGroup(new DefaultEventExecutor());
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -93,10 +93,23 @@ public boolean isMoreSpecific(SSLCertificateConfiguration other) {
if (subjectAltNames == null || subjectAltNames.isEmpty()) {
return hostname.length() > other.getHostname().length();
}
final var otherNames = other.getNames().stream().map(CertificatesUtils::removeWildcard);
for (var n: getNames()) {

final int maxOtherNameLength = other.getNames().stream()
.map(CertificatesUtils::removeWildcard)
.mapToInt(String::length)
.max()
.orElse(0);

final int maxSubDomainLength = other.getNames().stream()
.map(name -> name.split("\\."))
.mapToInt(name -> name.length)
.max()
.orElse(0);

for (var n : getNames()) {
final var name = CertificatesUtils.removeWildcard(n);
if (otherNames.anyMatch(on -> name.length() > on.length())) {
final int nameSegmentLength = n.split("\\.").length;
if (name.length() >= maxOtherNameLength && nameSegmentLength >= maxSubDomainLength) {
return true;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -96,10 +96,14 @@ public void testChooseCertificate() throws Exception {
server.addCertificate(new SSLCertificateConfiguration("other", null, "cert", "pwd", STATIC));
server.addCertificate(new SSLCertificateConfiguration("*.example.com", Set.of("example.com", "*.example2.com"), "cert", "pwd", STATIC));
server.addCertificate(new SSLCertificateConfiguration("www.example.com", null, "cert", "pwd", STATIC));
server.addCertificate(new SSLCertificateConfiguration("*.qatest.pexample.it", Set.of("qatest.pexample.it"), "cert", "pwd", STATIC));
server.addCertificate(new SSLCertificateConfiguration("*.pexample.it", Set.of("qatest2.pexample.it"), "cert", "pwd", STATIC));


// client requests bad SNI, bad default in listener
assertNull(server.getListeners().chooseCertificate("no", "no-default"));

assertEquals("*.qatest.pexample.it", server.getListeners().chooseCertificate("test2.qatest.pexample.it", "no-default").getId());
// client requests SNI, bad default in listener
assertEquals("other", server.getListeners().chooseCertificate("other", "no-default").getId());

Expand Down Expand Up @@ -142,6 +146,7 @@ public void testChooseCertificate() throws Exception {
assertEquals("*", server.getListeners().chooseCertificate("", null).getId());
assertEquals("*", server.getListeners().chooseCertificate(null, "").getId());
}

}

@Test
Expand Down
Loading