* Обновлена функция respondWithFile.
* Добавлены закрытия файлов, без которых программа могла за продолжительное время работы достичь лимита по количеству открытых файлов. * Память, занятая данными, нужными только для инициализации теперь освобождается, когда эти данные становятся ненужными.
This commit is contained in:
parent
560f7e064a
commit
91e1e10501
1 changed files with 15 additions and 12 deletions
27
main.go
27
main.go
|
@ -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)
|
||||
|
|
Loading…
Reference in a new issue