github.com/sagernet/sing-box@v1.2.7/experimental/clashapi/configs.go (about) 1 package clashapi 2 3 import ( 4 "net/http" 5 "strings" 6 7 "github.com/sagernet/sing-box/log" 8 9 "github.com/go-chi/chi/v5" 10 "github.com/go-chi/render" 11 ) 12 13 func configRouter(server *Server, logFactory log.Factory, logger log.Logger) http.Handler { 14 r := chi.NewRouter() 15 r.Get("/", getConfigs(server, logFactory)) 16 r.Put("/", updateConfigs) 17 r.Patch("/", patchConfigs(server, logger)) 18 return r 19 } 20 21 type configSchema struct { 22 Port int `json:"port"` 23 SocksPort int `json:"socks-port"` 24 RedirPort int `json:"redir-port"` 25 TProxyPort int `json:"tproxy-port"` 26 MixedPort int `json:"mixed-port"` 27 AllowLan bool `json:"allow-lan"` 28 BindAddress string `json:"bind-address"` 29 Mode string `json:"mode"` 30 LogLevel string `json:"log-level"` 31 IPv6 bool `json:"ipv6"` 32 Tun map[string]any `json:"tun"` 33 } 34 35 func getConfigs(server *Server, logFactory log.Factory) func(w http.ResponseWriter, r *http.Request) { 36 return func(w http.ResponseWriter, r *http.Request) { 37 logLevel := logFactory.Level() 38 if logLevel == log.LevelTrace { 39 logLevel = log.LevelDebug 40 } else if logLevel < log.LevelError { 41 logLevel = log.LevelError 42 } 43 render.JSON(w, r, &configSchema{ 44 Mode: server.mode, 45 BindAddress: "*", 46 LogLevel: log.FormatLevel(logLevel), 47 }) 48 } 49 } 50 51 func patchConfigs(server *Server, logger log.Logger) func(w http.ResponseWriter, r *http.Request) { 52 return func(w http.ResponseWriter, r *http.Request) { 53 var newConfig configSchema 54 err := render.DecodeJSON(r.Body, &newConfig) 55 if err != nil { 56 render.Status(r, http.StatusBadRequest) 57 render.JSON(w, r, ErrBadRequest) 58 return 59 } 60 if newConfig.Mode != "" { 61 mode := strings.ToLower(newConfig.Mode) 62 if server.mode != mode { 63 server.mode = mode 64 logger.Info("updated mode: ", mode) 65 } 66 } 67 render.NoContent(w, r) 68 } 69 } 70 71 func updateConfigs(w http.ResponseWriter, r *http.Request) { 72 render.NoContent(w, r) 73 }