package ws
import (
"fmt"
"io"
"io/fs"
"os"
"wssrv/log"
"github.com/gorilla/websocket"
)
func sendFileReply(con *websocket.Conn, fileNa string) error {
var (
err error
msg, data []byte
)
if data, err = os.ReadFile(fileNa); err != nil {
return fmt.Errorf("unable to read file '%s': %v", fileNa, err)
}
for err != io.EOF {
if _, msg, err = con.ReadMessage(); err != nil {
return fmt.Errorf("unable to read from websocket on '%s': %v", con.RemoteAddr(), err)
}
fmt.Printf("(%s): %s\n", con.RemoteAddr(), msg)
log.Info.Printf("sending file '%s'", fileNa)
if err = con.WriteMessage(websocket.TextMessage, data); err != nil {
return fmt.Errorf("unable write on websocket on '%s': %v", con.RemoteAddr(), err)
}
}
return nil
}
// SendFileReply sends a given file in the websocket as a reply to every
// message received.
func SendFileReply(con *websocket.Conn, fileNa string) error {
switch {
case con == nil:
return fmt.Errorf("nil connection parameter")
case len(fileNa) == 0:
return fmt.Errorf("empty file parameter")
}
var (
err error
stat fs.FileInfo
)
if stat, err = os.Stat(fileNa); err != nil {
return fmt.Errorf("unable to check metadata for file '%s': %v", fileNa, err)
}
if !stat.Mode().IsRegular() {
return fmt.Errorf("file '%s' is not regular")
}
if stat.Mode()&0444 == 0 {
return fmt.Errorf("file '%s' is not readable")
}
return sendFileReply(con, fileNa)
}