123 lines
2.7 KiB
Go
123 lines
2.7 KiB
Go
package command
|
|
|
|
import (
|
|
"io/fs"
|
|
"net/http"
|
|
"path/filepath"
|
|
"strings"
|
|
webserver "vServer/Backend/WebServer"
|
|
admin "vServer/Backend/admin"
|
|
json "vServer/Backend/admin/go/json"
|
|
)
|
|
|
|
func SecurePost(w http.ResponseWriter, r *http.Request) bool {
|
|
// Проверяем, что запрос POST (не GET из браузера)
|
|
|
|
if webserver.Secure_post {
|
|
|
|
if r.Method != "POST" {
|
|
http.Error(w, "Метод не разрешен. Используйте POST", http.StatusMethodNotAllowed)
|
|
return false
|
|
}
|
|
|
|
}
|
|
|
|
return true
|
|
}
|
|
|
|
// API обработчик для /api/*
|
|
func ApiHandler(w http.ResponseWriter, r *http.Request) {
|
|
path := r.URL.Path
|
|
|
|
switch path {
|
|
case "/api/metrics":
|
|
json.GetAllMetrics(w)
|
|
default:
|
|
http.NotFound(w, r)
|
|
}
|
|
}
|
|
|
|
// JSON обработчик для /json/*
|
|
func JsonHandler(w http.ResponseWriter, r *http.Request) {
|
|
w.Header().Set("Content-Type", "application/json")
|
|
path := r.URL.Path
|
|
|
|
switch path {
|
|
case "/json/server_status.json":
|
|
w.Write(json.GetServerStatusJSON())
|
|
case "/json/menu.json":
|
|
w.Write(json.GetMenuJSON())
|
|
default:
|
|
http.NotFound(w, r)
|
|
}
|
|
}
|
|
|
|
// Обработчик сервисных команд для /service/*
|
|
func ServiceHandler(w http.ResponseWriter, r *http.Request) {
|
|
path := r.URL.Path
|
|
|
|
if !SecurePost(w, r) {
|
|
return
|
|
}
|
|
|
|
if SiteList(w, r, path) {
|
|
return
|
|
}
|
|
|
|
if site_add(w, path) {
|
|
return
|
|
}
|
|
|
|
if Service_Run(w, r, path) {
|
|
return
|
|
}
|
|
http.NotFound(w, r)
|
|
}
|
|
|
|
// Обработчик статических файлов из embed
|
|
func StaticHandler(w http.ResponseWriter, r *http.Request) {
|
|
path := r.URL.Path
|
|
|
|
// Убираем ведущий слэш
|
|
path = strings.TrimPrefix(path, "/")
|
|
|
|
// Если пустой путь, показываем index.html
|
|
if path == "" {
|
|
path = "html/index.html"
|
|
} else {
|
|
path = "html/" + path
|
|
}
|
|
|
|
// Читаем файл из файловой системы (embed или диск)
|
|
fileSystem := admin.GetFileSystem()
|
|
content, err := fs.ReadFile(fileSystem, path)
|
|
if err != nil {
|
|
http.NotFound(w, r)
|
|
return
|
|
}
|
|
|
|
// Устанавливаем правильный Content-Type
|
|
ext := filepath.Ext(path)
|
|
switch ext {
|
|
case ".css":
|
|
w.Header().Set("Content-Type", "text/css")
|
|
case ".js":
|
|
w.Header().Set("Content-Type", "application/javascript")
|
|
case ".json":
|
|
w.Header().Set("Content-Type", "application/json")
|
|
case ".html":
|
|
w.Header().Set("Content-Type", "text/html")
|
|
}
|
|
|
|
// Предотвращаем кеширование в режиме разработки (когда UseEmbedded = false)
|
|
if !admin.UseEmbedded {
|
|
w.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate")
|
|
w.Header().Set("Pragma", "no-cache")
|
|
w.Header().Set("Expires", "0")
|
|
}
|
|
|
|
// Отдаем файл
|
|
w.Write(content)
|
|
|
|
}
|