Add some detail to error messages, echo errors to the console.

main
diff 2021-03-26 06:53:21 +00:00
parent 3e0dea55d8
commit 2fae1c2b46
1 changed files with 19 additions and 20 deletions

39
main.go
View File

@ -38,19 +38,12 @@ import (
// Config stores all settings for an instance of RUFF. // Config stores all settings for an instance of RUFF.
type Config struct { type Config struct {
// Number of downloads to allow before exiting.
Downloads int Downloads int
// Port to use for the web server.
Port int Port int
// Path to the file being sent.
FilePath string FilePath string
// Name of the file being sent.
FileName string FileName string
// Hide the QR code of the final URL.
HideQR bool HideQR bool
// Start RUFF in upload mode, offering up an upload form instead of a file.
Uploading bool Uploading bool
// Allow uploads with multiple files selected.
Multiple bool Multiple bool
} }
@ -81,7 +74,7 @@ func getConfig() (Config, error) {
conf.FileName = path.Base(conf.FilePath) conf.FileName = path.Base(conf.FilePath)
if conf.FilePath == "" && !conf.Uploading { if conf.FilePath == "" && !conf.Uploading {
return conf, errors.New("no file provided to download") return conf, errors.New("no file provided")
} }
return conf, nil return conf, nil
@ -90,17 +83,16 @@ func getConfig() (Config, error) {
// getIP uses the net package to try and determine the local address of the // getIP uses the net package to try and determine the local address of the
// device it's running on. // device it's running on.
// //
// Note: no actual connections are made, just prepared. // Note: I guess since this is a UDP connection, nothing is actually sent, no
// connection is established. Target doesn't even need to really exist for us
// to be able to grab the local address.
func getIP() (string, error) { func getIP() (string, error) {
conn, err := net.Dial("udp", "8.8.8.8:80") conn, err := net.Dial("udp", "8.8.8.8:80")
if err != nil { if err != nil {
return "", err return "", err
} }
localAddr, ok := conn.LocalAddr().(*net.UDPAddr) localAddr := conn.LocalAddr().(*net.UDPAddr)
if !ok {
return "", err
}
return localAddr.IP.String(), nil return localAddr.IP.String(), nil
} }
@ -112,7 +104,7 @@ var done = make(chan struct{})
func main() { func main() {
conf, err := getConfig() conf, err := getConfig()
if err != nil { if err != nil {
fmt.Println(err) fmt.Printf("config error: %v\n", err)
os.Exit(1) os.Exit(1)
} }
@ -130,7 +122,7 @@ func main() {
ip, err := getIP() ip, err := getIP()
if err != nil { if err != nil {
fmt.Println(err) fmt.Printf("failed to look up local IP: %v\n", err)
os.Exit(1) os.Exit(1)
} }
@ -145,7 +137,7 @@ func main() {
err = server.ListenAndServe() err = server.ListenAndServe()
if err != nil && !errors.Is(err, http.ErrServerClosed) { if err != nil && !errors.Is(err, http.ErrServerClosed) {
fmt.Println(err) fmt.Printf("server exited with error: %v\n", err)
os.Exit(1) os.Exit(1)
} }
@ -259,7 +251,9 @@ func setupUpload(server *http.Server, conf Config) {
for _, header := range field { for _, header := range field {
// Make sure there's only one file if we only expect one. // Make sure there's only one file if we only expect one.
if len(files) > 0 && !conf.Multiple { if len(files) > 0 && !conf.Multiple {
tpl.ExecuteTemplate(w, "UploadError", "multiple files found, only expected one file. start RUFF with -m for multiple file uploads.") err := errors.New("multiple files found, only expected one file. start RUFF with -m for multiple file uploads.")
tpl.ExecuteTemplate(w, "UploadError", err)
fmt.Println(err)
return return
} }
files = append(files, header) files = append(files, header)
@ -270,12 +264,15 @@ func setupUpload(server *http.Server, conf Config) {
for i := range files { for i := range files {
err := saveFile(files[i]) err := saveFile(files[i])
if err != nil { if err != nil {
err = fmt.Errorf("could not save file %v: %w", files[i].Filename, err)
tpl.ExecuteTemplate(w, "UploadError", err) tpl.ExecuteTemplate(w, "UploadError", err)
fmt.Println(err)
return return
} }
} }
tpl.ExecuteTemplate(w, "UploadMessage", "Upload successful!") tpl.ExecuteTemplate(w, "UploadMessage", "Upload successful!")
fmt.Println("upload successful")
go shutdown(server) go shutdown(server)
}) })
} }
@ -284,7 +281,7 @@ func setupUpload(server *http.Server, conf Config) {
func saveFile(header *multipart.FileHeader) error { func saveFile(header *multipart.FileHeader) error {
inFile, err := header.Open() inFile, err := header.Open()
if err != nil { if err != nil {
return err return fmt.Errorf("could not open uploaded file: %w", err)
} }
defer inFile.Close() defer inFile.Close()
@ -292,13 +289,15 @@ func saveFile(header *multipart.FileHeader) error {
// TODO: This might fail if the file already exists, we should handle this // TODO: This might fail if the file already exists, we should handle this
// case specially. // case specially.
if err != nil { if err != nil {
return err return fmt.Errorf("could not save uploaded file: %w", err)
} }
defer outFile.Close() defer outFile.Close()
// TODO: If the file is large enough to be dumped to disk, we could assert it
// as an os.File and move the file itself rather than copying it bit by bit.
_, err = io.Copy(outFile, inFile) _, err = io.Copy(outFile, inFile)
if err != nil { if err != nil {
return err return fmt.Errorf("could not copy uploaded file to disk: %w", err)
} }
fmt.Printf("Received file: %v\n", header.Filename) fmt.Printf("Received file: %v\n", header.Filename)