(ctx context.Context, s model.FileStreamer, up driver.UpdateProgress)
| 685 | } |
| 686 | |
| 687 | func (d *Github) putBlob(ctx context.Context, s model.FileStreamer, up driver.UpdateProgress) (string, error) { |
| 688 | beforeContent := "{\"encoding\":\"base64\",\"content\":\"" |
| 689 | afterContent := "\"}" |
| 690 | length := int64(len(beforeContent)) + calculateBase64Length(s.GetSize()) + int64(len(afterContent)) |
| 691 | beforeContentReader := strings.NewReader(beforeContent) |
| 692 | contentReader, contentWriter := io.Pipe() |
| 693 | go func() { |
| 694 | encoder := base64.NewEncoder(base64.StdEncoding, contentWriter) |
| 695 | if _, err := utils.CopyWithBuffer(encoder, s); err != nil { |
| 696 | _ = contentWriter.CloseWithError(err) |
| 697 | return |
| 698 | } |
| 699 | _ = encoder.Close() |
| 700 | _ = contentWriter.Close() |
| 701 | }() |
| 702 | afterContentReader := strings.NewReader(afterContent) |
| 703 | req, err := http.NewRequestWithContext(ctx, http.MethodPost, |
| 704 | fmt.Sprintf("https://api.github.com/repos/%s/%s/git/blobs", d.Owner, d.Repo), |
| 705 | driver.NewLimitedUploadStream(ctx, &driver.ReaderUpdatingProgress{ |
| 706 | Reader: &driver.SimpleReaderWithSize{ |
| 707 | Reader: io.MultiReader(beforeContentReader, contentReader, afterContentReader), |
| 708 | Size: length, |
| 709 | }, |
| 710 | UpdateProgress: up, |
| 711 | })) |
| 712 | if err != nil { |
| 713 | return "", err |
| 714 | } |
| 715 | req.Header.Set("Accept", "application/vnd.github+json") |
| 716 | req.Header.Set("X-GitHub-Api-Version", "2022-11-28") |
| 717 | token := strings.TrimSpace(d.Token) |
| 718 | if token != "" { |
| 719 | req.Header.Set("Authorization", "Bearer "+token) |
| 720 | } |
| 721 | req.ContentLength = length |
| 722 | |
| 723 | res, err := base.HttpClient.Do(req) |
| 724 | if err != nil { |
| 725 | return "", err |
| 726 | } |
| 727 | defer res.Body.Close() |
| 728 | resBody, err := io.ReadAll(res.Body) |
| 729 | if err != nil { |
| 730 | return "", err |
| 731 | } |
| 732 | if res.StatusCode != 201 { |
| 733 | var errMsg ErrResp |
| 734 | if err = utils.Json.Unmarshal(resBody, &errMsg); err != nil { |
| 735 | return "", errors.New(res.Status) |
| 736 | } else { |
| 737 | return "", fmt.Errorf("%s: %s", res.Status, errMsg.Message) |
| 738 | } |
| 739 | } |
| 740 | var resp PutBlobResp |
| 741 | if err = utils.Json.Unmarshal(resBody, &resp); err != nil { |
| 742 | return "", err |
| 743 | } |
| 744 | return resp.Sha, nil |
no test coverage detected