diff options
author | Justin Tobler <jtobler@gitlab.com> | 2023-11-22 00:37:59 +0300 |
---|---|---|
committer | Justin Tobler <jtobler@gitlab.com> | 2023-11-22 00:46:57 +0300 |
commit | 939c82aa9f52d3d5c37b6a7d0b67cb3619fb8162 (patch) | |
tree | 65bc9a1a1bc76e63632e2cdee9af728ef2168592 | |
parent | f8dc4454c638feff57efb9ade3fa8ed1b2552cea (diff) |
repository: Add resolved address to `CreateRepositoryFromURL` error
The `CreateRepositoryFromURL` RPC may have a resolved address set in its
request to mitigate DNS rebinding. In the event the underlying
`git-clone(1)` process returns an error, append the resolved address as
structured error metadata for debugging.
-rw-r--r-- | internal/gitaly/service/repository/create_repository_from_url.go | 5 | ||||
-rw-r--r-- | internal/gitaly/service/repository/create_repository_from_url_test.go | 21 |
2 files changed, 20 insertions, 6 deletions
diff --git a/internal/gitaly/service/repository/create_repository_from_url.go b/internal/gitaly/service/repository/create_repository_from_url.go index 1afb76a0e..8f98618e7 100644 --- a/internal/gitaly/service/repository/create_repository_from_url.go +++ b/internal/gitaly/service/repository/create_repository_from_url.go @@ -102,7 +102,10 @@ func (s *server) CreateRepositoryFromURL(ctx context.Context, req *gitalypb.Crea } if err := cmd.Wait(); err != nil { - return fmt.Errorf("cloning repository: %w, stderr: %q", err, stderr.String()) + return structerr.NewInternal("cloning repository: %w", err).WithMetadataItems( + structerr.MetadataItem{Key: "stderr", Value: stderr.String()}, + structerr.MetadataItem{Key: "resolved_address", Value: req.GetResolvedAddress()}, + ) } if err := s.removeOriginInRepo(ctx, repo); err != nil { diff --git a/internal/gitaly/service/repository/create_repository_from_url_test.go b/internal/gitaly/service/repository/create_repository_from_url_test.go index 02c71223b..eb5e609ce 100644 --- a/internal/gitaly/service/repository/create_repository_from_url_test.go +++ b/internal/gitaly/service/repository/create_repository_from_url_test.go @@ -181,8 +181,14 @@ func TestCreateRepositoryFromURL_redirect(t *testing.T) { require.True(t, httpServerState.serverVisited, "git command should make the initial HTTP request") require.False(t, httpServerState.serverVisitedAfterRedirect, "git command should not follow HTTP redirection") - require.Error(t, err) - require.Contains(t, err.Error(), "The requested URL returned error: 301") + testhelper.RequireStatusWithErrorMetadataRegexp(t, + structerr.NewInternal("creating repository: cloning repository: exit status 128"), + err, + map[string]string{ + "stderr": "The requested URL returned error: 301", + "resolved_address": "", + }, + ) } func TestCreateRepositoryFromURL_fsck(t *testing.T) { @@ -214,9 +220,14 @@ func TestCreateRepositoryFromURL_fsck(t *testing.T) { Repository: targetRepoProto, Url: "file://" + sourceRepoPath, }) - require.Error(t, err) - testhelper.RequireGrpcCode(t, err, codes.Internal) - require.Contains(t, err.Error(), "duplicateEntries: contains duplicate file entries") + testhelper.RequireStatusWithErrorMetadataRegexp(t, + structerr.NewInternal("creating repository: cloning repository: exit status 128"), + err, + map[string]string{ + "stderr": "duplicateEntries: contains duplicate file entries", + "resolved_address": "", + }, + ) } func TestServer_CloneFromURLCommand(t *testing.T) { |