From 340239fdd909d75f95e0c1927ba1a63ceb579321 Mon Sep 17 00:00:00 2001 From: loveuer Date: Sat, 13 Jan 2024 20:36:11 +0800 Subject: [PATCH] chore: add config disable http error log --- app.go | 7 +++ nf.go | 7 +-- xtest/tls/main.go | 119 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 130 insertions(+), 3 deletions(-) create mode 100644 xtest/tls/main.go diff --git a/app.go b/app.go index dd4c7e4..41de83a 100644 --- a/app.go +++ b/app.go @@ -5,6 +5,8 @@ import ( "crypto/tls" "errors" "fmt" + "io" + "log" "net" "net/http" "strings" @@ -42,6 +44,11 @@ func (a *App) ServeHTTP(writer http.ResponseWriter, request *http.Request) { func (a *App) run(ln net.Listener) error { srv := &http.Server{Handler: a} + + if a.config.DisableHttpErrorLog { + srv.ErrorLog = log.New(io.Discard, "", 0) + } + a.server = srv if !a.config.DisableBanner { diff --git a/nf.go b/nf.go index d37a6ee..0a114fa 100644 --- a/nf.go +++ b/nf.go @@ -13,9 +13,10 @@ type Config struct { // if report http.ErrServerClosed as run err ErrServeClose bool `json:"-"` - DisableBanner bool `json:"-"` - DisableLogger bool `json:"-"` - DisableRecover bool `json:"-"` + DisableBanner bool `json:"-"` + DisableLogger bool `json:"-"` + DisableRecover bool `json:"-"` + DisableHttpErrorLog bool `json:"-"` } var ( diff --git a/xtest/tls/main.go b/xtest/tls/main.go new file mode 100644 index 0000000..5bf85b8 --- /dev/null +++ b/xtest/tls/main.go @@ -0,0 +1,119 @@ +package main + +import ( + "bytes" + "crypto/rand" + "crypto/rsa" + "crypto/tls" + "crypto/x509" + "crypto/x509/pkix" + "encoding/pem" + "github.com/loveuer/nf" + "log" + "math/big" + "net" + "time" +) + +func main() { + app := nf.New(nf.Config{ + DisableHttpErrorLog: true, + }) + + app.Get("/hello/:name", func(c *nf.Ctx) error { + return c.SendString("hello, " + c.Param("name")) + }) + + st, _, _ := GenerateTlsConfig() + log.Fatal(app.RunTLS(":443", st)) +} + +func GenerateTlsConfig() (serverTLSConf *tls.Config, clientTLSConf *tls.Config, err error) { + ca := &x509.Certificate{ + SerialNumber: big.NewInt(2019), + Subject: pkix.Name{ + Organization: []string{"Company, INC."}, + Country: []string{"US"}, + Province: []string{""}, + Locality: []string{"San Francisco"}, + StreetAddress: []string{"Golden Gate Bridge"}, + PostalCode: []string{"94016"}, + }, + NotBefore: time.Now(), + NotAfter: time.Now().AddDate(99, 0, 0), + IsCA: true, + ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth, x509.ExtKeyUsageServerAuth}, + KeyUsage: x509.KeyUsageDigitalSignature | x509.KeyUsageCertSign, + BasicConstraintsValid: true, + } + // create our private and public key + caPrivKey, err := rsa.GenerateKey(rand.Reader, 4096) + if err != nil { + return nil, nil, err + } + // create the CA + caBytes, err := x509.CreateCertificate(rand.Reader, ca, ca, &caPrivKey.PublicKey, caPrivKey) + if err != nil { + return nil, nil, err + } + // pem encode + caPEM := new(bytes.Buffer) + pem.Encode(caPEM, &pem.Block{ + Type: "CERTIFICATE", + Bytes: caBytes, + }) + caPrivKeyPEM := new(bytes.Buffer) + pem.Encode(caPrivKeyPEM, &pem.Block{ + Type: "RSA PRIVATE KEY", + Bytes: x509.MarshalPKCS1PrivateKey(caPrivKey), + }) + // set up our server certificate + cert := &x509.Certificate{ + SerialNumber: big.NewInt(2019), + Subject: pkix.Name{ + Organization: []string{"Company, INC."}, + Country: []string{"US"}, + Province: []string{""}, + Locality: []string{"San Francisco"}, + StreetAddress: []string{"Golden Gate Bridge"}, + PostalCode: []string{"94016"}, + }, + IPAddresses: []net.IP{net.IPv4(127, 0, 0, 1), net.IPv6loopback}, + NotBefore: time.Now(), + NotAfter: time.Now().AddDate(1, 0, 0), + SubjectKeyId: []byte{1, 2, 3, 4, 6}, + ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth, x509.ExtKeyUsageServerAuth}, + KeyUsage: x509.KeyUsageDigitalSignature, + } + certPrivKey, err := rsa.GenerateKey(rand.Reader, 4096) + if err != nil { + return nil, nil, err + } + certBytes, err := x509.CreateCertificate(rand.Reader, cert, ca, &certPrivKey.PublicKey, caPrivKey) + if err != nil { + return nil, nil, err + } + certPEM := new(bytes.Buffer) + pem.Encode(certPEM, &pem.Block{ + Type: "CERTIFICATE", + Bytes: certBytes, + }) + certPrivKeyPEM := new(bytes.Buffer) + pem.Encode(certPrivKeyPEM, &pem.Block{ + Type: "RSA PRIVATE KEY", + Bytes: x509.MarshalPKCS1PrivateKey(certPrivKey), + }) + serverCert, err := tls.X509KeyPair(certPEM.Bytes(), certPrivKeyPEM.Bytes()) + if err != nil { + return nil, nil, err + } + serverTLSConf = &tls.Config{ + Certificates: []tls.Certificate{serverCert}, + } + certpool := x509.NewCertPool() + certpool.AppendCertsFromPEM(caPEM.Bytes()) + clientTLSConf = &tls.Config{ + RootCAs: certpool, + } + return +}