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  }