* Обновлена функция 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
|
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)
|
||||||
|
|
Loading…
Reference in a new issue