From 1e9bccc564dcf549a717f50f460c0af7e87d7581 Mon Sep 17 00:00:00 2001 From: Jozef Hoschek Date: Sun, 12 Nov 2023 23:01:44 +0100 Subject: [PATCH 1/8] basic tls server added --- _examples/tls.go | 123 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 _examples/tls.go diff --git a/_examples/tls.go b/_examples/tls.go new file mode 100644 index 000000000..c759bbaa1 --- /dev/null +++ b/_examples/tls.go @@ -0,0 +1,123 @@ +package examples + +import ( + "crypto/tls" + "crypto/x509" + "encoding/json" + "log" + "net/http" + "path" + "time" +) + +const rootPEM = ` +-- GlobalSign Root R2, valid until Dec 15, 2021 +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 +MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL +v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 +eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq +tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd +C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa +zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB +mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH +V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n +bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG +3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs +J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO +291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS +ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd +AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 +TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== +-----END CERTIFICATE-----` + +func ExampleTlsServer() *http.Server { + certPem := []byte(`-----BEGIN CERTIFICATE----- +MIIBhTCCASugAwIBAgIQIRi6zePL6mKjOipn+dNuaTAKBggqhkjOPQQDAjASMRAw +DgYDVQQKEwdBY21lIENvMB4XDTE3MTAyMDE5NDMwNloXDTE4MTAyMDE5NDMwNlow +EjEQMA4GA1UEChMHQWNtZSBDbzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABD0d +7VNhbWvZLWPuj/RtHFjvtJBEwOkhbN/BnnE8rnZR8+sbwnc/KhCk3FhnpHZnQz7B +5aETbbIgmuvewdjvSBSjYzBhMA4GA1UdDwEB/wQEAwICpDATBgNVHSUEDDAKBggr +BgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MCkGA1UdEQQiMCCCDmxvY2FsaG9zdDo1 +NDUzgg4xMjcuMC4wLjE6NTQ1MzAKBggqhkjOPQQDAgNIADBFAiEA2zpJEPQyz6/l +Wf86aX6PepsntZv2GYlA5UpabfT2EZICICpJ5h/iI+i341gBmLiAFQOyTDT+/wQc +6MF9+Yw1Yy0t +-----END CERTIFICATE-----`) + keyPem := []byte(`-----BEGIN EC PRIVATE KEY----- +MHcCAQEEIIrYSSNQFaA2Hwf1duRSxKtLYX5CB04fSeQ6tF1aY/PuoAoGCCqGSM49 +AwEHoUQDQgAEPR3tU2Fta9ktY+6P9G0cWO+0kETA6SFs38GecTyudlHz6xvCdz8q +EKTcWGekdmdDPsHloRNtsiCa697B2O9IFA== +-----END EC PRIVATE KEY-----`) + + roots := x509.NewCertPool() + ok := roots.AppendCertsFromPEM([]byte(rootPEM)) + if !ok { + panic("failed to parse root certificate") + } + + cert, err := tls.X509KeyPair(certPem, keyPem) + if err != nil { + log.Fatal(err) + } + cfg := &tls.Config{Certificates: []tls.Certificate{cert}} + + srv := &http.Server{ + Addr: "https://example.com", + TLSConfig: cfg, + ReadTimeout: time.Minute, + WriteTimeout: time.Minute, + Handler: TlsHandler(), + } + return srv +} + +func TlsHandler() http.Handler { + items := map[string]int{} + + mux := http.NewServeMux() + + mux.HandleFunc("/tls/", func(writer http.ResponseWriter, request *http.Request) { + _, name := path.Split(request.URL.Path) + var data int + if err := json.NewDecoder(request.Body).Decode(&data); err != nil { + panic(err) + } + + switch request.Method { + case "PUT": + items[name] += data + writer.WriteHeader(http.StatusNoContent) + case "DELETE": + if _, ok := items[name]; ok { + delete(items, name) + writer.WriteHeader(http.StatusNoContent) + } else { + writer.WriteHeader(http.StatusNotFound) + } + default: + writer.WriteHeader(http.StatusBadRequest) + } + }) + + mux.HandleFunc("/tls", func(writer http.ResponseWriter, request *http.Request) { + switch request.Method { + case "GET": + + all, err := json.Marshal(&items) + if err != nil { + panic(err) + } + writer.Header().Set("Content-Type", "application/json") + writer.Write(all) + + default: + writer.WriteHeader(http.StatusBadRequest) + } + }) + + return mux +} From a1bdef6371d5ee1dac14ab47a7a975c9228e7165 Mon Sep 17 00:00:00 2001 From: Jozef Hoschek Date: Sun, 12 Nov 2023 23:45:01 +0100 Subject: [PATCH 2/8] changed to httptest server --- _examples/tls.go | 63 ++++++++++++++++++++++++------------------------ 1 file changed, 31 insertions(+), 32 deletions(-) diff --git a/_examples/tls.go b/_examples/tls.go index c759bbaa1..5ce133f2d 100644 --- a/_examples/tls.go +++ b/_examples/tls.go @@ -6,36 +6,35 @@ import ( "encoding/json" "log" "net/http" + "net/http/httptest" "path" - "time" + "strconv" ) const rootPEM = ` --- GlobalSign Root R2, valid until Dec 15, 2021 -----BEGIN CERTIFICATE----- -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 +JQZR7rkpeDMdmztcpHWD9f -----END CERTIFICATE-----` -func ExampleTlsServer() *http.Server { +func ExampleTlsServer() *httptest.Server { certPem := []byte(`-----BEGIN CERTIFICATE----- MIIBhTCCASugAwIBAgIQIRi6zePL6mKjOipn+dNuaTAKBggqhkjOPQQDAjASMRAw DgYDVQQKEwdBY21lIENvMB4XDTE3MTAyMDE5NDMwNloXDTE4MTAyMDE5NDMwNlow @@ -63,16 +62,10 @@ EKTcWGekdmdDPsHloRNtsiCa697B2O9IFA== if err != nil { log.Fatal(err) } - cfg := &tls.Config{Certificates: []tls.Certificate{cert}} - srv := &http.Server{ - Addr: "https://example.com", - TLSConfig: cfg, - ReadTimeout: time.Minute, - WriteTimeout: time.Minute, - Handler: TlsHandler(), - } - return srv + server := httptest.NewUnstartedServer(TlsHandler()) + server.TLS = &tls.Config{Certificates: []tls.Certificate{cert}} + return server } func TlsHandler() http.Handler { @@ -98,6 +91,12 @@ func TlsHandler() http.Handler { } else { writer.WriteHeader(http.StatusNotFound) } + case "GET": + if _, ok := items[name]; ok { + writer.Write([]byte(strconv.Itoa(items[name]))) + } else { + writer.WriteHeader(http.StatusNotFound) + } default: writer.WriteHeader(http.StatusBadRequest) } From 2f1a24d646aa83c993b03c43fc4e70cc244cb3e6 Mon Sep 17 00:00:00 2001 From: Jozef Hoschek Date: Mon, 13 Nov 2023 00:01:33 +0100 Subject: [PATCH 3/8] added very basic tests --- _examples/tls.go | 92 +++++++++++++++++++++++++++---------------- _examples/tls_test.go | 37 +++++++++++++++++ 2 files changed, 94 insertions(+), 35 deletions(-) create mode 100644 _examples/tls_test.go diff --git a/_examples/tls.go b/_examples/tls.go index 5ce133f2d..54ab3bf1d 100644 --- a/_examples/tls.go +++ b/_examples/tls.go @@ -13,44 +13,66 @@ import ( const rootPEM = ` -----BEGIN CERTIFICATE----- -MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4 -GA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbF -NpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwM -zE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzET -MBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQY -JKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2Ec -WtiHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUh -hB5uzsTgHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL -0gRgykmmKPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65 -TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rU -AVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCA -wEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O -BBYEFI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNv -AUKr+yAzv95ZURUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8 -dEe3jgr25sbwMpjjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw -8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0 -095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVE -TI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02 -JQZR7rkpeDMdmztcpHWD9f ------END CERTIFICATE-----` +MIIBVDCB+6ADAgECAgEBMAoGCCqGSM49BAMCMBIxEDAOBgNVBAoTB1Rlc3QgQ0Ew +HhcNMjMxMTEyMjI1MDUxWhcNMjQwNTEwMjI1MDUyWjASMRAwDgYDVQQKEwdUZXN0 +IENBMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAExCfkUYqpDK4p8kqoiv8N3NJN +TLRPXO34/bHMK1LlLgKZl/pVNoRDkBezOuA1JY7P84yIbHQURrdSk1fxSPuSYaNC +MEAwDgYDVR0PAQH/BAQDAgIEMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFGzL +/3opNd1chvJe3FfNKD0/r500MAoGCCqGSM49BAMCA0gAMEUCIQCQlXyc7ZOG/Pzm +1EXeRIk+kfhTSjm2N9VU2kfK9sXZygIgSSv3lfL+sIr/HsWU0JXgadKgTQXpLdv3 +tpQZpaV/Nxc= +-----END CERTIFICATE----- +` func ExampleTlsServer() *httptest.Server { certPem := []byte(`-----BEGIN CERTIFICATE----- -MIIBhTCCASugAwIBAgIQIRi6zePL6mKjOipn+dNuaTAKBggqhkjOPQQDAjASMRAw -DgYDVQQKEwdBY21lIENvMB4XDTE3MTAyMDE5NDMwNloXDTE4MTAyMDE5NDMwNlow -EjEQMA4GA1UEChMHQWNtZSBDbzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABD0d -7VNhbWvZLWPuj/RtHFjvtJBEwOkhbN/BnnE8rnZR8+sbwnc/KhCk3FhnpHZnQz7B -5aETbbIgmuvewdjvSBSjYzBhMA4GA1UdDwEB/wQEAwICpDATBgNVHSUEDDAKBggr -BgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MCkGA1UdEQQiMCCCDmxvY2FsaG9zdDo1 -NDUzgg4xMjcuMC4wLjE6NTQ1MzAKBggqhkjOPQQDAgNIADBFAiEA2zpJEPQyz6/l -Wf86aX6PepsntZv2GYlA5UpabfT2EZICICpJ5h/iI+i341gBmLiAFQOyTDT+/wQc -6MF9+Yw1Yy0t ------END CERTIFICATE-----`) - keyPem := []byte(`-----BEGIN EC PRIVATE KEY----- -MHcCAQEEIIrYSSNQFaA2Hwf1duRSxKtLYX5CB04fSeQ6tF1aY/PuoAoGCCqGSM49 -AwEHoUQDQgAEPR3tU2Fta9ktY+6P9G0cWO+0kETA6SFs38GecTyudlHz6xvCdz8q -EKTcWGekdmdDPsHloRNtsiCa697B2O9IFA== ------END EC PRIVATE KEY-----`) +MIIC5TCCAc2gAwIBAgIBATANBgkqhkiG9w0BAQsFADASMRAwDgYDVQQKEwdBY21l +IENvMB4XDTIzMTExMjIyNTgwNloXDTI0MDUxMDIyNTgwNlowEjEQMA4GA1UEChMH +QWNtZSBDbzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKIVbmvhGdNJ +ni4e3Bwxolg7M6caoud0IJHQvzyK/XwuPk3Gwp3+fjtC3SuPf8cxPhur9hCskFuK +ngQ28T6cANUCYTjPsYY8PDOPLTTrkuuBFDdO/IxDZvZuBW3ZO3QqUAECSt8stsh8 +wheuoBlzR+hKwJJK3pmkEaNKrLmZXopqXuecW1SSteqhzf763zkVi8ZLwJziKUuD +FjC4R5ChEq0pDzBKQdBWIv8Jptv7kIT1fN39Yiim4pZ2KJ9atjMx1ukrrBd0nKB/ +7C5nu/zlbNsot6zc8Su8Z5WCQqXoCCrPIaYnlh/+Lq9VJhYD0Pjo60xKWzzbIi+G +EjIDn9XTUg8CAwEAAaNGMEQwDgYDVR0PAQH/BAQDAgWgMBMGA1UdJQQMMAoGCCsG +AQUFBwMBMAwGA1UdEwEB/wQCMAAwDwYDVR0RBAgwBocEfwAAATANBgkqhkiG9w0B +AQsFAAOCAQEAcbIeCvXJpjH8QjPE7agC5rstxuRvbYHtSn7hKixojwPAFKXIQqRZ +2l/GhJUTmymtc+vaAVSLpRAps+TuB/TXetdJqT8aadk6GFgd8FLMARCpMy5xrSSv +qVO99viHSIpaR/T1HDKCSAz6llEId1yi+XCYR0fOSg5tXqwF8py6N19Lcp1Zy1f6 +0Ms5Pa7X2crF5f1bkoJiFM3XFTWOUy8MXuZuQoeOtGdLAePVWvQWWwZsO+2NuQkF +7dcimZJ8gpp1QcGEFx8+RIgGkbtp1CMEx8BEf5kkfMbje1/OdZvwsfZOTI1RaUWA +ABxPrh6fMq68uLduLGXiIoiV/yP3Lm/Xdw== +-----END CERTIFICATE----- + +`) + keyPem := []byte(`-----BEGIN RSA PRIVATE KEY----- +MIIEowIBAAKCAQEAohVua+EZ00meLh7cHDGiWDszpxqi53QgkdC/PIr9fC4+TcbC +nf5+O0LdK49/xzE+G6v2EKyQW4qeBDbxPpwA1QJhOM+xhjw8M48tNOuS64EUN078 +jENm9m4Fbdk7dCpQAQJK3yy2yHzCF66gGXNH6ErAkkremaQRo0qsuZleimpe55xb +VJK16qHN/vrfORWLxkvAnOIpS4MWMLhHkKESrSkPMEpB0FYi/wmm2/uQhPV83f1i +KKbilnYon1q2MzHW6SusF3ScoH/sLme7/OVs2yi3rNzxK7xnlYJCpegIKs8hpieW +H/4ur1UmFgPQ+OjrTEpbPNsiL4YSMgOf1dNSDwIDAQABAoIBAAib7M6MGUwQt/cp +KnXQ6ReYpWi10HtMvsIf/Vhg5Y/oAOUurn2n29qX9ZlvuNDCu9LKcnp2QACsvzHo +HS4/KQgnZTSYS4yevG/cpgEOljIuG/3IEz/8AIcMVvt7s127NZ6oGYP7IwZJIiIR +420Wo3YiKlJa6bHtdgZfXAdLryrY3+PxkGwXCoETUlvHks5QBFXYmLLjfKwqGreX +RPFkDq0OBlYDbIrfddR8iM3YZao+2dDSCFKBU40RKzY8lAU7cz/IoS4ooQ+1ouuj +77bkQaE9C4a9DA+U4nXUAkqiWk1v0hP5YgydNPAxtfkWKJoGS/WS41ZcLWUgQ5O+ +zdP7G7kCgYEA05WmK3YTG+IcW9t3fOPLOEGvKdE8l/iA7EyXcwunYzE2v47ebciF +vXmEye2qRlvfogD3o6YrbjDQPYhBQmmr1WnGWNgpLC+shy3oOrb1e4OBV7EHoXhW +MeWfUoAmWGgBddU/ZfPyIoarsJMdvNu3fVGoncwuDGGyX6pumb/gcw0CgYEAxBun +eFVhxgC9FdYBPr9HCvEqMOdulyjin28M3GnWmdrDqBlP/QuQgqXsnAn0XlZZb4Qf +CDudDyyZncSG8AODeFMPEB5vdWqroq7zTsMufRwI+4qJSJgxVHLitWnh+egnWsmq +fBFVG5K8RgSeB77Yl4oyejRVcOZ9Fi2vh8GZwosCgYBa5dCUnU5KTVJ3mAp2SfqV +OYrCAVTxyN3CJolt8FTCBXOKyhr+uQXTx6/nfEYJohCqLZY15P6FgU0FElNO78zV +i3Kd2oedpwGMtYkuKEm//VgEz1YC5YrKNubCb7GJi20NLUbmSu38LTT3T8yXxSDI +Itu4pu4lfZc/CB4pyUfoxQKBgQC5nGcEuONisd5FpZjmF8qY66uAP/vnLDZaqpPk +pnQMiQc4ukR//4sWbQ8mnTFifJ4Hs2hftXSxIQiAT7tbvieYIh0Wp4fc/UpYHviA +qrH8jiVeV0Aaqpm+EULMa9wLWZSuFEO9S/Zes6JpLwOX1yVPQOkHyzK3OiBYdoM1 +naL3gwKBgFIXQ8mgtpsA9AnzrfdigKP4C78HxvEq2iLR6HLGurmtdb88rGX9qZnT +zcXCOJ4ZS+ha08YPor/NOoI4olz8GTa0qTORcxGKsAe6F0tln0p7AeKd37jaebdU +j0IkvdefQeTVjMZKhO1px6FMl8Jg2kWaPchU5JQb9LnMNLtv/FlG +-----END RSA PRIVATE KEY----- +`) roots := x509.NewCertPool() ok := roots.AppendCertsFromPEM([]byte(rootPEM)) diff --git a/_examples/tls_test.go b/_examples/tls_test.go new file mode 100644 index 000000000..236ca7baf --- /dev/null +++ b/_examples/tls_test.go @@ -0,0 +1,37 @@ +package examples + +import ( + "crypto/tls" + "crypto/x509" + "github.com/gavv/httpexpect/v2" + "net/http" + "testing" +) + +func TlsClient() *http.Client { + roots := x509.NewCertPool() + ok := roots.AppendCertsFromPEM([]byte(rootPEM)) + if !ok { + panic("failed to parse root certificate") + } + cfg := tls.Config{RootCAs: roots} + + return &http.Client{Transport: &http.Transport{TLSClientConfig: &cfg}} +} + +func TestExampleTlsServer(t *testing.T) { + create_c_k() + server := ExampleTlsServer() // ExampleTlsServer() + server.StartTLS() + defer server.Close() + + config := httpexpect.Config{ + BaseURL: server.URL, Client: TlsClient(), + Reporter: httpexpect.NewRequireReporter(t), + Printers: []httpexpect.Printer{ + httpexpect.NewDebugPrinter(t, true), + }} + e := httpexpect.WithConfig(config) + e.PUT("tls/car").WithText("1").Expect().Status(http.StatusNoContent).NoContent() + e.GET("tls/car").Expect().Status(http.StatusOK).Body().IsEqual("1") +} From aebee65388552465d50f581d13ce7dfa0976d744 Mon Sep 17 00:00:00 2001 From: Jozef Hoschek Date: Mon, 13 Nov 2023 13:45:29 +0100 Subject: [PATCH 4/8] new certificates and fixed panic --- _examples/tls.go | 108 ++++++++++++++++++----------------------------- 1 file changed, 42 insertions(+), 66 deletions(-) diff --git a/_examples/tls.go b/_examples/tls.go index 54ab3bf1d..eea17ad2f 100644 --- a/_examples/tls.go +++ b/_examples/tls.go @@ -11,74 +11,44 @@ import ( "strconv" ) -const rootPEM = ` +func NewRootCertPool() *x509.CertPool { + const rootPEM = ` -----BEGIN CERTIFICATE----- -MIIBVDCB+6ADAgECAgEBMAoGCCqGSM49BAMCMBIxEDAOBgNVBAoTB1Rlc3QgQ0Ew -HhcNMjMxMTEyMjI1MDUxWhcNMjQwNTEwMjI1MDUyWjASMRAwDgYDVQQKEwdUZXN0 -IENBMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAExCfkUYqpDK4p8kqoiv8N3NJN -TLRPXO34/bHMK1LlLgKZl/pVNoRDkBezOuA1JY7P84yIbHQURrdSk1fxSPuSYaNC -MEAwDgYDVR0PAQH/BAQDAgIEMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFGzL -/3opNd1chvJe3FfNKD0/r500MAoGCCqGSM49BAMCA0gAMEUCIQCQlXyc7ZOG/Pzm -1EXeRIk+kfhTSjm2N9VU2kfK9sXZygIgSSv3lfL+sIr/HsWU0JXgadKgTQXpLdv3 -tpQZpaV/Nxc= +MIIBUzCB+6ADAgECAgEBMAoGCCqGSM49BAMCMBIxEDAOBgNVBAoTB1Rlc3QgQ0Ew +HhcNMjMxMTEzMTIyNTEzWhcNMjQwNTExMTIyNTEzWjASMRAwDgYDVQQKEwdUZXN0 +IENBMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEHBm1CiEs4CKw0ynUlzaTz9Pi +ROnBwosfX3xYIEz5l1rN119FEJLWQFx8xBASkpZDz+Eehw9QdPaqwapDKGVgbaNC +MEAwDgYDVR0PAQH/BAQDAgIEMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFExX +luCP8Bp73F1L7UuFCM/NFgPkMAoGCCqGSM49BAMCA0cAMEQCIFLFQRgIUbjzA0c1 +Pennq6gP/WiJpppZPQq5IYR4V7BfAiBVoGh+32UOJ13YYO8HsL/6P7KIwZKXkJpJ +LoibTriVMg== -----END CERTIFICATE----- ` - -func ExampleTlsServer() *httptest.Server { - certPem := []byte(`-----BEGIN CERTIFICATE----- -MIIC5TCCAc2gAwIBAgIBATANBgkqhkiG9w0BAQsFADASMRAwDgYDVQQKEwdBY21l -IENvMB4XDTIzMTExMjIyNTgwNloXDTI0MDUxMDIyNTgwNlowEjEQMA4GA1UEChMH -QWNtZSBDbzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKIVbmvhGdNJ -ni4e3Bwxolg7M6caoud0IJHQvzyK/XwuPk3Gwp3+fjtC3SuPf8cxPhur9hCskFuK -ngQ28T6cANUCYTjPsYY8PDOPLTTrkuuBFDdO/IxDZvZuBW3ZO3QqUAECSt8stsh8 -wheuoBlzR+hKwJJK3pmkEaNKrLmZXopqXuecW1SSteqhzf763zkVi8ZLwJziKUuD -FjC4R5ChEq0pDzBKQdBWIv8Jptv7kIT1fN39Yiim4pZ2KJ9atjMx1ukrrBd0nKB/ -7C5nu/zlbNsot6zc8Su8Z5WCQqXoCCrPIaYnlh/+Lq9VJhYD0Pjo60xKWzzbIi+G -EjIDn9XTUg8CAwEAAaNGMEQwDgYDVR0PAQH/BAQDAgWgMBMGA1UdJQQMMAoGCCsG -AQUFBwMBMAwGA1UdEwEB/wQCMAAwDwYDVR0RBAgwBocEfwAAATANBgkqhkiG9w0B -AQsFAAOCAQEAcbIeCvXJpjH8QjPE7agC5rstxuRvbYHtSn7hKixojwPAFKXIQqRZ -2l/GhJUTmymtc+vaAVSLpRAps+TuB/TXetdJqT8aadk6GFgd8FLMARCpMy5xrSSv -qVO99viHSIpaR/T1HDKCSAz6llEId1yi+XCYR0fOSg5tXqwF8py6N19Lcp1Zy1f6 -0Ms5Pa7X2crF5f1bkoJiFM3XFTWOUy8MXuZuQoeOtGdLAePVWvQWWwZsO+2NuQkF -7dcimZJ8gpp1QcGEFx8+RIgGkbtp1CMEx8BEf5kkfMbje1/OdZvwsfZOTI1RaUWA -ABxPrh6fMq68uLduLGXiIoiV/yP3Lm/Xdw== ------END CERTIFICATE----- - -`) - keyPem := []byte(`-----BEGIN RSA PRIVATE KEY----- -MIIEowIBAAKCAQEAohVua+EZ00meLh7cHDGiWDszpxqi53QgkdC/PIr9fC4+TcbC -nf5+O0LdK49/xzE+G6v2EKyQW4qeBDbxPpwA1QJhOM+xhjw8M48tNOuS64EUN078 -jENm9m4Fbdk7dCpQAQJK3yy2yHzCF66gGXNH6ErAkkremaQRo0qsuZleimpe55xb -VJK16qHN/vrfORWLxkvAnOIpS4MWMLhHkKESrSkPMEpB0FYi/wmm2/uQhPV83f1i -KKbilnYon1q2MzHW6SusF3ScoH/sLme7/OVs2yi3rNzxK7xnlYJCpegIKs8hpieW -H/4ur1UmFgPQ+OjrTEpbPNsiL4YSMgOf1dNSDwIDAQABAoIBAAib7M6MGUwQt/cp -KnXQ6ReYpWi10HtMvsIf/Vhg5Y/oAOUurn2n29qX9ZlvuNDCu9LKcnp2QACsvzHo -HS4/KQgnZTSYS4yevG/cpgEOljIuG/3IEz/8AIcMVvt7s127NZ6oGYP7IwZJIiIR -420Wo3YiKlJa6bHtdgZfXAdLryrY3+PxkGwXCoETUlvHks5QBFXYmLLjfKwqGreX -RPFkDq0OBlYDbIrfddR8iM3YZao+2dDSCFKBU40RKzY8lAU7cz/IoS4ooQ+1ouuj -77bkQaE9C4a9DA+U4nXUAkqiWk1v0hP5YgydNPAxtfkWKJoGS/WS41ZcLWUgQ5O+ -zdP7G7kCgYEA05WmK3YTG+IcW9t3fOPLOEGvKdE8l/iA7EyXcwunYzE2v47ebciF -vXmEye2qRlvfogD3o6YrbjDQPYhBQmmr1WnGWNgpLC+shy3oOrb1e4OBV7EHoXhW -MeWfUoAmWGgBddU/ZfPyIoarsJMdvNu3fVGoncwuDGGyX6pumb/gcw0CgYEAxBun -eFVhxgC9FdYBPr9HCvEqMOdulyjin28M3GnWmdrDqBlP/QuQgqXsnAn0XlZZb4Qf -CDudDyyZncSG8AODeFMPEB5vdWqroq7zTsMufRwI+4qJSJgxVHLitWnh+egnWsmq -fBFVG5K8RgSeB77Yl4oyejRVcOZ9Fi2vh8GZwosCgYBa5dCUnU5KTVJ3mAp2SfqV -OYrCAVTxyN3CJolt8FTCBXOKyhr+uQXTx6/nfEYJohCqLZY15P6FgU0FElNO78zV -i3Kd2oedpwGMtYkuKEm//VgEz1YC5YrKNubCb7GJi20NLUbmSu38LTT3T8yXxSDI -Itu4pu4lfZc/CB4pyUfoxQKBgQC5nGcEuONisd5FpZjmF8qY66uAP/vnLDZaqpPk -pnQMiQc4ukR//4sWbQ8mnTFifJ4Hs2hftXSxIQiAT7tbvieYIh0Wp4fc/UpYHviA -qrH8jiVeV0Aaqpm+EULMa9wLWZSuFEO9S/Zes6JpLwOX1yVPQOkHyzK3OiBYdoM1 -naL3gwKBgFIXQ8mgtpsA9AnzrfdigKP4C78HxvEq2iLR6HLGurmtdb88rGX9qZnT -zcXCOJ4ZS+ha08YPor/NOoI4olz8GTa0qTORcxGKsAe6F0tln0p7AeKd37jaebdU -j0IkvdefQeTVjMZKhO1px6FMl8Jg2kWaPchU5JQb9LnMNLtv/FlG ------END RSA PRIVATE KEY----- -`) - roots := x509.NewCertPool() ok := roots.AppendCertsFromPEM([]byte(rootPEM)) if !ok { panic("failed to parse root certificate") } + return roots +} + +func ExampleTlsServer() *httptest.Server { + certPem := []byte(`-----BEGIN CERTIFICATE----- +MIIBbDCCARKgAwIBAgIBAjAKBggqhkjOPQQDAjASMRAwDgYDVQQKEwdUZXN0IENB +MB4XDTIzMTExMzEyMjUxN1oXDTI0MDUxMTEyMjUxN1owEjEQMA4GA1UEChMHQWNt +ZSBDbzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABEvlkPnSh5jYMD4MSkjJH7HW +iDR/UnqIJrI3nV0FTotWly0z3nMy0FCM1VxyGJc8HcKi2KPIaQmVF2sYCLwu8xuj +WTBXMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDATAfBgNVHSME +GDAWgBRMV5bgj/Aae9xdS+1LhQjPzRYD5DAPBgNVHREECDAGhwR/AAABMAoGCCqG +SM49BAMCA0gAMEUCIQDHQVvWrOvagkYT9/qeSZ7xUwTTWiRfvWmlCgLf5NXu7AIg +ea/Q6OcG41k25PXVn3VRLRBEfSFIsuJzTyTNXCHx8vY= +-----END CERTIFICATE-----`) + + keyPem := []byte(`-----BEGIN EC PRIVATE KEY----- +MHcCAQEEIHHIE/n9wJI/dm1vnwhd8Jm/Wi04R+m8wYfUnkCFu4QnoAoGCCqGSM49 +AwEHoUQDQgAES+WQ+dKHmNgwPgxKSMkfsdaINH9SeogmsjedXQVOi1aXLTPeczLQ +UIzVXHIYlzwdwqLYo8hpCZUXaxgIvC7zGw== +-----END EC PRIVATE KEY-----`) cert, err := tls.X509KeyPair(certPem, keyPem) if err != nil { @@ -97,15 +67,16 @@ func TlsHandler() http.Handler { mux.HandleFunc("/tls/", func(writer http.ResponseWriter, request *http.Request) { _, name := path.Split(request.URL.Path) - var data int - if err := json.NewDecoder(request.Body).Decode(&data); err != nil { - panic(err) - } switch request.Method { case "PUT": + var data int + if err := json.NewDecoder(request.Body).Decode(&data); err != nil { + panic(err) + } items[name] += data writer.WriteHeader(http.StatusNoContent) + case "DELETE": if _, ok := items[name]; ok { delete(items, name) @@ -113,12 +84,17 @@ func TlsHandler() http.Handler { } else { writer.WriteHeader(http.StatusNotFound) } + case "GET": - if _, ok := items[name]; ok { - writer.Write([]byte(strconv.Itoa(items[name]))) + if amount, ok := items[name]; ok { + _, err := writer.Write([]byte(strconv.Itoa(amount))) + if err != nil { + writer.WriteHeader(http.StatusServiceUnavailable) + } } else { writer.WriteHeader(http.StatusNotFound) } + default: writer.WriteHeader(http.StatusBadRequest) } From f63fdc3d0bb47c282ed488a4949c157b9b66ee8a Mon Sep 17 00:00:00 2001 From: Jozef Hoschek Date: Mon, 13 Nov 2023 18:03:08 +0100 Subject: [PATCH 5/8] comments and formatting --- _examples/tls.go | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/_examples/tls.go b/_examples/tls.go index eea17ad2f..91ed94717 100644 --- a/_examples/tls.go +++ b/_examples/tls.go @@ -11,6 +11,11 @@ import ( "strconv" ) +// NewRootCertPool creates a new custom root-certificate set. +// +// In this example, it's used so that the server's certificates are trusted. +// In real world use it's better to omit this in order to use the +// default root set of the current operating system. func NewRootCertPool() *x509.CertPool { const rootPEM = ` -----BEGIN CERTIFICATE----- @@ -32,6 +37,7 @@ LoibTriVMg== return roots } +// ExampleTlsServer creates a httptest.Server with hardcoded key pair. func ExampleTlsServer() *httptest.Server { certPem := []byte(`-----BEGIN CERTIFICATE----- MIIBbDCCARKgAwIBAgIBAjAKBggqhkjOPQQDAjASMRAwDgYDVQQKEwdUZXN0IENB @@ -60,6 +66,13 @@ UIzVXHIYlzwdwqLYo8hpCZUXaxgIvC7zGw== return server } +// TlsHandler creates http.Handler for tls server +// +// Routes: +// +// GET /fruits get item map +// GET /fruits/{name} get item amount +// PUT /fruits/{name} add or update fruit (amount in body) func TlsHandler() http.Handler { items := map[string]int{} @@ -78,8 +91,12 @@ func TlsHandler() http.Handler { writer.WriteHeader(http.StatusNoContent) case "DELETE": + var data int + if err := json.NewDecoder(request.Body).Decode(&data); err != nil { + panic(err) + } if _, ok := items[name]; ok { - delete(items, name) + items[name] -= data writer.WriteHeader(http.StatusNoContent) } else { writer.WriteHeader(http.StatusNotFound) From cb3b7be3f51e1ee8b0fa364be3435230bffe4c77 Mon Sep 17 00:00:00 2001 From: Jozef Hoschek Date: Mon, 13 Nov 2023 18:48:10 +0100 Subject: [PATCH 6/8] add extended tests --- _examples/tls_test.go | 75 ++++++++++++++++++++++++++++++++++++------- 1 file changed, 64 insertions(+), 11 deletions(-) diff --git a/_examples/tls_test.go b/_examples/tls_test.go index 236ca7baf..e37a73de6 100644 --- a/_examples/tls_test.go +++ b/_examples/tls_test.go @@ -2,25 +2,20 @@ package examples import ( "crypto/tls" - "crypto/x509" "github.com/gavv/httpexpect/v2" + "github.com/stretchr/testify/assert" "net/http" + "strconv" "testing" ) func TlsClient() *http.Client { - roots := x509.NewCertPool() - ok := roots.AppendCertsFromPEM([]byte(rootPEM)) - if !ok { - panic("failed to parse root certificate") - } - cfg := tls.Config{RootCAs: roots} - + cfg := tls.Config{RootCAs: NewRootCertPool()} return &http.Client{Transport: &http.Transport{TLSClientConfig: &cfg}} } func TestExampleTlsServer(t *testing.T) { - create_c_k() + server := ExampleTlsServer() // ExampleTlsServer() server.StartTLS() defer server.Close() @@ -31,7 +26,65 @@ func TestExampleTlsServer(t *testing.T) { Printers: []httpexpect.Printer{ httpexpect.NewDebugPrinter(t, true), }} + e := httpexpect.WithConfig(config) - e.PUT("tls/car").WithText("1").Expect().Status(http.StatusNoContent).NoContent() - e.GET("tls/car").Expect().Status(http.StatusOK).Body().IsEqual("1") + + e.PUT("/tls/car").WithText("1"). + Expect(). + Status(http.StatusNoContent).NoContent() + + e.PUT("/tls/car").WithText("10"). + Expect(). + Status(http.StatusNoContent).NoContent() + + e.GET("/tls/car"). + Expect(). + Status(http.StatusOK).Body().IsEqual("11") + + e.DELETE("/tls/car").WithText("1"). + Expect(). + Status(http.StatusNoContent).NoContent() + + e.GET("/tls/car"). + Expect(). + Status(http.StatusOK).Body().IsEqual("10") + + e.GET("/tls/not_there"). + Expect(). + Status(http.StatusNotFound).NoContent() + + e.DELETE("/tls/car").WithText("10"). + Expect(). + Status(http.StatusNoContent).NoContent() + + items := map[string]int{ + "car": 2, + "house": 1, + "cat": 6, + "fridge": 3, + } + for item, amount := range items { + e.PUT("/tls/" + item).WithText(strconv.Itoa(amount)). + Expect(). + Status(http.StatusNoContent).NoContent() + } + + e.DELETE("/tls/car").WithText("1"). + Expect(). + Status(http.StatusNoContent).NoContent() + + items["car"] -= 1 + + var m map[string]int + + r := e.GET("/tls").Expect().Status(http.StatusOK) + + r.Header("Content-Type").IsEqual("application/json") + + r.JSON().Decode(&m) + + for item, amount := range m { + assert.Equal(t, amount, items[item]) + } + } From c4241ca2149b9515a3e66779d75f9e94f1a3d0d1 Mon Sep 17 00:00:00 2001 From: Jozef Hoschek Date: Mon, 13 Nov 2023 19:03:22 +0100 Subject: [PATCH 7/8] update README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index bab8b7133..150b8f5ac 100644 --- a/README.md +++ b/README.md @@ -142,6 +142,10 @@ See [`_examples`](_examples) directory for complete standalone examples. Testing with custom formatter for assertion messages. +* [`tls_test.go`](_examples/tls_test.go) + + Testing a tls server made with `net/http` and `crypto/tls` + ## Quick start ##### Hello, world! From 23c7cf41e592f42298d84d2d8e244254e6e1a442 Mon Sep 17 00:00:00 2001 From: Jozef Hoschek Date: Mon, 13 Nov 2023 19:10:53 +0100 Subject: [PATCH 8/8] fix linter --- _examples/tls.go | 10 +++++----- _examples/tls_test.go | 8 ++++---- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/_examples/tls.go b/_examples/tls.go index 91ed94717..8465e9b7a 100644 --- a/_examples/tls.go +++ b/_examples/tls.go @@ -37,8 +37,8 @@ LoibTriVMg== return roots } -// ExampleTlsServer creates a httptest.Server with hardcoded key pair. -func ExampleTlsServer() *httptest.Server { +// ExampleTLSServer creates a httptest.Server with hardcoded key pair. +func ExampleTLSServer() *httptest.Server { certPem := []byte(`-----BEGIN CERTIFICATE----- MIIBbDCCARKgAwIBAgIBAjAKBggqhkjOPQQDAjASMRAwDgYDVQQKEwdUZXN0IENB MB4XDTIzMTExMzEyMjUxN1oXDTI0MDUxMTEyMjUxN1owEjEQMA4GA1UEChMHQWNt @@ -61,19 +61,19 @@ UIzVXHIYlzwdwqLYo8hpCZUXaxgIvC7zGw== log.Fatal(err) } - server := httptest.NewUnstartedServer(TlsHandler()) + server := httptest.NewUnstartedServer(TLSHandler()) server.TLS = &tls.Config{Certificates: []tls.Certificate{cert}} return server } -// TlsHandler creates http.Handler for tls server +// TLSHandler creates http.Handler for tls server // // Routes: // // GET /fruits get item map // GET /fruits/{name} get item amount // PUT /fruits/{name} add or update fruit (amount in body) -func TlsHandler() http.Handler { +func TLSHandler() http.Handler { items := map[string]int{} mux := http.NewServeMux() diff --git a/_examples/tls_test.go b/_examples/tls_test.go index e37a73de6..870598d79 100644 --- a/_examples/tls_test.go +++ b/_examples/tls_test.go @@ -9,19 +9,19 @@ import ( "testing" ) -func TlsClient() *http.Client { +func TLSClient() *http.Client { cfg := tls.Config{RootCAs: NewRootCertPool()} return &http.Client{Transport: &http.Transport{TLSClientConfig: &cfg}} } func TestExampleTlsServer(t *testing.T) { - server := ExampleTlsServer() // ExampleTlsServer() + server := ExampleTLSServer() // ExampleTlsServer() server.StartTLS() defer server.Close() config := httpexpect.Config{ - BaseURL: server.URL, Client: TlsClient(), + BaseURL: server.URL, Client: TLSClient(), Reporter: httpexpect.NewRequireReporter(t), Printers: []httpexpect.Printer{ httpexpect.NewDebugPrinter(t, true), @@ -73,7 +73,7 @@ func TestExampleTlsServer(t *testing.T) { Expect(). Status(http.StatusNoContent).NoContent() - items["car"] -= 1 + items["car"]-- var m map[string]int