diff --git a/src/croc/sending.go b/src/croc/sending.go index c6f8ec2c..192a36d2 100644 --- a/src/croc/sending.go +++ b/src/croc/sending.go @@ -152,6 +152,10 @@ func (c *Croc) sendReceive(websocketAddress, fname, codephrase string, isSender return nil case <-interrupt: log.Debug("interrupt") + err = sock.WriteMessage(websocket.TextMessage, []byte("interrupt")) + if err != nil { + return err + } // Cleanly close the connection by sending a close message and then // waiting (with timeout) for the server to close the connection. diff --git a/src/recipient/recipient.go b/src/recipient/recipient.go index 9fb70c2e..3ebd0936 100644 --- a/src/recipient/recipient.go +++ b/src/recipient/recipient.go @@ -73,6 +73,9 @@ func receive(isLocal bool, c *websocket.Conn, codephrase string, noPrompt bool, if messageType == websocket.PongMessage || messageType == websocket.PingMessage { continue } + if messageType == websocket.TextMessage && bytes.Equal(messsage, "interrupt") { + return errors.New("interrupted by other party") + } log.Debugf("got %d: %s", messageType, message) switch step { diff --git a/src/sender/sender.go b/src/sender/sender.go index 3686605c..0929256e 100644 --- a/src/sender/sender.go +++ b/src/sender/sender.go @@ -78,6 +78,9 @@ func send(isLocal bool, c *websocket.Conn, fname string, codephrase string, useC if messageType == websocket.PongMessage || messageType == websocket.PingMessage { continue } + if messageType == websocket.TextMessage && bytes.Equal(messsage, "interrupt") { + return errors.New("interrupted by other party") + } log.Debugf("got %d: %s", messageType, message) switch step { case 0: