tls-autodetect: mark issues, fix initialization

This commit is contained in:
Přemysl Eric Janouch 2018-07-24 13:58:57 +02:00
parent e8602ee718
commit b2cd8b46c9
Signed by: p
GPG Key ID: A0420B94F92B9493

View File

@ -16,14 +16,14 @@
// //
// This is an example TLS-autodetecting chat server. // This is an example TLS-autodetecting chat server.
// //
// You may connect to it using either of these: // These clients are unable to properly shutdown the connection on their exit:
// ncat -C localhost 1234
// ncat -C --ssl localhost 1234
//
// These clients are unable to properly shutdown the connection:
// telnet localhost 1234 // telnet localhost 1234
// openssl s_client -connect localhost:1234 // openssl s_client -connect localhost:1234
// //
// While this one doesn't react to an EOF from the server:
// ncat -C localhost 1234
// ncat -C --ssl localhost 1234
//
package main package main
import ( import (
@ -165,7 +165,7 @@ func forceShutdown(reason string) {
// --- Client ------------------------------------------------------------------ // --- Client ------------------------------------------------------------------
func (c *client) send(line string) { func (c *client) send(line string) {
if !c.closing { if c.conn != nil && !c.closing {
c.outQ = append(c.outQ, (line + "\r\n")...) c.outQ = append(c.outQ, (line + "\r\n")...)
c.flushOutQ() c.flushOutQ()
} }
@ -205,6 +205,7 @@ func (c *client) destroy() {
c.killTimer.Stop() c.killTimer.Stop()
} }
log.Println("client destroyed")
delete(clients, c) delete(clients, c)
} }
@ -341,6 +342,8 @@ func prepare(client *client) {
} }
} }
// Note that in this demo application the autodetection prevents non-TLS
// clients from receiving any messages until they send something.
isTLS := false isTLS := false
if sysconn, err := conn.(syscall.Conn).SyscallConn(); err != nil { if sysconn, err := conn.(syscall.Conn).SyscallConn(); err != nil {
// This is just for the TLS detection and doesn't need to be fatal. // This is just for the TLS detection and doesn't need to be fatal.
@ -349,6 +352,7 @@ func prepare(client *client) {
isTLS = detectTLS(sysconn) isTLS = detectTLS(sysconn)
} }
// FIXME: When the client sends no data, we still initialize its conn.
prepared <- preparedEvent{client, host, isTLS} prepared <- preparedEvent{client, host, isTLS}
} }