/
Stormcoder
/
snippetbox
Обзор
Документация
Войти
/
Stormcoder
/
snippetbox
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
cmd/web/main.go
69 строк
3 KB
teryaevs
Настройка веб-приложения из командной строки
01 окт 2025, 12:03
01 окт 2025, 12:03
5ecabaa
Код
Авторство
О чём код?
package main import ( "flag" "log" "net/http" "path/filepath" ) func main() { // Создаем новый флаг командной строки, значение по умолчанию: ":4000". // Добавляем небольшую справку, объясняющая, что содержит данный флаг. // Значение флага будет сохранено в переменной addr. address := flag.String("addr", ":4000", "Сетевой адрес HTTP") staticDir := flag.String("static-dir", "./ui/static", "Путь к статическим файлам") // Мы вызываем функцию flag.Parse() для извлечения флага из командной строки. // Она считывает значение флага из командной строки и присваивает его содержимое // переменной. Вам нужно вызвать ее *до* использования переменной addr // иначе она всегда будет содержать значение по умолчанию ":4000". // Если есть ошибки во время извлечения данных - приложение будет остановлено. flag.Parse() mux := http.NewServeMux() mux.HandleFunc("/", home) mux.HandleFunc("/snippet", showSnippet) mux.HandleFunc("/snippet/create", createSnippet) fileServer := http.FileServer(neuteredFileSystem{http.Dir(*staticDir)}) mux.Handle("/static/", http.StripPrefix("/static", fileServer)) // Значение, возвращаемое функцией flag.String(), является указателем на значение // из флага, а не самим значением. Нам нужно убрать ссылку на указатель // то есть перед использованием добавьте к нему префикс *. Обратите внимание, что мы используем // функцию log.Printf() для записи логов в журнал работы нашего приложения. log.Printf("Запуск сервера на %s", *address) err := http.ListenAndServe(*address, mux) log.Fatal(err) } // Важным моментом является необходимость предоставить доступ к статическим файлам // для обеспечения функциональности, при этом сохранить необходимый уровень безопасности, // ограничив доступ к просмотру списка файлов в директориях, // а также доступ к директориям более высокого уровня type neuteredFileSystem struct { fs http.FileSystem } func (nfs neuteredFileSystem) Open(path string) (http.File, error) { f, err := nfs.fs.Open(path) if err != nil { return nil, err } s, err := f.Stat() if s.IsDir() { index := filepath.Join(path, "index.html") if _, err := nfs.fs.Open(index); err != nil { closeErr := f.Close() if closeErr != nil { return nil, closeErr } return nil, err } } return f, nil }