package main import ( "encoding/json" "net/http" "os" "git.pyer.club/kingecg/gohttpd/admin" "git.pyer.club/kingecg/gohttpd/model" "git.pyer.club/kingecg/gohttpd/server" "git.pyer.club/kingecg/gohttpd/utils" "git.pyer.club/kingecg/gologger" ) type GoHttp struct { logger gologger.Logger } // Start 是 GoHttp 服务的启动入口。 // 它初始化配置、日志记录器,并根据配置设置必要的服务器。 func (g *GoHttp) Start() { // 获取系统配置 conf := model.GetConfig() // 初始化服务器的日志记录器 g.logger = gologger.GetLogger("Server") // 记录 GoHttp 服务启动信息 g.logger.Info("start gohttpd") // if g.conf != nil { // 设置管理员处理器并使用管理员服务配置 adminHandler := server.NewServeMux(conf.Admin) adminHandler.Handle("/api/", http.StripPrefix("/api", admin.AdminServerMux)) // 创建并启动管理员服务器 g.makeServer(conf.Admin, adminHandler) // 遍历配置中的服务器列表,为每个服务器设置处理器并启动 for _, s := range conf.Servers { // 为每个服务器创建处理器 sHandler := server.NewServeMux(s) // 创建并启动该服务器 g.makeServer(s, sHandler) } // 遍历所有已初始化的服务器,开始监听并处理传入的连接 for _, listener := range server.ServerManager { // 启动服务器 listener.Start() // 开始服务,处理传入请求 listener.Serve() } // 记录 GoHttp 服务成功启动的信息 g.logger.Info("gohttpd start success") } func (g *GoHttp) makeServer(conf *model.HttpServerConfig, mux http.Handler) { s := &http.Server{ Handler: mux, } name := conf.Name port := conf.Port ss := &server.Server{ Server: s, Conf: conf, } server.AddServer(name, ss, port) } func (g *GoHttp) Stop() {} // LoadConfig 函数用于加载配置文件并对配置中的路径进行规范化处理。 // 它读取指定的 JSON 配置文件,将其内容解析到 model.Config 结构体中, // 然后对配置中的文件路径进行规范化处理,最后配置日志记录器。 func LoadConfig() { // 规范化配置文件的路径,确保路径格式统一 cpath := utils.NormalizePath("./config.json") // 从指定路径读取配置文件的内容 // 忽略可能的错误,实际应用中应处理错误 content, _ := os.ReadFile(cpath) // 将读取的 JSON 内容解析到 model.Config 结构体中 json.Unmarshal(content, &model.Config) // 规范化配置中日志追加器的文件路径 // 遍历配置中的所有日志追加器 for _, appender := range model.Config.Logging.Appenders { // 检查追加器类型是否为文件类型 if appender.Type == "file" { // 规范化文件路径 appender.Options["file"] = utils.NormalizePath(appender.Options["file"].(string)) } } // 规范化管理员服务器配置中的路径 normalizeServer(model.Config.Admin) // 遍历配置中的所有服务器,规范化每个服务器配置中的路径 for _, server := range model.Config.Servers { normalizeServer(server) } // 根据配置中的日志设置配置日志记录器 gologger.Configure(model.Config.Logging) // 获取名为 "Server" 的日志记录器实例 logger := gologger.GetLogger("Server") // 记录配置加载成功的信息 logger.Info("Load config success") } func normalizeServer(server *model.HttpServerConfig) { for index, path := range server.Paths { if path.Root != "" { server.Paths[index].Root = utils.NormalizePath(path.Root) } } if server.CertFile != "" { server.CertFile = utils.NormalizePath(server.CertFile) } if server.KeyFile != "" { server.KeyFile = utils.NormalizePath(server.KeyFile) } }