2024-01-28 01:36:16 +08:00

72 lines
1.8 KiB
Go

package initialization
import (
"crypto/tls"
"crypto/x509"
"fmt"
"log"
"net/http"
"time"
"github.com/gin-gonic/gin"
)
func loadCertificate(config Config) (cert tls.Certificate, err error) {
cert, err = tls.LoadX509KeyPair(config.CertFile, config.KeyFile)
if err != nil {
return cert, fmt.Errorf("failed to load certificate: %v", err)
}
// check certificate expiry
if len(cert.Certificate) == 0 {
return cert, fmt.Errorf("no certificates found in %s", config.CertFile)
}
parsedCert, err := x509.ParseCertificate(cert.Certificate[0])
if err != nil {
return cert, fmt.Errorf("failed to parse certificate: %v", err)
}
cert.Leaf = parsedCert
certExpiry := cert.Leaf.NotAfter
if certExpiry.Before(time.Now()) {
return cert, fmt.Errorf("certificate expired on %v", certExpiry)
}
return cert, nil
}
func startHTTPServer(config Config, r *gin.Engine) (err error) {
log.Printf("http server started: http://localhost:%d/webhook/event\n", config.HttpPort)
err = r.Run(fmt.Sprintf(":%d", config.HttpPort))
if err != nil {
return fmt.Errorf("failed to start http server: %v", err)
}
return nil
}
func startHTTPSServer(config Config, r *gin.Engine) (err error) {
cert, err := loadCertificate(config)
if err != nil {
return fmt.Errorf("failed to load certificate: %v", err)
}
server := &http.Server{
Addr: fmt.Sprintf(":%d", config.HttpsPort),
Handler: r,
TLSConfig: &tls.Config{
Certificates: []tls.Certificate{cert},
},
}
fmt.Printf("https server started: https://localhost:%d/webhook/event\n", config.HttpsPort)
err = server.ListenAndServeTLS("", "")
if err != nil {
return fmt.Errorf("failed to start https server: %v", err)
}
return nil
}
func StartServer(config Config, r *gin.Engine) (err error) {
if config.UseHttps {
err = startHTTPSServer(config, r)
} else {
err = startHTTPServer(config, r)
}
return err
}