diff --git a/dirlist.go b/dirlist.go index 5846b85..764d6cb 100644 --- a/dirlist.go +++ b/dirlist.go @@ -12,11 +12,11 @@ import ( "strings" ) -func generateDirectoryListing(URL *url.URL, path string, config Config) string { +func generateDirectoryListing(URL *url.URL, path string, config Config) (string, error) { var listing string files, err := ioutil.ReadDir(path) if err != nil { - log.Fatal(err) + return listing, err } listing = "# Directory listing\n\n" // Override with .mollyhead file @@ -24,9 +24,10 @@ func generateDirectoryListing(URL *url.URL, path string, config Config) string { _, err = os.Stat(header_path) if err == nil { header, err := ioutil.ReadFile(header_path) - if err == nil { - listing = string(header) + if err != nil { + return listing, err } + listing = string(header) } // Do "up" link first if URL.Path != "/" { @@ -62,7 +63,7 @@ func generateDirectoryListing(URL *url.URL, path string, config Config) string { } listing += fmt.Sprintf("=> %s %s\n", url.PathEscape(file.Name()), generatePrettyFileLabel(file, path, config)) } - return listing + return listing, nil } func generatePrettyFileLabel(info os.FileInfo, path string, config Config) string { diff --git a/handler.go b/handler.go index 53c173c..13c9cd9 100644 --- a/handler.go +++ b/handler.go @@ -277,9 +277,16 @@ func serveDirectory(URL *url.URL, path string, log *LogEntry, conn net.Conn, con serveFile(index_path, log, conn, config, errorLog) // Serve a generated listing } else { + listing, err := generateDirectoryListing(URL, path, config) + if err != nil { + errorLog.Println("Error generating listing for directory " + path + ": " + err.Error()) + conn.Write([]byte("40 Server error!\r\n")) + log.Status = 40 + return + } conn.Write([]byte("20 text/gemini\r\n")) log.Status = 20 - conn.Write([]byte(generateDirectoryListing(URL, path, config))) + conn.Write([]byte(listing)) } }