Add some detail to error messages, echo errors to the console.
parent
3e0dea55d8
commit
2fae1c2b46
39
main.go
39
main.go
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue