diff --git a/server/lib/http.go b/server/lib/http.go
index 5f214a169bce3c06c26bc7f2354ed220cc3311d8..0aba81ee23a76f6380fb47231397ac10023a4618 100644
--- a/server/lib/http.go
+++ b/server/lib/http.go
@@ -48,23 +48,10 @@ var upgrader = websocket.Upgrader{
 // attached to the WebSocket connection and every session.
 var clientIDAddrMap = newClientIDMap(clientIDAddrMapCapacity)
 
-// overrideReadConn is a net.Conn with an overridden Read method. Compare to
-// recordingConn at
-// https://dave.cheney.net/2015/05/22/struct-composition-with-go.
-type overrideReadConn struct {
-	net.Conn
-	io.Reader
-}
-
-func (conn *overrideReadConn) Read(p []byte) (int, error) {
-	return conn.Reader.Read(p)
-}
-
 type httpHandler struct {
 	// pconn is the adapter layer between stream-oriented WebSocket
 	// connections and the packet-oriented KCP layer.
 	pconn *turbotunnel.QueuePacketConn
-	ln    *SnowflakeListener
 }
 
 func (handler *httpHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
@@ -99,10 +86,10 @@ func (handler *httpHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
 	default:
 		// We didn't find a matching token, which means that we are
 		// dealing with a client that doesn't know about such things.
-		// "Unread" the token by constructing a new Reader and pass it
-		// to the old one-session-per-WebSocket mode.
-		conn2 := &overrideReadConn{Conn: conn, Reader: io.MultiReader(bytes.NewReader(token[:]), conn)}
-		err = oneshotMode(conn2, addr, handler.ln)
+		// Close the conn as we no longer support the old
+		// one-session-per-WebSocket mode.
+		log.Println("Received unsupported oneshot connection")
+		return
 	}
 	if err != nil {
 		log.Println(err)
@@ -110,13 +97,6 @@ func (handler *httpHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
 	}
 }
 
-// oneshotMode handles clients that did not send turbotunnel.Token at the start
-// of their stream. These clients use the WebSocket as a raw pipe, and expect
-// their session to begin and end when this single WebSocket does.
-func oneshotMode(conn net.Conn, addr net.Addr, ln *SnowflakeListener) error {
-	return ln.queueConn(&SnowflakeClientConn{Conn: conn, address: addr})
-}
-
 // turbotunnelMode handles clients that sent turbotunnel.Token at the start of
 // their stream. These clients expect to send and receive encapsulated packets,
 // with a long-lived session identified by ClientID.
diff --git a/server/lib/snowflake.go b/server/lib/snowflake.go
index 31b6a20b32921aaa24ca4c8e3852dc8f2ad0e5cf..a1051e008c5976bcbc88d1a566d54d61817276dd 100644
--- a/server/lib/snowflake.go
+++ b/server/lib/snowflake.go
@@ -279,7 +279,7 @@ func (l *SnowflakeListener) queueConn(conn net.Conn) error {
 	}
 }
 
-// SnowflakeClientConn is a wrapper for the underlying oneshot or turbotunnel
+// SnowflakeClientConn is a wrapper for the underlying turbotunnel
 // conn. We need to reference our client address map to determine the
 // remote address
 type SnowflakeClientConn struct {