#155 Minimise timing issues with websocket close.

This commit is contained in:
Maximilian Paß
2022-06-19 21:36:29 +02:00
parent 950c421ea7
commit 3d1ed7cb0f

View File

@ -186,14 +186,8 @@ type rawToCodeOceanWriter struct {
// Write implements the io.Writer interface. // Write implements the io.Writer interface.
// The passed data is forwarded to the WebSocket to CodeOcean. // The passed data is forwarded to the WebSocket to CodeOcean.
func (rc *rawToCodeOceanWriter) Write(p []byte) (int, error) { func (rc *rawToCodeOceanWriter) Write(p []byte) (int, error) {
select { err := rc.proxy.sendToClient(dto.WebSocketMessage{Type: rc.outputType, Data: string(p)})
case <-rc.proxy.webSocketCtx.Done(): return len(p), err
return 0, nil
default:
log.Info("Passed WriteToCodeOceanCheck")
err := rc.proxy.sendToClient(dto.WebSocketMessage{Type: rc.outputType, Data: string(p)})
return len(p), err
}
} }
// webSocketProxy is an encapsulation of logic for forwarding between Runners and CodeOcean. // webSocketProxy is an encapsulation of logic for forwarding between Runners and CodeOcean.
@ -308,12 +302,17 @@ func (wp *webSocketProxy) sendToClient(message dto.WebSocketMessage) error {
return fmt.Errorf("error marshaling WebSocket message: %w", err) return fmt.Errorf("error marshaling WebSocket message: %w", err)
} }
log.WithField("message", message).Trace("Sending message to client") log.WithField("message", message).Trace("Sending message to client")
err = wp.writeMessage(websocket.TextMessage, encodedMessage) select {
if err != nil { case <-wp.webSocketCtx.Done():
errorMessage := "Error writing the message" default:
log.WithField("message", message).WithError(err).Warn(errorMessage) log.Info("Passed WriteToCodeOceanCheck")
wp.closeWithError(errorMessage) err = wp.writeMessage(websocket.TextMessage, encodedMessage)
return fmt.Errorf("error writing WebSocket message: %w", err) if err != nil {
errorMessage := "Error writing the message"
log.WithField("message", message).WithError(err).Warn(errorMessage)
wp.closeWithError(errorMessage)
return fmt.Errorf("error writing WebSocket message: %w", err)
}
} }
return nil return nil
} }