* Обновлена функция respondWithFile.

* Добавлены закрытия файлов, без которых программа могла за продолжительное время работы достичь лимита по количеству открытых файлов.
 * Память, занятая данными, нужными только для инициализации теперь освобождается, когда эти данные становятся ненужными.
This commit is contained in:
Nikita Osokin 2023-11-10 23:11:24 +05:00
parent 560f7e064a
commit 91e1e10501

27
main.go
View file

@ -118,38 +118,38 @@ func writeUint64BE(writer io.Writer, num uint64) error {
return nil return nil
} }
func respondWithFile(writer http.ResponseWriter, request *http.Request, filename string) { func respondWithFile(writer http.ResponseWriter, filename string) {
file, err := os.Open(filename) file, err := os.Open(filename)
if err != nil { if err != nil {
fmt.Println(" !!! Файл", filename, "не найден!") writer.WriteHeader(http.StatusInternalServerError)
return return
} }
stat, err := file.Stat() stat, err := file.Stat()
if err != nil { if err != nil {
fmt.Println(" !!! Не удалось получить информацию о файле", filename + "!") writer.WriteHeader(http.StatusInternalServerError)
file.Close()
return return
} }
buffer := make([]byte, stat.Size()) buffer := make([]byte, stat.Size())
count, err := file.Read(buffer); _, err = file.Read(buffer);
if err != nil { if err != nil {
fmt.Println(" !!! Не удалось прочитать содержимое файла", filename + "!") writer.WriteHeader(http.StatusInternalServerError)
file.Close()
return return
} }
if int64(count) != stat.Size() {
fmt.Println(" *** Файл", filename, "был прочитан не полностью.")
}
writer.Write(buffer) writer.Write(buffer)
file.Close()
} }
func handleRootAnd404(writer http.ResponseWriter, request *http.Request) { func handleRootAnd404(writer http.ResponseWriter, request *http.Request) {
if request.URL.Path != "/" { if request.URL.Path != "/" {
writer.WriteHeader(http.StatusNotFound) writer.WriteHeader(http.StatusNotFound)
respondWithFile(writer, request, "404.html") respondWithFile(writer, "404.html")
} else { } else {
respondWithFile(writer, request, "index.html") respondWithFile(writer, "index.html")
} }
} }
@ -325,12 +325,12 @@ func handleEditPage(writer http.ResponseWriter, request *http.Request) {
classesRWMutexes[queryValues["c"][0]].Unlock() classesRWMutexes[queryValues["c"][0]].Unlock()
} else { } else {
respondWithFile(writer, request, "editpage.html") respondWithFile(writer, "editpage.html")
} }
} }
/* TODO: в эту и похожие функции нужно добавть возможность отправить статус 500 */ /* TODO: в эту и похожие функции нужно добавть возможность отправить статус 500 */
func handleSchedule(writer http.ResponseWriter, request *http.Request) { func handleSchedule(writer http.ResponseWriter, request *http.Request) {
respondWithFile(writer, request, "schedule.html") respondWithFile(writer, "schedule.html")
} }
/* TODO: возможно стоит отправлять что-то кроме просто ошибки 500 */ /* TODO: возможно стоит отправлять что-то кроме просто ошибки 500 */
@ -385,6 +385,7 @@ func main() {
} }
classes, err = classesDir.ReadDir(0) classes, err = classesDir.ReadDir(0)
classesDir.Close()
if err != nil { if err != nil {
fmt.Printf("[!!!]Не удалось прочитать содержимое директории classes.\n") fmt.Printf("[!!!]Не удалось прочитать содержимое директории classes.\n")
return return
@ -400,6 +401,8 @@ func main() {
classesNames[i] = classes[i].Name() classesNames[i] = classes[i].Name()
classesRWMutexes[classes[i].Name()] = new(sync.RWMutex) classesRWMutexes[classes[i].Name()] = new(sync.RWMutex)
} }
classes = nil
http.HandleFunc("/", handleRootAnd404) http.HandleFunc("/", handleRootAnd404)
http.HandleFunc("/getClassesList", handleGetClassesList) http.HandleFunc("/getClassesList", handleGetClassesList)