diff --git a/collector/collector.go b/collector/collector.go index 5ab29bc..881fa87 100644 --- a/collector/collector.go +++ b/collector/collector.go @@ -17,6 +17,7 @@ package collector import ( "encoding/json" "io" + "maps" "net/http" "strings" "sync" @@ -51,11 +52,12 @@ type metric struct { // NATSCollector collects NATS metrics type NATSCollector struct { sync.Mutex - Stats map[string]metric - httpClient *http.Client - endpoint string - system string - servers []*CollectedServer + Stats map[string]metric + httpClient *http.Client + endpoint string + system string + servers []*CollectedServer + serverRespKeys map[string]struct{} } // newPrometheusGaugeVec creates a custom GaugeVec @@ -213,6 +215,14 @@ func (nc *NATSCollector) makeRequests() map[string]map[string]interface{} { Debugf("ignoring server %s: %v", u.ID, err) delete(resps, u.ID) } + + // verify if there are any new keys in the response that we haven't seen before + keys := mapKeys(response, "") + if !maps.Equal(keys, nc.serverRespKeys) { + Debugf("new keys found in the response from %s, updating metrics", u.URL) + nc.objectToMetrics(response, nc.system) + nc.serverRespKeys = keys + } resps[u.ID] = response } return resps @@ -307,6 +317,7 @@ func (nc *NATSCollector) initMetricsFromServers(namespace string) { } } + nc.serverRespKeys = mapKeys(response, "") nc.objectToMetrics(response, namespace) } @@ -395,6 +406,30 @@ func (nc *NATSCollector) objectToMetrics(response map[string]interface{}, namesp } } +// mapKeys returns a map of all keys in a map, including nested maps. +// The keys from nested maps are prefixed with the parent key. +func mapKeys(input map[string]any, prefix string) map[string]struct{} { + keys := make(map[string]struct{}) + + for k, v := range input { + fullKey := k + if prefix != "" { + fullKey = prefix + "_" + k + } + + if nestedMap, ok := v.(map[string]any); ok { + nestedKeys := mapKeys(nestedMap, fullKey) + for nestedKey := range nestedKeys { + keys[nestedKey] = struct{}{} + } + } else { + keys[fullKey] = struct{}{} + } + } + + return keys +} + func newNatsCollector(system, endpoint string, servers []*CollectedServer) prometheus.Collector { // TODO: Potentially add TLS config in the transport. tr := &http.Transport{} diff --git a/collector/collector_test.go b/collector/collector_test.go index fa6094c..4b25538 100644 --- a/collector/collector_test.go +++ b/collector/collector_test.go @@ -15,6 +15,7 @@ package collector import ( "fmt" + "maps" "strings" "testing" "time" @@ -728,3 +729,30 @@ func TestReplicatorMetrics(t *testing.T) { url := "http://127.0.0.1:9922" verifyCollector(ReplicatorSystem, url, "varz", cases, t) } + +func TestMapKeys(t *testing.T) { + m := map[string]any{ + "foo": "bar", + "baz": "quux", + "nested": map[string]any{ + "foo": "bar", + "baz": "quux", + "nested": map[string]any{ + "foo": "bar", + "baz": "quux", + }, + }, + } + expected := map[string]struct{}{ + "foo": {}, + "baz": {}, + "nested_foo": {}, + "nested_baz": {}, + "nested_nested_foo": {}, + "nested_nested_baz": {}, + } + keys := mapKeys(m, "") + if !maps.Equal(keys, expected) { + t.Fatalf("expected %v, got %v", expected, keys) + } +} diff --git a/exporter/exporter.go b/exporter/exporter.go index da1df3f..51b62e5 100644 --- a/exporter/exporter.go +++ b/exporter/exporter.go @@ -1,4 +1,4 @@ -// Copyright 2017-2018 The NATS Authors +// Copyright 2017-2024 The NATS Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -15,9 +15,11 @@ package exporter import ( + "context" "crypto/tls" "crypto/x509" "encoding/base64" + "errors" "fmt" "net" "net/http" @@ -29,6 +31,7 @@ import ( "github.com/nats-io/prometheus-nats-exporter/collector" "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/collectors" "github.com/prometheus/client_golang/prometheus/promhttp" "golang.org/x/crypto/bcrypt" ) @@ -73,9 +76,11 @@ type NATSExporterOptions struct { // NATSExporter collects NATS metrics type NATSExporter struct { sync.Mutex + registry *prometheus.Registry opts *NATSExporterOptions doneWg sync.WaitGroup - http net.Listener + http *http.Server + addr string Collectors []prometheus.Collector servers []*collector.CollectedServer mode uint8 @@ -131,7 +136,7 @@ func (ne *NATSExporter) createCollector(system, endpoint string) { } func (ne *NATSExporter) registerCollector(system, endpoint string, nc prometheus.Collector) { - if err := prometheus.Register(nc); err != nil { + if err := ne.registry.Register(nc); err != nil { if _, ok := err.(prometheus.AlreadyRegisteredError); ok { collector.Errorf("A collector for this server's metrics has already been registered.") } else { @@ -234,7 +239,7 @@ func (ne *NATSExporter) InitializeCollectors() error { func (ne *NATSExporter) ClearCollectors() { if ne.Collectors != nil { for _, c := range ne.Collectors { - prometheus.Unregister(c) + ne.registry.Unregister(c) } ne.Collectors = nil } @@ -247,6 +252,27 @@ func (ne *NATSExporter) Start() error { if ne.mode == modeStarted { return nil } + // Since we are adding metrics in runtime, we need to use a custom registry + // instead of the default one. This is because the default registry is + // global and collectors cannot be properly re-registered after being + // modified. + if ne.registry == nil { + ne.registry = prometheus.NewRegistry() + } + if err := ne.registry.Register(collectors.NewGoCollector()); err != nil { + if errors.As(err, &prometheus.AlreadyRegisteredError{}) { + collector.Debugf("GoCollector already registered") + } else { + return fmt.Errorf("error registering GoCollector: %v", err) + } + } + if err := ne.registry.Register(collectors.NewProcessCollector(collectors.ProcessCollectorOpts{})); err != nil { + if errors.As(err, &prometheus.AlreadyRegisteredError{}) { + collector.Debugf("ProcessCollector already registered") + } else { + return fmt.Errorf("error registering GoCollector: %v", err) + } + } if err := ne.InitializeCollectors(); err != nil { ne.ClearCollectors() @@ -323,7 +349,9 @@ func (ne *NATSExporter) isValidUserPass(user, password string) bool { // auhtorization has been specificed. Otherwise, it checks // basic authorization. func (ne *NATSExporter) getScrapeHandler() http.Handler { - h := promhttp.Handler() + h := promhttp.InstrumentMetricHandler( + ne.registry, promhttp.HandlerFor(ne.registry, promhttp.HandlerOpts{}), + ) if ne.opts.HTTPUser != "" { return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { @@ -369,6 +397,7 @@ func (ne *NATSExporter) startHTTP() error { path = "/" + path } + var listener net.Listener // If a certificate file has been specified, setup TLS with the // key provided. if ne.opts.CertFile != "" { @@ -378,11 +407,11 @@ func (ne *NATSExporter) startHTTP() error { if err != nil { return err } - ne.http, err = tls.Listen("tcp", hp, config) + listener, err = tls.Listen("tcp", hp, config) } else { proto = "http" collector.Debugf("No certificate file specified; using http.") - ne.http, err = net.Listen("tcp", hp) + listener, err = net.Listen("tcp", hp) } collector.Noticef("Prometheus exporter listening at %s://%s%s", proto, hp, path) @@ -401,12 +430,13 @@ func (ne *NATSExporter) startHTTP() error { MaxHeaderBytes: 1 << 20, TLSConfig: config, } + ne.http = srv + ne.addr = listener.Addr().String() - sHTTP := ne.http go func() { for i := 0; i < 10; i++ { var err error - if err = srv.Serve(sHTTP); err != nil { + if err = srv.Serve(listener); err != nil { // In a test environment, this can fail because the server is // already running. @@ -451,10 +481,13 @@ func (ne *NATSExporter) Stop() { return } - if err := ne.http.Close(); err != nil { + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + if err := ne.http.Shutdown(ctx); err != nil { collector.Debugf("Did not close HTTP: %v", err) } ne.ClearCollectors() + ne.registry = nil ne.doneWg.Done() ne.mode = modeStopped } diff --git a/exporter/exporter_test.go b/exporter/exporter_test.go index 0cc1ce3..a2e668f 100644 --- a/exporter/exporter_test.go +++ b/exporter/exporter_test.go @@ -1,4 +1,4 @@ -// Copyright 2017-2023 The NATS Authors +// Copyright 2017-2024 The NATS Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -157,7 +157,43 @@ func TestExporter(t *testing.T) { } defer exp.Stop() - if err := checkExporter(exp.http.Addr().String(), false); err != nil { + if err := checkExporter(exp.addr, false); err != nil { + t.Fatalf("%v", err) + } +} + +func TestExporterRestart(t *testing.T) { + opts := getDefaultExporterTestOptions() + opts.ListenAddress = "localhost" + opts.ListenPort = 0 + opts.GetVarz = true + opts.GetConnz = true + opts.GetHealthz = true + opts.GetSubz = true + opts.GetGatewayz = true + opts.GetLeafz = true + opts.GetRoutez = true + opts.GetStreamingChannelz = true + opts.GetStreamingServerz = true + + s := pet.RunServer() + defer s.Shutdown() + + exp := NewExporter(opts) + if err := exp.Start(); err != nil { + t.Fatalf("%v", err) + } + + if err := checkExporter(exp.addr, false); err != nil { + t.Fatalf("%v", err) + } + exp.Stop() + + if err := exp.Start(); err != nil { + t.Fatalf("%v", err) + } + defer exp.Stop() + if err := checkExporter(exp.addr, false); err != nil { t.Fatalf("%v", err) } } @@ -181,11 +217,11 @@ func TestExporterHTTPS(t *testing.T) { defer exp.Stop() // Check that we CANNOT connect with http - if err := checkExporter(exp.http.Addr().String(), false); err == nil { + if err := checkExporter(exp.addr, false); err == nil { t.Fatalf("Did not receive expected error.") } // Check that we CAN connect with https - if err := checkExporter(exp.http.Addr().String(), true); err != nil { + if err := checkExporter(exp.addr, true); err != nil { t.Fatalf("Received TLS error: %v", err) } } @@ -254,7 +290,7 @@ func TestExporterDefaultOptions(t *testing.T) { } defer exp.Stop() - if err := checkExporter(exp.http.Addr().String(), false); err != nil { + if err := checkExporter(exp.addr, false); err != nil { t.Fatalf("%v", err) } } @@ -279,7 +315,7 @@ func TestExporterScrapePathOption(t *testing.T) { } defer exp.Stop() - _, err := checkExporterFull("", "", exp.http.Addr().String(), + _, err := checkExporterFull("", "", exp.addr, "gnatsd_varz_connections", "/some/other/path/to/metrics", false, http.StatusOK) if err != nil { t.Fatalf("%v", err) @@ -302,7 +338,7 @@ func TestExporterScrapePathOptionAddsSlash(t *testing.T) { } defer exp.Stop() - _, err := checkExporterFull("", "", exp.http.Addr().String(), + _, err := checkExporterFull("", "", exp.addr, "gnatsd_varz_connections", "/elsewhere", false, http.StatusOK) if err != nil { t.Fatalf("%v", err) @@ -323,7 +359,7 @@ func TestExporterWait(t *testing.T) { t.Fatalf("%v", err) } - if err := checkExporter(exp.http.Addr().String(), false); err != nil { + if err := checkExporter(exp.addr, false); err != nil { t.Fatalf("%v", err) } @@ -360,7 +396,7 @@ func TestExporterNoNATSServer(t *testing.T) { } defer exp.Stop() - if err := checkExporter(exp.http.Addr().String(), false); err == nil { + if err := checkExporter(exp.addr, false); err == nil { t.Fatalf("Expected an error, received none.") } time.Sleep(2 * opts.RetryInterval) @@ -371,7 +407,7 @@ func TestExporterNoNATSServer(t *testing.T) { time.Sleep(opts.RetryInterval + (500 * time.Millisecond)) - if err := checkExporter(exp.http.Addr().String(), false); err != nil { + if err := checkExporter(exp.addr, false); err != nil { t.Fatalf("%v", err) } } @@ -464,12 +500,12 @@ func TestExporterBounce(t *testing.T) { if err := exp.Start(); err != nil { t.Fatalf("Got an error starting the exporter: %v\n", err) } - if err := checkExporter(exp.http.Addr().String(), false); err != nil { + if err := checkExporter(exp.addr, false); err != nil { t.Fatalf("%v", err) } // test stop exp.Stop() - if err := checkExporter(exp.http.Addr().String(), false); err == nil { + if err := checkExporter(exp.addr, false); err == nil { t.Fatalf("Did not received expected error") } @@ -480,7 +516,7 @@ func TestExporterBounce(t *testing.T) { t.Fatalf("Got an error starting the exporter: %v\n", err) } defer exp.Stop() - if err := checkExporter(exp.http.Addr().String(), false); err != nil { + if err := checkExporter(exp.addr, false); err != nil { t.Fatalf("%v", err) } } @@ -511,7 +547,7 @@ func TestExporterStartNoServersConfigured(t *testing.T) { t.Fatalf("Got an error starting the exporter: %v\n", err) } defer exp.Stop() - if err := checkExporter(exp.http.Addr().String(), false); err != nil { + if err := checkExporter(exp.addr, false); err != nil { t.Fatalf("%v", err) } } @@ -547,7 +583,7 @@ func testBasicAuth(opts *NATSExporterOptions, testuser, testpass string, expecte } defer exp.Stop() - _, err := checkExporterFull(testuser, testpass, exp.http.Addr().String(), + _, err := checkExporterFull(testuser, testpass, exp.addr, "gnatsd_varz_connections", "/metrics", false, expectedRc) return err } @@ -615,7 +651,7 @@ func TestExporterPrefix(t *testing.T) { } defer exp.Stop() - if _, err := checkExporterForResult(exp.http.Addr().String(), "test_varz_connections"); err != nil { + if _, err := checkExporterForResult(exp.addr, "test_varz_connections"); err != nil { t.Fatalf("%v", err) } } @@ -638,7 +674,7 @@ func TestExporterGatewayz(t *testing.T) { } defer exp.Stop() - _, err := checkExporterForResult(exp.http.Addr().String(), "gnatsd_gatewayz_inbound_gateway_conn_in_msgs") + _, err := checkExporterForResult(exp.addr, "gnatsd_gatewayz_inbound_gateway_conn_in_msgs") if err != nil { t.Fatalf("%v", err) } @@ -662,7 +698,7 @@ func TestExporterAccstatz(t *testing.T) { } defer exp.Stop() - _, err := checkExporterForResult(exp.http.Addr().String(), "gnatsd_accstatz_current_connections") + _, err := checkExporterForResult(exp.addr, "gnatsd_accstatz_current_connections") if err != nil { t.Fatalf("%v", err) } @@ -686,7 +722,7 @@ func TestExporterLeafz(t *testing.T) { } defer exp.Stop() - _, err := checkExporterForResult(exp.http.Addr().String(), "gnatsd_leafz_conn_in_msgs") + _, err := checkExporterForResult(exp.addr, "gnatsd_leafz_conn_in_msgs") if err != nil { t.Fatalf("%v", err) } @@ -722,7 +758,7 @@ func TestExporterReplicator(t *testing.T) { } defer exp.Stop() - resp, err := checkExporterForResult(exp.http.Addr().String(), "replicator_server_start_time") + resp, err := checkExporterForResult(exp.addr, "replicator_server_start_time") if err != nil { t.Fatalf("%v:\n%s", err, resp) } diff --git a/go.mod b/go.mod index ee3496b..373c81a 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/nats-io/prometheus-nats-exporter -go 1.20 +go 1.21 require ( github.com/nats-io/nats-replicator v0.1.0 diff --git a/go.sum b/go.sum index 69689cd..4b9c1b6 100644 --- a/go.sum +++ b/go.sum @@ -27,6 +27,7 @@ github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9 github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI= +github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= @@ -42,6 +43,7 @@ github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-hclog v0.9.1/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= @@ -76,6 +78,7 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= diff --git a/test/certs/ca.pem b/test/certs/ca.pem index 900f798..d51ab66 100644 --- a/test/certs/ca.pem +++ b/test/certs/ca.pem @@ -1,26 +1,26 @@ -----BEGIN CERTIFICATE----- -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 -aj3g4sbHN05bULFI +aW5mb0BzeW5hZGlhLmNvbTESMBAGA1UEAwwJbG9jYWxob3N0ghQeMnUw8FrY5ofn +WhnTyAbvdc+yhjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQArNp35 +NVFc4NoF8JrxIQ+KDV6jVXHaJfEhZJT1u/O0/JeQulnKRIHEK55FUiaMTwIT29AU +Xt/kqa4qVn6dhrqwuUaWO7ftbZq6aLZ3XXrOwuMkVDwtzwFAf/ss0K7dQB/MMA9e +8CmM+7u8kTY8WiwifLC+1B7H1a0gZ4xxNvajiVHPsQak59vC1JdSkMsnak7+HSht +4CMIamWjvZqE1RJmV1727zPHeQR7LR2tC3a8cDIGO4AK9mkQTFpgH8zGXbjyi+tl +3VKy1pc3hulntKZduaOKQV73uKMz/MSA5e9DoQIqz+yQrNq8N00FYfko9Z7KZ5rU +WqtmJGA6fzWfjK0Y -----END CERTIFICATE----- diff --git a/test/certs/client.key b/test/certs/client.key index 975fb5e..2d9c0c9 100644 --- a/test/certs/client.key +++ b/test/certs/client.key @@ -1,28 +1,28 @@ -----BEGIN PRIVATE KEY----- -MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDUqObxKJVxIqCO -G/jKIMMybY/eiJ3+ZqK3yIjDm8cMiGXgpWIvR03BUmPQPG8T5TJxNFWUueIym/Oy -Ep6iXItYyDGjCxiqQznhzqDY6jHWcsfOWU32TQ/kbXIyLQkZ2+RZNIR4JyKL55zn -HepIaNcIzSImZx9FwV8qAHzp0NX976g/L+JQdJog0qO6vyoRR35yn7F5dxCzHHV5 -aeeueYKDuT6kbba86XpXQH7bvuJh6dFXXpRkhPSt/PAkUy/dGC76dAzAxGZ/y8nR -bd3T6H9sxtI8wqTBhACLASOyTfo6tjNI22cZD1YL+yRDei1c5bAbMFNCw0SIcMiO -8qE4dEtfAgMBAAECggEAC9SxtGzrk3W3tPA9cRFNirqprFmxYHvZRZw0b510/29/ -K3ZH9hVjcAPjZaxXCaZQnhepQzLsMKCYeCmtBZ9caT4J9OYjIyXGTJewPyEYULPm -BcbWHYPABJdKKRx0Syn+lC/lxsF2nI3wHrN9WzXp8KVo5vYJuVm+r5mDWYaywQPA -LIDIcvgLt7cjPt5Q3k3lJuweve63TFTl9y5Ln1ihozGs4AUdmuPzh0n4LhcVrqHS -07ZVoA5dEMc9GQIlw64tyHPCVYeUaGoxgi/qHamPqAZMTaM3PDq3JjZeNec5U2Vu -VtkAPzkDA1NokPx6amDtixQ/ynxwxWY7WM7SG8ZPEQKBgQD97hobnajZ+P1+yyXC -J9gESdUpWuVorrXSKAhjCoWzm1W6cSe1sFvC0OOCy6F853RkRrQJOJreIUK7DtB8 -o+eENlyQLFMcwDXMMi/nhr0LmvlMuER60vpwQ/cL9Wo1LYTXMMJKBvA5ZqXl1wqr -g0yyRbhIyjZNQAVVUz2iLB1kbQKBgQDWZK2DB5RfssvO/l/9SJeJjIvItmjYiBvE -3+WatniVfCrHWKC/MBzshP6DklfUk6FHCq/JNpZ0anENm0A5NCOBJ6/vo+VJL+LP -ZQFGp+ioFnmpwKE1oFKPOrc16SoJrV4swBidi+yuhtSelsV9t6kBfAfrGpaRM/y9 -lkVupYRXewKBgAQMiOQJ1ohrPPeJm7eF1R70Ym6/YUsTBhksxD14DHu5rVtEtKJk -BoKLvCT4xEFum1+B9Rr0iRujoiHDcbWbE3T7POybmFOsCO+RmUvyzQ7jULhVc9oV -hSLHIqhRKHlimWyo/WAazjfMGDca/7OOa2moTPD0MHt42tzqb+AnHezdAoGBAIHb -Axl9Ksp4EmgyvNM998MxZK1Shti4QBGUB48Y/JqWVZbewKZsrug3ea0Zo6c3MBVG -jMiUDrc+jXFPWqwLP4IIFtFQdR1KKtexdv9jzlCZJGHEMiC4Fal5R+UYcATihEsY -oxAx406mjfvsmHwYFP64MFefiBk04t22OiHVkP4nAoGBAJNr3L6bIPoHhj74E+vv -c/ELqJojPm9SBz5JIdsWByJf+y6XxnLl9wZKXpUleq6wsta5HGdMagQfFlzwnc4I -QhLsvP1HYI9BOqePNqFIQKczaFwj4b5Jr3CsSC1adDgYLKj46BC+zmGRHLDB4NlD -xurhG/szD3cSIsGnQyVyeP2n +MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDSFiiEXS0noRic +G9ZRlg0ehBR+t9ueAVo1hqAWs0DQDB4LF7tlyPGBF5I+zncWGxp9deIG7RLitGiK +k8ZZNPW93e/pro5oDCueizs9sxJ0r6hHWvkNvha76rz5SGxGx0z0avPDxr8k8AqN +PzELaYaiJFu9tDCS76ZBnFlbIZSFqEru6t00VSFseyRU4axlYUh7TqDUOm9cyXu8 +HlWZbq8xUJQDWL6e0gNjD6uPm3Pn8aHhLGabPaGNjvKDaqF8nnDCxpcMwuVyQ6td +OqxPGUWcbYOAhLIvH5ZdtmDi87mxYNO6GQv76uxOluc6pu614xe/jOlCUDl3d/tt +eWIzd/XLAgMBAAECggEAINl9IWFOZ7VtWy+RHfW3/G8Lo1rNWNH+UINJ8fK6bi2O +3w4pa7t1Y8mTQQXYohi/1iFCI/Ia817hP9XmfFlnGXakBmaYdtV8VpCPxVCEUMGM +rwefDNKNzHlibhowcArG0isNDa48giKUi8x3N0EbX6wOukV8GOWnGfhAEptYFWPY +AY/aneqRv6RAOoYBvVZjB7XVb2xMIqx6XVr1D6jL+tl2Elwv4WdnrM6oo4o4fxiH +otH4Mib5727tORDrln94duJS9F3GgwYTy2I/587Zc8wVQTAHxO9XJ7IxfzULlJxm +u7ssSho3FLVbUKTJ1/5jUApx5CiN0AK93nS7i4d7XQKBgQD6l1D36EhEYC0EL1um +8122nXoaYXNwatv/dHzYqOPrDleruscSYXwKG3KDaVon5B7usDtqY/h8k0x+kQpd +ouKbkNLrYdYGtNe71gq/vcpSBKAPlDmJ9dXkAv6eOrve3aRD4OaKXdQW6pVYqPq5 +Sk04vFU6FBgo5w9yHrTJM1JzVwKBgQDWnwb/siu5aAm6mgHfvUfZHKZq9kmmEsaZ +uZOpqpv80QJAor8bx9b6L6+B2pBjWji7YF3RTolHpFalj4UVj7yIgUL0PBnHGYoX +1kc2WYFiEiZJVb8pJiL8PKGSYef39t+wqJkEqie92OjWQQd3lvkNp7pj6HixbqG4 +9JGo8eGcrQKBgQDLnBtb806U0BiDp/8uXdutP7MwsDHeC9WJcRrn6AKYwOSXUoHh ++3ePttGK2RU6CG7hvivovCXxArZKuIrVnj3F7RyTyMDgXhxUMQw2030Ku1tajTNb +V3Zdd9lus4ZnBWwtAxYPI0HrBNwoV9SwrSClktElCaK/yU6RiUWXna3GrQKBgF/+ +l0HM7nOqThexhL8PSVCZ2PGkoUJvyXa+o4ZS8hw9XBWO9Y22b7hNleGt4cEefJuK +ucvBpfNuVPcOX4dKWBhyQIE/VIRSLwsEY6uykwVLeuZ4PN1p2mIZuGbh9cBaIqlA +b9i/RrFKkLIsOevKkjECYYMIWtt50UoJ0hDPx4qtAoGAVSMUVSFCP3Fbi8T6FpCP +CMbkX0Ac6VdW9kWsagz+K/74wy8ZrSqYlcJfk/vIKxnhuZmpgt16x+3muScmNuUe +PxPT2j8lI5fhvpPyVw5wzuSLifNN4/rqpujWrKphxOTsXyZyUZ7K6rmslafSMPsS +EMS3Pn+efrYqxf27C0UBwsc= -----END PRIVATE KEY----- diff --git a/test/certs/client.pem b/test/certs/client.pem index 2bace1a..745704c 100644 --- a/test/certs/client.pem +++ b/test/certs/client.pem @@ -1,27 +1,27 @@ -----BEGIN CERTIFICATE----- -MIIEgDCCA2igAwIBAgIUK13Pmbtc+7+8s9zi6jxEOK+625gwDQYJKoZIhvcNAQEL +MIIEgDCCA2igAwIBAgIUHVBHE5ugUlxsiYWnhAQ7/qqRUqgwDQYJKoZIhvcNAQEL BQAwczELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMRAwDgYDVQQKDAdTeW5hZGlh MRAwDgYDVQQLDAdOQVRTLmlvMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHN5bmFkaWEu -Y29tMRIwEAYDVQQDDAlsb2NhbGhvc3QwHhcNMjMxMDI1MTc1ODA2WhcNMjMxMTI0 -MTc1ODA2WjBzMQswCQYDVQQGEwJVUzELMAkGA1UECAwCQ0ExEDAOBgNVBAoMB1N5 +Y29tMRIwEAYDVQQDDAlsb2NhbGhvc3QwHhcNMjMxMjIwMjMyNjA4WhcNMjQwMTE5 +MjMyNjA4WjBzMQswCQYDVQQGEwJVUzELMAkGA1UECAwCQ0ExEDAOBgNVBAoMB1N5 bmFkaWExEDAOBgNVBAsMB05BVFMuaW8xHzAdBgkqhkiG9w0BCQEWEGluZm9Ac3lu YWRpYS5jb20xEjAQBgNVBAMMCWxvY2FsaG9zdDCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBANSo5vEolXEioI4b+MogwzJtj96Inf5morfIiMObxwyIZeCl -Yi9HTcFSY9A8bxPlMnE0VZS54jKb87ISnqJci1jIMaMLGKpDOeHOoNjqMdZyx85Z -TfZND+RtcjItCRnb5Fk0hHgnIovnnOcd6kho1wjNIiZnH0XBXyoAfOnQ1f3vqD8v -4lB0miDSo7q/KhFHfnKfsXl3ELMcdXlp5655goO5PqRttrzpeldAftu+4mHp0Vde -lGSE9K388CRTL90YLvp0DMDEZn/LydFt3dPof2zG0jzCpMGEAIsBI7JN+jq2M0jb -ZxkPVgv7JEN6LVzlsBswU0LDRIhwyI7yoTh0S18CAwEAAaOCAQowggEGMB0GA1Ud -DgQWBBTnC5a8jh5V67iSWb4PqvsxnURy1zCBsAYDVR0jBIGoMIGlgBRIl/inf0W8 -VhYjMCixWroGfc7sj6F3pHUwczELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMRAw +ggEPADCCAQoCggEBANIWKIRdLSehGJwb1lGWDR6EFH63254BWjWGoBazQNAMHgsX +u2XI8YEXkj7OdxYbGn114gbtEuK0aIqTxlk09b3d7+mujmgMK56LOz2zEnSvqEda ++Q2+FrvqvPlIbEbHTPRq88PGvyTwCo0/MQtphqIkW720MJLvpkGcWVshlIWoSu7q +3TRVIWx7JFThrGVhSHtOoNQ6b1zJe7weVZlurzFQlANYvp7SA2MPq4+bc+fxoeEs +Zps9oY2O8oNqoXyecMLGlwzC5XJDq106rE8ZRZxtg4CEsi8fll22YOLzubFg07oZ +C/vq7E6W5zqm7rXjF7+M6UJQOXd3+215YjN39csCAwEAAaOCAQowggEGMB0GA1Ud +DgQWBBRaWpG6YP120ur3+97vateo3MOBODCBsAYDVR0jBIGoMIGlgBQQjPiD1pUn +dxIqLXXKN1fF/7H1xqF3pHUwczELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMRAw DgYDVQQKDAdTeW5hZGlhMRAwDgYDVQQLDAdOQVRTLmlvMR8wHQYJKoZIhvcNAQkB -FhBpbmZvQHN5bmFkaWEuY29tMRIwEAYDVQQDDAlsb2NhbGhvc3SCFGqm4FiVxaDy -QnAlVchoQoPERsBXMAkGA1UdEwQCMAAwCwYDVR0PBAQDAgWgMBoGA1UdEQQTMBGC -CWxvY2FsaG9zdIcEfwAAATANBgkqhkiG9w0BAQsFAAOCAQEAV3ejVAIPdftJX/v4 -fK3E41doh8Fk3gFiQjz2YPxcPzceWDcY1ojjVKAbqG9LjPEJLp9/Tct2Qlsk7Wq/ -IkA6nwSxjgdIUAZFJW/dmU81cPVijwxnK9xYjcWL3DqIxvUoCL7mfg3xVJxomGaw -3YcyQNBs4JxCSMyXh7FnQF88ywbzWilZABsC02SdKBr/kKWOjFOzj+s/Pt3RmM5o -HGFYVsbDSz546zWx20ar8N72hcOhqBSMKym6pSVVMosK6HqMJogfflUVKtYLvp0G -bHtMOtPu3M6yruz1gx9e+xYQAA03kLymG+bU3XWd5RhVDUXE0V48XDzGRdiqHDY/ -WJXNfw== +FhBpbmZvQHN5bmFkaWEuY29tMRIwEAYDVQQDDAlsb2NhbGhvc3SCFB4ydTDwWtjm +h+daGdPIBu91z7KGMAkGA1UdEwQCMAAwCwYDVR0PBAQDAgWgMBoGA1UdEQQTMBGC +CWxvY2FsaG9zdIcEfwAAATANBgkqhkiG9w0BAQsFAAOCAQEAZBKWXQiw4Z9PNfYx +7fCwK40ucs6wpX6mvaMCsQcPLp2AIy54ko2TF1C0udQ8aSoTL6nooj5OdCfuzMGu +0C9kHEJKR2FcQkslWuJKkU9aGYYlloakUOGHEtUrTTMS1p4MCazVQ9s/nmwhvHbi +A2R0ckvmyV97PJyxeP5xnMZMKcFIwra3gz17qdJx/cBkGJBOcM4uWcFa7n0g0hEK +QB/ZOB2FwVfBGcQgaDo7h4tv3BKWg8jy6fk6dbzZbf6L4rzMKlZvnGr8ebtQTywj +Qu5ys5iLPxL3qvOnfN48RGkc07O9cSlTTafVcM3FZvE9VVOKF2JVGA1RqavL6lrS +6RfbMg== -----END CERTIFICATE----- diff --git a/test/certs/server.key b/test/certs/server.key index bc55d23..1a5534e 100644 --- a/test/certs/server.key +++ b/test/certs/server.key @@ -1,28 +1,28 @@ -----BEGIN PRIVATE KEY----- -MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC7fsEtlZ6FpkIU -2xSsoipvBhig1Yj/aEgBBTLDOA1BxZCqfuQ0kFbdFqAreBh0HMgGhXmKr89jlE/B -Sidt92bAXKJS9wuIwsBC3gFpE4RoHdDLcA7XWruc0uAd3ocJvqrNV5iALh38Mt+T -WZw22drxLEDovmFtK7kWMww70csMNQpeNf6YKhECFlYUui9+7snOvRYBlpcf0IRh -XfRWMGgPhAXWkyWSJPSF3XU18Wk7FiokLXBCJ2ZFR497BWyGnSAnhB7EYfTrOgTE -KvIp0ESUv01wP5BUWRKeSN9wZqreup7OYJv8mZ4n37FLJmj0DsqBFU2mlS1acAtd -DDuCyouvAgMBAAECggEAWot2/O2RVVeZ9/povIm/1kfqYtlcRIN2qk95WT9bX5Tq -LPwEdsHxwOkpRnTD0mcHzeZtcKVAkQVRkrWd3wQn8eOKXGiDgHMUZ/ZQVg8f1Sv4 -5hXihOuDSNOpeaM6MWGLmIih09zxjBaBU+ZlgzOoAOnvGra90/vWcTsLwGOrG+Q5 -O/sludRDvp70l/UJfKgD4N9T13L5q5TMW08cUwj+NeJ/faGQA2ifaVobPHj6uhmc -YT7A386kdFoYw1Xqf+N1B3BBvXP9z/t3N4jmPt5q5SB7m9QqWKqN9ye7r+cNRl9s -Quw5DePPrA4+dJ9XNhmt3GR1or/2wotZtG87whDgUQKBgQDsWFbtu9b5eQWFNY0U -EXKA/lIJqgchOGcQ7m+v7PJH511EsoBYYY4SEMTEaic7LGZeYeKc364aA6UHCjdi -/eAkY4hON1DuGIfE2CRO/+WyG48i0T6D/+j6ikXS8cSTkNkFWkMLWEt091GQf+vr -9xrkDZdDDJS4mjQl76J7OVrpOQKBgQDLFm0Ge6Xyu47UEUnwmbHDQxtDa4I35j5M -UqtLql7ZwOrYqXCb/IA+51RMu96R6XnQ5X5LFcvwMMoqsmpBjub03eGlbJ/zxjii -VmRGMZ6Wrub9bUjXnfLwsk+HafG/UdryA6NLyilgfkvtBN7P3qMYG3O8dGicRK+Y -ZGL2j00kJwKBgQCW2dOyLaCK3undGk8PrgsttiXasUGXvI5cSjPTUCNcLZpkTKKK -xsmNUlKlIzQjGrXELCoeAs73H7hng+fSMUStNTI86iWnstSFmYejPMX5Jon3qSKD -0gV8VGE4wMO9hEhgmDoOta6D24+d8Wg91hy9zsbrLs6F/TanuAo3KGaUUQKBgAeC -Kb++nJEP3CT9CqXJmOfmOEDS3bqhWZZKzCh9AQq99jDSeuZZfIhW1ygLHhx47FcL -1RKDmMmllCPl+sW3udQ9y9To4jUKFBf0Z7qspPdfOg0OmE3Yeh3qCcSw5w4ywYyH -E+d+bu8xXC9EKdS3n4IJqcrC5wc4BuH0fDAvdiOrAoGAYmNJBxvXqBEMT1ZxnKt+ -WM/1j0kIP+6+E/u8+nywaDWPa+Z5EcI06zBCi2f6v+MYIi5zJ8gsipMpcVCo6WAs -167z0ikKaMXWYU4NjdGE3duPRybN0d/b/llN/LTVeHl8dlery/Y71zq/xUUmNGHw -+Q3XFhBYf4swaTkqiw5eg4E= +MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCze9/Z3zNfYYkg +jmmaRzay7ykYnzSST0cWSjzB66Q41rs/x0HleVXhMwGymh1TvuvCuSFbjC8FEuJ2 +pKIF8G/HY5hR3WxicBqHPllcL28BPCY+DXXiNqtEFrH/jdSTwSdlOnuUSboBO/h1 +HIhrnZhmVITYaLectgAHyKD3YI9Nepr/ydcqTMi41hQ2Kh69Uyp9u1QkeVR4MYwL +wqXntq3I9mBOMlOHr94B/vUH+QJiMwWcpKCJKQFBd+WDR1a15bUtpEJebpfGGBRn +S2FmB4Won5WU7su0tMP+weVSS6z1XK9T1QbKmC7KylLeytHfFr/b2tPwJZoZGC9a +eIa/1ZyJAgMBAAECggEAA6aQXgkZLWZ5eI0M/tNV/Hu61UJful4cbwqhg7w8Qd+0 +PU7bO0Slh4gXD7/sushWWUaUtBz809iXfJxKo15Jl7+h2IBtdO8cywVsoeBhHKBR +ks+JR0mfYCoqAq2q1jqGh5uR6ek5/E5w9kjXSYESGXq8nP48Rda5126wP3faUlQU +XGJrmFjjgj+UM9U/VYT4w2yT8QRVDEnkP24HEqqqJp5H9+9gHN2LrxxgDwnvSGa1 +ldN+AaWJ4vX9y7Rnw5VAWHxXW7PuaBXx3Ui/R9fktP3KtThY+VrSN33lsqVjRACO +6YXUn2ydHl9kqOAe4bs/Ay31nZb16Hey7C7odQHjEQKBgQDaA5QAyH5l036bVV7i +vaP+oxEpYXMGLsHjG20jDbzxeGbEDsorvVFxUqVQgmcF6BuPx9IDc+Gbsu4tVbRI +02Y5yKXlhkuq1xOtWAymSMDKslhwrAMu5ab5QeIgw4bgNAYsS2G7TUbTZsmvfIa1 +8M4KLHDmaV2FyTyAuZKg5ggYFQKBgQDSwa18vYMhkr6D8BJCkrv79Us5oJhxHtAo +NHVLaIaKtkNyVvZ0LepScLsrpOAWh+utCdAmLcGg/ujUd6qWDI21DzVRgUZu8mgV +x35h5AM3PT1oUP/ura1GKiCkw/MZsQw0qW+eNplFTsdm1k4kaMk9MHm3EkoxOp3E +i2vTC9x7pQKBgEvKGKaZDI/bkVTwvba3VI6OI8Yt8W3BzXdlLnCUMw4C3D7mIVRJ +UUnDAGNXofcEtKgsQA8hNtoIvxIVjEIQ86W84idDo4R1loqZZHReMF+G1oX81nJ0 +NbLLO5BGSNoiW88EOaqCd8/AGPcfpDkVyJryziDbmj6LMbRSTu4OadvtAoGAVkL/ +hzbqHSu63rW8Q5Nbbd0QVR3uRx6dhFc0SxEVQGEpafs+FH9WkTei5FIvhglL5R9H +GtlPj13GXnA8Wf35Yko/QITxFygQghmNGPQCfPGL2M6OclqTuUw04DtznOhiXoub +K96dDUkZRHYitbRN6cWVi+DojQ241WFbWJ5aOCECgYBBdgxWxy9CsHiGgRobSw0a +TGPKKhFu9xs4j4etMfCJQyjXc7wLNqyp6A39+gPRYP+kY5HF+K+DstfO1rKaxJPn +O3kY9GHqoBevTssh28Jz9mCXzNGGuX23acwwjIY0O15fhH6EjFIsIcdp9WXVTH0s +K7PFqcDbsGO6vaqiyF6OFg== -----END PRIVATE KEY----- diff --git a/test/certs/server.pem b/test/certs/server.pem index 765b90e..eac81a3 100644 --- a/test/certs/server.pem +++ b/test/certs/server.pem @@ -1,27 +1,27 @@ -----BEGIN CERTIFICATE----- -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 -YGojNw== +FhBpbmZvQHN5bmFkaWEuY29tMRIwEAYDVQQDDAlsb2NhbGhvc3SCFB4ydTDwWtjm +h+daGdPIBu91z7KGMAkGA1UdEwQCMAAwCwYDVR0PBAQDAgWgMBoGA1UdEQQTMBGC +CWxvY2FsaG9zdIcEfwAAATANBgkqhkiG9w0BAQsFAAOCAQEAfKBvj/60EV3ypj4i +CVpo9ExjJXCJ78hkebIRfKbbdyETdD3ztUuWvfIv0kL6VrBfMEn+6Mnf+qI+RGwc +qs0bor79tdBpTAjm3wIM6LRHUIKDdtIwNnUQRIYBYR9NIdmu8sI9DD80N7E9WkbE +7p6Q2nmSGGBkYKrqhv4vqRwjg0Sxu1NAyCug9xPX1xG22tA5q7spjIqK4eQ+M/Wy +iOSH+36xVduZXC/dsed4vk7mmGpce36cXyJz2v6qETc87S62TM/zWkKQIcuCIfoH +UXFKJJTbURKh23RSUVyTDXhE1koFLwfIWlec3WktYNzTv/9PQfF/kDyfJqYl4/Bt +w/kOag== -----END CERTIFICATE-----