diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2023-11-29 15:14:14 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2023-11-29 15:14:14 +0300 |
commit | fb28ad5316eb794646daf3b222779ed2e08b638e (patch) | |
tree | 73cc813625698f7f33e5e1cded6ca6bcb0722f5b /workhorse | |
parent | 3396d8eca00790628c5ac45ece32194fb17079b0 (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'workhorse')
-rw-r--r-- | workhorse/internal/dependencyproxy/dependencyproxy.go | 23 | ||||
-rw-r--r-- | workhorse/internal/dependencyproxy/dependencyproxy_test.go | 14 | ||||
-rw-r--r-- | workhorse/internal/proxy/proxy.go | 32 | ||||
-rw-r--r-- | workhorse/internal/proxy/proxy_test.go | 16 |
4 files changed, 84 insertions, 1 deletions
diff --git a/workhorse/internal/dependencyproxy/dependencyproxy.go b/workhorse/internal/dependencyproxy/dependencyproxy.go index 76def761668..a28d108b431 100644 --- a/workhorse/internal/dependencyproxy/dependencyproxy.go +++ b/workhorse/internal/dependencyproxy/dependencyproxy.go @@ -5,6 +5,7 @@ import ( "fmt" "io" "net/http" + "net/url" "os" "time" @@ -157,12 +158,32 @@ func (p *Injector) newUploadRequest(ctx context.Context, params *entryParams, or func (p *Injector) unpackParams(sendData string) (*entryParams, error) { var params entryParams if err := p.Unpack(¶ms, sendData); err != nil { - return nil, fmt.Errorf("dependency proxy: unpack sendData: %v", err) + return nil, fmt.Errorf("dependency proxy: unpack sendData: %w", err) + } + + if err := p.validateParams(params); err != nil { + return nil, fmt.Errorf("dependency proxy: invalid params: %w", err) } return ¶ms, nil } +func (p *Injector) validateParams(params entryParams) error { + var uploadMethod = params.UploadConfig.Method + if uploadMethod != "" && uploadMethod != http.MethodPost && uploadMethod != http.MethodPut { + return fmt.Errorf("invalid upload method %s", uploadMethod) + } + + var uploadUrl = params.UploadConfig.Url + if uploadUrl != "" { + if _, err := url.ParseRequestURI(uploadUrl); err != nil { + return fmt.Errorf("invalid upload url %w", err) + } + } + + return nil +} + func (p *Injector) uploadMethodFrom(params *entryParams) string { if params.UploadConfig.Method != "" { return params.UploadConfig.Method diff --git a/workhorse/internal/dependencyproxy/dependencyproxy_test.go b/workhorse/internal/dependencyproxy/dependencyproxy_test.go index 8a64517d578..b028fbcf355 100644 --- a/workhorse/internal/dependencyproxy/dependencyproxy_test.go +++ b/workhorse/internal/dependencyproxy/dependencyproxy_test.go @@ -261,6 +261,20 @@ func TestInvalidUploadConfiguration(t *testing.T) { sendData map[string]interface{} }{ { + desc: "with an invalid overriden method", + sendData: mergeMap(baseSendData, map[string]interface{}{ + "UploadConfig": map[string]string{ + "Method": "TEAPOT", + }, + }), + }, { + desc: "with an invalid url", + sendData: mergeMap(baseSendData, map[string]interface{}{ + "UploadConfig": map[string]string{ + "Url": "invalid_url", + }, + }), + }, { desc: "with an invalid headers", sendData: mergeMap(baseSendData, map[string]interface{}{ "UploadConfig": map[string]interface{}{ diff --git a/workhorse/internal/proxy/proxy.go b/workhorse/internal/proxy/proxy.go index a7c3b322da7..0610ad1af39 100644 --- a/workhorse/internal/proxy/proxy.go +++ b/workhorse/internal/proxy/proxy.go @@ -5,14 +5,23 @@ import ( "net/http" "net/http/httputil" "net/url" + "sync" "time" "gitlab.com/gitlab-org/gitlab/workhorse/internal/helper" "gitlab.com/gitlab-org/gitlab/workhorse/internal/helper/nginx" ) +const ( + // matches the default size used in httputil.ReverseProxy + bufferPoolSize = 32 * 1024 +) + var ( defaultTarget = helper.URLMustParse("http://localhost") + + // pool is a buffer pool that is shared across all Proxy instances to maximize buffer reuse. + pool = newBufferPool() ) type Proxy struct { @@ -46,6 +55,7 @@ func NewProxy(myURL *url.URL, version string, roundTripper http.RoundTripper, op u.Path = "" p.reverseProxy = httputil.NewSingleHostReverseProxy(&u) p.reverseProxy.Transport = roundTripper + p.reverseProxy.BufferPool = pool chainDirector(p.reverseProxy, func(r *http.Request) { r.Header.Set("Gitlab-Workhorse", p.Version) r.Header.Set("Gitlab-Workhorse-Proxy-Start", fmt.Sprintf("%d", time.Now().UnixNano())) @@ -104,3 +114,25 @@ func (p *Proxy) ServeHTTP(w http.ResponseWriter, r *http.Request) { p.reverseProxy.ServeHTTP(w, r) } + +type bufferPool struct { + pool sync.Pool +} + +func newBufferPool() *bufferPool { + return &bufferPool{ + pool: sync.Pool{ + New: func() any { + return make([]byte, bufferPoolSize) + }, + }, + } +} + +func (bp *bufferPool) Get() []byte { + return bp.pool.Get().([]byte) +} + +func (bp *bufferPool) Put(v []byte) { + bp.pool.Put(v) //lint:ignore SA6002 we either allocate manually to satisfy the linter or let the compiler allocate for us and silence the linter +} diff --git a/workhorse/internal/proxy/proxy_test.go b/workhorse/internal/proxy/proxy_test.go new file mode 100644 index 00000000000..52c8e458a76 --- /dev/null +++ b/workhorse/internal/proxy/proxy_test.go @@ -0,0 +1,16 @@ +package proxy + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestBufferPool(t *testing.T) { + bp := newBufferPool() + + b := bp.Get() + assert.Len(t, b, bufferPoolSize) + + bp.Put(b) // just test that it doesn't panic or something like that +} |