package app import ( "encoding/json" "io" "net/http" "strings" ) // --------------------------------------------------------------------- // EN: `handleDNSStatus` is an HTTP handler for dns status. // RU: `handleDNSStatus` - HTTP-обработчик для dns status. // --------------------------------------------------------------------- func handleDNSStatus(w http.ResponseWriter, r *http.Request) { if r.Method != http.MethodGet { http.Error(w, "method not allowed", http.StatusMethodNotAllowed) return } mode := loadDNSMode() writeJSON(w, http.StatusOK, makeDNSStatusResponse(mode)) } // --------------------------------------------------------------------- // EN: `handleDNSModeSet` is an HTTP handler for dns mode set. // RU: `handleDNSModeSet` - HTTP-обработчик для dns mode set. // --------------------------------------------------------------------- func handleDNSModeSet(w http.ResponseWriter, r *http.Request) { if r.Method != http.MethodPost { http.Error(w, "method not allowed", http.StatusMethodNotAllowed) return } var req DNSModeRequest if r.Body != nil { defer r.Body.Close() if err := json.NewDecoder(io.LimitReader(r.Body, 1<<20)).Decode(&req); err != nil && err != io.EOF { http.Error(w, "bad json", http.StatusBadRequest) return } } mode := loadDNSMode() mode.Mode = normalizeDNSResolverMode(req.Mode, req.ViaSmartDNS) mode.ViaSmartDNS = mode.Mode != DNSModeDirect if strings.TrimSpace(req.SmartDNSAddr) != "" { mode.SmartDNSAddr = req.SmartDNSAddr } if err := saveDNSMode(mode); err != nil { http.Error(w, "write error", http.StatusInternalServerError) return } mode = loadDNSMode() writeJSON(w, http.StatusOK, makeDNSStatusResponse(mode)) } func makeDNSStatusResponse(mode DNSMode) DNSStatusResponse { rt := smartDNSRuntimeSnapshot() resp := DNSStatusResponse{ ViaSmartDNS: mode.ViaSmartDNS, SmartDNSAddr: mode.SmartDNSAddr, Mode: mode.Mode, UnitState: smartdnsUnitState(), RuntimeNftset: rt.Enabled, WildcardSource: rt.WildcardSource, RuntimeCfgPath: rt.ConfigPath, } if rt.Message != "" { resp.RuntimeCfgError = rt.Message } return resp }