diff --git a/workhorse/cmd/gitlab-workhorse/channel_test.go b/workhorse/cmd/gitlab-workhorse/channel_test.go index 11b414cc526c0d06a6ff61d4e8bb267751977f0b..6e8ad945fd2dc4430a5c267ec79a4aa38e941e43 100644 --- a/workhorse/cmd/gitlab-workhorse/channel_test.go +++ b/workhorse/cmd/gitlab-workhorse/channel_test.go @@ -174,7 +174,7 @@ func webSocketHandler(upgrader *websocket.Upgrader, connCh chan connWithReq) htt func channelOkBody(remote *httptest.Server, header http.Header, subprotocols ...string) *api.Response { out := &api.Response{ Channel: &api.ChannelSettings{ - Url: websocketURL(remote.URL), + WsURL: websocketURL(remote.URL), Header: header, Subprotocols: subprotocols, MaxSessionTime: 0, diff --git a/workhorse/internal/api/block.go b/workhorse/internal/api/block.go index f6eefcdf2ccf1640f5e473f8a5244d79f470397a..afcbc358319280261b014b86ebf65291598e8a75 100644 --- a/workhorse/internal/api/block.go +++ b/workhorse/internal/api/block.go @@ -8,7 +8,7 @@ import ( "gitlab.com/gitlab-org/gitlab/workhorse/internal/helper/fail" ) -// Prevent internal API responses intended for gitlab-workhorse from +// Block method blocks internal API responses intended for gitlab-workhorse from // leaking to the end user func Block(h http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { diff --git a/workhorse/internal/api/block_test.go b/workhorse/internal/api/block_test.go index a28dd8d203c909339bf6d2a83d3fd8736174f5d2..46ced4b88903fd6a898a3c9e3cbf9906263eaf56 100644 --- a/workhorse/internal/api/block_test.go +++ b/workhorse/internal/api/block_test.go @@ -41,7 +41,7 @@ func TestBlocker(t *testing.T) { upstreamBody := []byte(upstreamResponse) n, err := bl.Write(upstreamBody) require.NoError(t, err) - require.Equal(t, len(upstreamBody), n, "bytes written") + require.Len(t, upstreamBody, n, "bytes written") rw.Flush() diff --git a/workhorse/internal/api/channel_settings.go b/workhorse/internal/api/channel_settings.go index fcd02bb6fdad526f3b16d19d2632b8d396a6a23e..6e8d2f13b07129e65b587206f6e5030060f3be17 100644 --- a/workhorse/internal/api/channel_settings.go +++ b/workhorse/internal/api/channel_settings.go @@ -1,3 +1,4 @@ +// Package api provides internal APIs for gitlab-workhorse. package api import ( @@ -11,13 +12,14 @@ import ( "gitlab.com/gitlab-org/labkit/log" ) +// ChannelSettings holds the configuration settings for establishing a websocket channel. type ChannelSettings struct { // The channel provider may require use of a particular subprotocol. If so, // it must be specified here, and Workhorse must have a matching codec. Subprotocols []string // The websocket URL to connect to. - Url string + WsURL string // Any headers (e.g., Authorization) to send with the websocket request Header http.Header @@ -31,10 +33,12 @@ type ChannelSettings struct { MaxSessionTime int } +// URL parses the websocket URL in the ChannelSettings and returns a *url.URL. func (t *ChannelSettings) URL() (*url.URL, error) { - return url.Parse(t.Url) + return url.Parse(t.WsURL) } +// Dialer returns a websocket Dialer configured with the settings from ChannelSettings. func (t *ChannelSettings) Dialer() *websocket.Dialer { dialer := &websocket.Dialer{ Subprotocols: t.Subprotocols, @@ -54,6 +58,7 @@ func (t *ChannelSettings) Dialer() *websocket.Dialer { return dialer } +// Clone creates and returns a deep copy of the ChannelSettings instance. func (t *ChannelSettings) Clone() *ChannelSettings { // Doesn't clone the strings, but that's OK as strings are immutable in go cloned := *t @@ -64,10 +69,13 @@ func (t *ChannelSettings) Clone() *ChannelSettings { return &cloned } +// Dial establishes a websocket connection using the settings from ChannelSettings. +// It returns a websocket connection, an HTTP response, and an error if any. func (t *ChannelSettings) Dial() (*websocket.Conn, *http.Response, error) { - return t.Dialer().Dial(t.Url, t.Header) + return t.Dialer().Dial(t.WsURL, t.Header) } +// Validate checks if the ChannelSettings instance is valid. func (t *ChannelSettings) Validate() error { if t == nil { return fmt.Errorf("channel details not specified") @@ -89,6 +97,8 @@ func (t *ChannelSettings) Validate() error { return nil } +// IsEqual compares the current ChannelSettings with another ChannelSettings instance. +// It returns true if both instances are equal (or both nil), otherwise false. func (t *ChannelSettings) IsEqual(other *ChannelSettings) bool { if t == nil && other == nil { return true @@ -123,7 +133,7 @@ func (t *ChannelSettings) IsEqual(other *ChannelSettings) bool { } } - return t.Url == other.Url && + return t.WsURL == other.WsURL && t.CAPem == other.CAPem && t.MaxSessionTime == other.MaxSessionTime } diff --git a/workhorse/internal/api/channel_settings_test.go b/workhorse/internal/api/channel_settings_test.go index 79f8ebc5ef67713855b15e2321670cf43ce4202e..d33d78222d24eb073acf6bcfde2fe158182b058c 100644 --- a/workhorse/internal/api/channel_settings_test.go +++ b/workhorse/internal/api/channel_settings_test.go @@ -9,7 +9,7 @@ import ( func channel(url string, subprotocols ...string) *ChannelSettings { return &ChannelSettings{ - Url: url, + WsURL: url, Subprotocols: subprotocols, MaxSessionTime: 0, } @@ -128,12 +128,12 @@ func TestDialer(t *testing.T) { func TestIsEqual(t *testing.T) { chann := channel("ws:", "foo") - chann_header2 := header(chann, "extra") - chann_header3 := header(chann) - chann_header3.Header.Add("Extra", "extra") + channHeader2 := header(chann, "extra") + channHeader3 := header(chann) + channHeader3.Header.Add("Extra", "extra") - chann_ca2 := ca(chann) - chann_ca2.CAPem = "other value" + channCa2 := ca(chann) + channCa2.CAPem = "other value" for i, tc := range []struct { channelA *ChannelSettings @@ -146,19 +146,19 @@ func TestIsEqual(t *testing.T) { {chann, chann, true}, {chann.Clone(), chann.Clone(), true}, {chann, channel("foo:"), false}, - {chann, channel(chann.Url), false}, + {chann, channel(chann.WsURL), false}, {header(chann), header(chann), true}, - {chann_header2, chann_header2, true}, - {chann_header3, chann_header3, true}, - {header(chann), chann_header2, false}, - {header(chann), chann_header3, false}, + {channHeader2, channHeader2, true}, + {channHeader3, channHeader3, true}, + {header(chann), channHeader2, false}, + {header(chann), channHeader3, false}, {header(chann), chann, false}, {chann, header(chann), false}, {ca(chann), ca(chann), true}, {ca(chann), chann, false}, {chann, ca(chann), false}, {ca(header(chann)), ca(header(chann)), true}, - {chann_ca2, ca(chann), false}, + {channCa2, ca(chann), false}, {chann, timeout(chann), false}, } { if actual := tc.channelA.IsEqual(tc.channelB); tc.expected != actual { diff --git a/workhorse/internal/channel/auth_checker_test.go b/workhorse/internal/channel/auth_checker_test.go index b522cf5da1fff3b90c59e7812e084fe1e3bed92d..36a45b07c1e2c0f847a32283c4c7aa820aa3a049 100644 --- a/workhorse/internal/channel/auth_checker_test.go +++ b/workhorse/internal/channel/auth_checker_test.go @@ -19,7 +19,7 @@ func checkerSeries(values ...*api.ChannelSettings) AuthCheckerFunc { } func TestAuthCheckerStopsWhenAuthFails(t *testing.T) { - template := &api.ChannelSettings{Url: "ws://example.com"} + template := &api.ChannelSettings{WsURL: "ws://example.com"} stopCh := make(chan error) series := checkerSeries(template, template, template) ac := NewAuthChecker(series, template, stopCh) @@ -35,9 +35,9 @@ func TestAuthCheckerStopsWhenAuthFails(t *testing.T) { } func TestAuthCheckerStopsWhenAuthChanges(t *testing.T) { - template := &api.ChannelSettings{Url: "ws://example.com"} + template := &api.ChannelSettings{WsURL: "ws://example.com"} changed := template.Clone() - changed.Url = "wss://example.com" + changed.WsURL = "wss://example.com" stopCh := make(chan error) series := checkerSeries(template, changed, template) ac := NewAuthChecker(series, template, stopCh)