From ee70042c7e70174fe008293bf450aae4b04e5547 Mon Sep 17 00:00:00 2001 From: jojoliang Date: Wed, 3 Jul 2024 21:28:25 +0800 Subject: [PATCH] =?UTF-8?q?upload=20part=20=E6=94=AF=E6=8C=81=E4=B8=8A?= =?UTF-8?q?=E4=BC=A00=E5=AD=97=E8=8A=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- object_part.go | 20 ++++++++++++-------- object_part_test.go | 46 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 8 deletions(-) diff --git a/object_part.go b/object_part.go index d065df3..185d5f2 100644 --- a/object_part.go +++ b/object_part.go @@ -85,8 +85,8 @@ type ObjectUploadPartOptions struct { // // https://www.qcloud.com/document/product/436/7750 func (s *ObjectService) UploadPart(ctx context.Context, name, uploadID string, partNumber int, r io.Reader, uopt *ObjectUploadPartOptions) (*Response, error) { - if r == nil { - return nil, fmt.Errorf("reader is nil") + if (r == nil || r == http.NoBody) && uopt != nil && uopt.ContentLength != 0 { + return nil, fmt.Errorf("ContentLength must be 0 when reader is nil or http.NoBody.") } if err := CheckReaderLen(r); err != nil { return nil, err @@ -125,12 +125,16 @@ func (s *ObjectService) UploadPart(ctx context.Context, name, uploadID string, p } retryErr := &RetryError{} for nr := 0; nr < count; nr++ { - reader := TeeReader(r, nil, totalBytes, nil) - if s.client.Conf.EnableCRC { - reader.writer = crc64.New(crc64.MakeTable(crc64.ECMA)) - } - if opt != nil && opt.Listener != nil { - reader.listener = opt.Listener + var reader io.Reader + if r != nil && r != http.NoBody { + tReader := TeeReader(r, nil, totalBytes, nil) + if s.client.Conf.EnableCRC { + tReader.writer = crc64.New(crc64.MakeTable(crc64.ECMA)) + } + if opt != nil && opt.Listener != nil { + tReader.listener = opt.Listener + } + reader = tReader } u := fmt.Sprintf("/%s?partNumber=%d&uploadId=%s", encodeURIComponent(name), partNumber, uploadID) sendOpt := sendOptions{ diff --git a/object_part_test.go b/object_part_test.go index 3fde9ff..bff2718 100644 --- a/object_part_test.go +++ b/object_part_test.go @@ -195,6 +195,52 @@ func TestObjectService_UploadPart(t *testing.T) { } +func TestObjectService_UploadPartWithEmptyData(t *testing.T) { + setup() + defer teardown() + + name := "test/hello.txt" + uploadID := "xxxxx" + partNumber := 1 + + mux.HandleFunc("/test/hello.txt", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, http.MethodPut) + vs := values{ + "uploadId": uploadID, + "partNumber": "1", + } + testFormValues(t, r, vs) + if r.Header.Get("Content-Length") != "0" { + t.Fatalf("UploadPart Content-Length is not 0") + } + b, _ := ioutil.ReadAll(r.Body) + if len(b) != 0 { + t.Fatalf("data is not empty") + } + }) + + _, err := client.Object.UploadPart(context.Background(), + name, uploadID, partNumber, nil, nil) + if err != nil { + t.Fatalf("Object.UploadPart returned error: %v", err) + } + + _, err = client.Object.UploadPart(context.Background(), + name, uploadID, partNumber, http.NoBody, nil) + if err != nil { + t.Fatalf("Object.UploadPart returned error: %v", err) + } + + _, err = client.Object.UploadPart(context.Background(), + name, uploadID, partNumber, http.NoBody, &ObjectUploadPartOptions{ + ContentLength: 1, + }) + if err == nil || err.Error() != "ContentLength must be 0 when reader is nil or http.NoBody." { + t.Fatalf("Object.UploadPart returned error: %v", err) + } + +} + func TestObjectService_ListUploads(t *testing.T) { setup() defer teardown()