Skip to content

Commit be2006c

Browse files
authored
Merge pull request #619 from clj-commons/fix-connection-close-during-handshake
Fix #617 and #618
2 parents 41f6d86 + b04da76 commit be2006c

File tree

5 files changed

+36
-6
lines changed

5 files changed

+36
-6
lines changed

src/aleph/netty.clj

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -232,9 +232,7 @@
232232
(d/error! d (CancellationException. "future is cancelled."))
233233

234234
(some? (.cause f))
235-
(if (instance? ClosedChannelException (.cause f))
236-
(d/success! d false)
237-
(d/error! d (.cause f)))
235+
(d/error! d (.cause f))
238236

239237
:else
240238
(d/error! d (IllegalStateException. "future in unknown state"))))

src/aleph/tcp.clj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,8 @@
5353

5454
:channel-inactive
5555
([_ ctx]
56-
(s/close! @in)
57-
(.fireChannelInactive ctx))
56+
(some-> @in s/close!)
57+
(.fireChannelInactive ctx))
5858

5959
:channel-active
6060
([_ ctx]

test/aleph/netty_test.clj

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
(ns aleph.netty-test
2+
(:require
3+
[aleph.netty :as netty]
4+
[clojure.test :refer [deftest is]]
5+
[manifold.stream :as s])
6+
(:import
7+
(io.netty.channel.embedded EmbeddedChannel)))
8+
9+
(deftest closing-a-channel-sink
10+
(let [ch (EmbeddedChannel.)
11+
s (netty/sink ch)]
12+
(is (= true @(s/put! s "foo")))
13+
(is (nil? @(netty/wrap-future (netty/close ch))))
14+
(is (= false @(s/put! s "foo")))))

test/aleph/ssl.clj

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
(:require
33
[aleph.netty :as netty])
44
(:import
5-
(io.netty.handler.ssl ClientAuth SslContextBuilder)
65
(java.io ByteArrayInputStream)
76
(java.security KeyFactory PrivateKey)
87
(java.security.cert CertificateFactory X509Certificate)

test/aleph/tcp_ssl_test.clj

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,3 +61,22 @@
6161
:trust-store (into-array X509Certificate [ssl/ca-cert])})})]
6262
(is (nil? @(s/take! c)))
6363
(is (nil? @ssl-session) "SSL session should be undefined")))))
64+
65+
(deftest test-connection-close-during-ssl-handshake
66+
(let [ssl-session (atom nil)
67+
connection-closed (promise)
68+
notify-connection-closed #_:clj-kondo/ignore (netty/channel-handler
69+
:channel-inactive
70+
([_ ctx]
71+
(deliver connection-closed true)
72+
(.fireChannelInactive ctx)))]
73+
(with-server (tcp/start-server (ssl-echo-handler ssl-session)
74+
{:port 10001
75+
:ssl-context ssl/server-ssl-context
76+
:pipeline-transform (fn [p]
77+
(.addLast p notify-connection-closed))})
78+
(let [c @(tcp/client {:host "localhost"
79+
:port 10001})]
80+
(s/close! c)
81+
(is (deref connection-closed 1000 false))
82+
(is (nil? @ssl-session) "SSL session should be undefined")))))

0 commit comments

Comments
 (0)