From 2424156678c46cd97b140b6ec5fca8b4e29bb2f5 Mon Sep 17 00:00:00 2001 From: Critter Date: Mon, 23 Dec 2019 16:46:41 -0500 Subject: [PATCH] added WithTLS and WithSecurityBuilder documented precedence order --- README.md | 2 +- clients/client_builder.go | 13 ++++++++++--- clients/client_builder_test.go | 19 ++++++++++++++++--- clients/client_config.go | 16 +++++++++++++--- clients/security_builder.go | 12 ++++++------ clients/security_builder_test.go | 8 ++++---- 6 files changed, 50 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 68d5d7d..23650ef 100644 --- a/README.md +++ b/README.md @@ -89,7 +89,7 @@ func main() { client, _ := clients.NewClientBuilder(). WithHost("localhost"). WithPort("443"). - WithSecurity(security). + WithTLS(security). Build() } diff --git a/clients/client_builder.go b/clients/client_builder.go index 9bed451..0043053 100644 --- a/clients/client_builder.go +++ b/clients/client_builder.go @@ -15,6 +15,7 @@ package clients import ( + "crypto/tls" "net/http" ) @@ -45,8 +46,14 @@ func (b *ClientBuilder) WithPort(port int) *ClientBuilder { return b } -// WithSecurity sets the TLS configuration of the client. -func (b *ClientBuilder) WithSecurity(security SecurityConfig) *ClientBuilder { - b.config.Security = security +// WithSecurityBuilder sets the TLS configuration of the client from a SecurityBuilder. +func (b *ClientBuilder) WithSecurityBuilder(builder *SecurityBuilder) *ClientBuilder { + b.config.Security = builder.Config + return b +} + +// WithTLS sets the TLS configuration of the client to a tls.Config. Takes precedence over WithSecurityBuilder. +func (b *ClientBuilder) WithTLS(config *tls.Config) *ClientBuilder { + b.config.config = config return b } diff --git a/clients/client_builder_test.go b/clients/client_builder_test.go index e7d8a27..7b279be 100644 --- a/clients/client_builder_test.go +++ b/clients/client_builder_test.go @@ -51,15 +51,28 @@ func TestClientBuilder(t *testing.T) { }) }) + Convey(".WithSecurityBuilder is invoked", func() { + + security := tests.MustGenerate(reflect.TypeOf(SecurityBuilder{}), t).Interface().(SecurityBuilder) + + builder.WithSecurityBuilder(&security) + + Convey("it sets the tls", func() { + So(builder.config.Security, ShouldResemble, security.Config) + }) + }) + Convey(".WithTLS is invoked", func() { - security := tests.MustGenerate(reflect.TypeOf(SecurityConfig{}), t).Interface().(SecurityConfig) + security := tests.MustGenerate(reflect.TypeOf(SecurityBuilder{}), t).Interface().(SecurityBuilder) + config, _ := security.Build() - builder.WithSecurity(security) + builder.WithTLS(config) Convey("it sets the tls", func() { - So(builder.config.Security, ShouldResemble, security) + So(builder.config.config, ShouldResemble, config) }) + }) Convey(".Build is invoked", func() { diff --git a/clients/client_config.go b/clients/client_config.go index 001d5af..203c1ad 100644 --- a/clients/client_config.go +++ b/clients/client_config.go @@ -34,14 +34,24 @@ type ClientConfig struct { // Security defines the TLS configuration used by the client. Security SecurityConfig `json:"security" mapstructure:"security" yaml:"security"` + + // config is the tls config passed by ClientBuilder.WithTLS. + config *tls.Config } // Build creates an http.Client from the ClientConfig instance. func (c *ClientConfig) Build() (*http.Client, error) { - configuration, err := c.Security.Build() - if err != nil { - return nil, errors.Wrap(err, "error building tls configuration for client") + var configuration *tls.Config + var err error + + if c.config != (&tls.Config{}) { + configuration = c.config + } else { + configuration, err = c.Security.Build() + if err != nil { + return nil, errors.Wrap(err, "error building tls configuration for client") + } } client := &http.Client{ diff --git a/clients/security_builder.go b/clients/security_builder.go index 6c8116a..92a7bae 100644 --- a/clients/security_builder.go +++ b/clients/security_builder.go @@ -18,7 +18,7 @@ import "crypto/tls" // SecurityBuilder provides an builder for client tls.Config instances. type SecurityBuilder struct { - config SecurityConfig + Config SecurityConfig } // NewSecurityBuilder returns a new instance of the SecurityBuilder structure. @@ -28,7 +28,7 @@ func NewSecurityBuilder() *SecurityBuilder { // Build creates a tls.Config from the SecurityBuilder. func (b *SecurityBuilder) Build() (*tls.Config, error) { - return b.config.Build() + return b.Config.Build() } // WithAuthorities sets the certificate authorities trusted by the built tls.Config. The values must be URLs that point @@ -38,7 +38,7 @@ func (b *SecurityBuilder) Build() (*tls.Config, error) { // "base64" scheme is supported for providing the PEM encoded certifiate in the path of the URL directly. This is most // applicable when the certificate data must be provided via an environement variable. func (b *SecurityBuilder) WithAuthorities(authorities []string) *SecurityBuilder { - b.config.Authorities = authorities + b.Config.Authorities = authorities return b } @@ -49,7 +49,7 @@ func (b *SecurityBuilder) WithAuthorities(authorities []string) *SecurityBuilder // "base64" scheme is supported for providing the PEM encoded certifiate in the path of the URL directly. This is most // applicable when the certificate data must be provided via an environement variable. func (b *SecurityBuilder) WithCertificate(certificate string) *SecurityBuilder { - b.config.Certificate = certificate + b.Config.Certificate = certificate return b } @@ -60,12 +60,12 @@ func (b *SecurityBuilder) WithCertificate(certificate string) *SecurityBuilder { // "base64" scheme is supported for providing the PEM encoded certifiate in the path of the URL directly. This is most // applicable when the certificate data must be provided via an environement variable. func (b *SecurityBuilder) WithKey(key string) *SecurityBuilder { - b.config.Key = key + b.Config.Key = key return b } // WithServer sets the server name used for certificate verification. func (b *SecurityBuilder) WithServer(server string) *SecurityBuilder { - b.config.Server = server + b.Config.Server = server return b } diff --git a/clients/security_builder_test.go b/clients/security_builder_test.go index c6b6633..c3594fa 100644 --- a/clients/security_builder_test.go +++ b/clients/security_builder_test.go @@ -48,7 +48,7 @@ func TestSecurityBuilder(t *testing.T) { builder.WithAuthorities(authorities) Convey("it sets the authorities", func() { - So(builder.config.Authorities, ShouldResemble, authorities) + So(builder.Config.Authorities, ShouldResemble, authorities) }) }) @@ -59,7 +59,7 @@ func TestSecurityBuilder(t *testing.T) { builder.WithCertificate(certificate) Convey("it sets the certificate", func() { - So(builder.config.Certificate, ShouldEqual, certificate) + So(builder.Config.Certificate, ShouldEqual, certificate) }) }) @@ -70,7 +70,7 @@ func TestSecurityBuilder(t *testing.T) { builder.WithKey(key) Convey("it sets the key", func() { - So(builder.config.Key, ShouldEqual, key) + So(builder.Config.Key, ShouldEqual, key) }) }) @@ -81,7 +81,7 @@ func TestSecurityBuilder(t *testing.T) { builder.WithServer(server) Convey("it sets the server", func() { - So(builder.config.Server, ShouldEqual, server) + So(builder.Config.Server, ShouldEqual, server) }) }) })