-修复CreatePipeline函数中的循环条件错误 - 移除main.go中冗余的日志和配置处理代码 - 新增placeholder包用于启动平台服务- 添加完整的HTTP服务器配置选项,包括端口、主机名和TLS设置 - 实现并发安全的服务器启动机制
75 lines
2.0 KiB
Go
75 lines
2.0 KiB
Go
package http
|
|
|
|
import (
|
|
"fmt"
|
|
"net/http"
|
|
"platform/config"
|
|
"platform/logging"
|
|
"platform/pipeline"
|
|
"sync"
|
|
)
|
|
|
|
type pipelineAdaptor struct {
|
|
pipeline.RequestPipeline
|
|
}
|
|
|
|
func (p pipelineAdaptor) ServeHTTP(writer http.ResponseWriter, request *http.Request) {
|
|
err := p.ProcessRequest(request, writer)
|
|
if err != nil {
|
|
http.Error(writer, err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
}
|
|
|
|
func Serve(pl pipeline.RequestPipeline, cfg config.Configuration, logger logging.Logger) *sync.WaitGroup {
|
|
wg := sync.WaitGroup{}
|
|
adaptor := pipelineAdaptor{RequestPipeline: pl}
|
|
|
|
serveHttp(cfg, logger, &wg, &adaptor)
|
|
serveHttps(cfg, logger, &wg, &adaptor)
|
|
|
|
return &wg
|
|
}
|
|
|
|
func serveHttp(cfg config.Configuration, logger logging.Logger, wg *sync.WaitGroup, adaptor *pipelineAdaptor) {
|
|
enableHttp := cfg.GetBoolDefault("http:enableHTTP", true)
|
|
if !enableHttp {
|
|
return
|
|
}
|
|
httpPort := cfg.GetIntDefault("http:port", 5000)
|
|
httpName := cfg.GetStringDefault("http:name", "localhost")
|
|
logger.Debugf("Starting HTTP server on port %v:%d", httpName, httpPort)
|
|
wg.Add(1)
|
|
go func() {
|
|
url := fmt.Sprintf("%v:%v", httpName, httpPort)
|
|
err := http.ListenAndServe(url, adaptor)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
}()
|
|
}
|
|
|
|
func serveHttps(cfg config.Configuration, logger logging.Logger, wg *sync.WaitGroup, adaptor *pipelineAdaptor) {
|
|
enableHttps := cfg.GetBoolDefault("http:enableHTTPS", false)
|
|
if !enableHttps {
|
|
return
|
|
}
|
|
httpsPort := cfg.GetIntDefault("http:httpsPort", 5500)
|
|
httpsName := cfg.GetStringDefault("http:httpsName", "localhost")
|
|
certFile, cfOk := cfg.GetString("http:httpsCert")
|
|
keyFile, kfOk := cfg.GetString("http:httpsKey")
|
|
if cfOk && kfOk {
|
|
logger.Debugf("Starting HTTPS server on port %v:%d", httpsName, httpsPort)
|
|
wg.Add(1)
|
|
go func() {
|
|
url := fmt.Sprintf("%v:%v", httpsName, httpsPort)
|
|
err := http.ListenAndServeTLS(url, certFile, keyFile, adaptor)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
}()
|
|
} else {
|
|
panic("HTTPS certificate or key file setting not found")
|
|
}
|
|
}
|