diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-12-17 14:59:07 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-12-17 14:59:07 +0300 |
commit | 8b573c94895dc0ac0e1d9d59cf3e8745e8b539ca (patch) | |
tree | 544930fb309b30317ae9797a9683768705d664c4 /workhorse/internal/gitaly/blob.go | |
parent | 4b1de649d0168371549608993deac953eb692019 (diff) |
Add latest changes from gitlab-org/gitlab@13-7-stable-eev13.7.0-rc42
Diffstat (limited to 'workhorse/internal/gitaly/blob.go')
-rw-r--r-- | workhorse/internal/gitaly/blob.go | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/workhorse/internal/gitaly/blob.go b/workhorse/internal/gitaly/blob.go new file mode 100644 index 00000000000..c6f5d6676f3 --- /dev/null +++ b/workhorse/internal/gitaly/blob.go @@ -0,0 +1,41 @@ +package gitaly + +import ( + "context" + "fmt" + "io" + "net/http" + "strconv" + + "gitlab.com/gitlab-org/gitaly/proto/go/gitalypb" + "gitlab.com/gitlab-org/gitaly/streamio" +) + +type BlobClient struct { + gitalypb.BlobServiceClient +} + +func (client *BlobClient) SendBlob(ctx context.Context, w http.ResponseWriter, request *gitalypb.GetBlobRequest) error { + c, err := client.GetBlob(ctx, request) + if err != nil { + return fmt.Errorf("rpc failed: %v", err) + } + + firstResponseReceived := false + rr := streamio.NewReader(func() ([]byte, error) { + resp, err := c.Recv() + + if !firstResponseReceived && err == nil { + firstResponseReceived = true + w.Header().Set("Content-Length", strconv.FormatInt(resp.GetSize(), 10)) + } + + return resp.GetData(), err + }) + + if _, err := io.Copy(w, rr); err != nil { + return fmt.Errorf("copy rpc data: %v", err) + } + + return nil +} |