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