Skip to content

Commit ae91ae6

Browse files
author
YangSen-qn
committed
binary data request add content length
1 parent ee86140 commit ae91ae6

File tree

4 files changed

+122
-15
lines changed

4 files changed

+122
-15
lines changed

internal/api-generator/client.go

+27-15
Original file line numberDiff line numberDiff line change
@@ -151,18 +151,6 @@ func (description *ApiDetailedDescription) generatePackage(group *jen.Group, opt
151151
))
152152
}))
153153
}
154-
if description.Request.HeaderNames != nil {
155-
group.Add(
156-
jen.List(jen.Id("headers"), jen.Err()).Op(":=").Id("innerRequest").Dot("buildHeaders").Call(),
157-
)
158-
group.Add(
159-
jen.If(
160-
jen.Err().Op("!=").Nil(),
161-
).BlockFunc(func(group *jen.Group) {
162-
group.Add(jen.Return(jen.Nil(), jen.Err()))
163-
}),
164-
)
165-
}
166154
guessPathSegmentsCount := 0
167155
if description.BasePath != "" {
168156
guessPathSegmentsCount += len(description.getBasePathSegments())
@@ -243,6 +231,22 @@ func (description *ApiDetailedDescription) generatePackage(group *jen.Group, opt
243231
}),
244232
)
245233
}
234+
if description.Request.HeaderNames != nil {
235+
group.Add(
236+
jen.List(jen.Id("headers"), jen.Err()).Op(":=").Id("innerRequest").Dot("buildHeaders").Call(),
237+
)
238+
group.Add(
239+
jen.If(
240+
jen.Err().Op("!=").Nil(),
241+
).BlockFunc(func(group *jen.Group) {
242+
group.Add(jen.Return(jen.Nil(), jen.Err()))
243+
}),
244+
)
245+
} else {
246+
group.Add(
247+
jen.Id("headers").Op(":=").Qual("net/http", "Header").Values(jen.Dict{}),
248+
)
249+
}
246250
if requestBody := description.Request.Body; requestBody != nil {
247251
if json := requestBody.Json; json != nil {
248252
group.Add(
@@ -301,6 +305,16 @@ func (description *ApiDetailedDescription) generatePackage(group *jen.Group, opt
301305
))
302306
}),
303307
)
308+
group.Add(
309+
jen.Id("hErr").Op(":=").Qual(PackageNameUtils, "HttpHeadAddContentLength").Call(jen.Id("headers"), jen.Id("body")),
310+
)
311+
group.Add(
312+
jen.If(
313+
jen.Id("hErr").Op("!=").Nil(),
314+
).Block(
315+
jen.Return(jen.Nil(), jen.Id("hErr")),
316+
),
317+
)
304318
}
305319
}
306320
if isStorageAPIs() {
@@ -405,9 +419,7 @@ func (description *ApiDetailedDescription) generatePackage(group *jen.Group, opt
405419
group.Add(jen.Id("Endpoints").Op(":").Id("options").Dot("OverwrittenEndpoints"))
406420
group.Add(jen.Id("Region").Op(":").Id("options").Dot("OverwrittenRegion"))
407421
group.Add(jen.Id("Interceptors").Op(":").Index().Qual(PackageNameHTTPClient, "Interceptor").Values(jen.Id("uplogInterceptor")))
408-
if description.Request.HeaderNames != nil {
409-
group.Add(jen.Id("Header").Op(":").Id("headers"))
410-
}
422+
group.Add(jen.Id("Header").Op(":").Id("headers"))
411423
switch description.Request.Authorization.ToAuthorization() {
412424
case AuthorizationQbox:
413425
group.Add(jen.Id("AuthType").Op(":").Qual(PackageNameAuth, "TokenQBox"))

internal/api-generator/main.go

+1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ const (
1919
PackageNameRegion = "github.com/qiniu/go-sdk/v7/storagev2/region"
2020
PackageNameUpToken = "github.com/qiniu/go-sdk/v7/storagev2/uptoken"
2121
PackageNameErrors = "github.com/qiniu/go-sdk/v7/storagev2/errors"
22+
PackageNameUtils = "github.com/qiniu/go-sdk/v7/storagev2/internal/utils"
2223
PackageNameUplog = "github.com/qiniu/go-sdk/v7/internal/uplog"
2324
PackageNameInternalIo = "github.com/qiniu/go-sdk/v7/internal/io"
2425
)

storagev2/internal/utils/http.go

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package utils
2+
3+
import (
4+
"io"
5+
"net/http"
6+
"strconv"
7+
)
8+
9+
func HttpHeadAddContentLength(header http.Header, data io.ReadSeekCloser) error {
10+
_, err := data.Seek(0, io.SeekStart)
11+
if err != nil {
12+
return err
13+
}
14+
15+
contentLength, err := data.Seek(0, io.SeekEnd)
16+
if err != nil {
17+
return err
18+
}
19+
20+
header.Set("Content-Length", strconv.FormatInt(contentLength, 10))
21+
22+
return nil
23+
}

storagev2/internal/utils/http_test.go

+71
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package utils
2+
3+
import (
4+
"bytes"
5+
"errors"
6+
"io"
7+
"net/http"
8+
"testing"
9+
10+
internal_io "github.com/qiniu/go-sdk/v7/internal/io"
11+
)
12+
13+
// 模拟 io.ReadSeekCloser 以模拟错误
14+
type errorSeeker struct {
15+
io.ReadSeeker
16+
err error
17+
}
18+
19+
func (e *errorSeeker) Close() error {
20+
return nil
21+
}
22+
23+
func (e *errorSeeker) Seek(offset int64, whence int) (int64, error) {
24+
if e.err != nil {
25+
return 0, e.err
26+
}
27+
return e.ReadSeeker.Seek(offset, whence)
28+
}
29+
30+
func TestHttpHeadAddContentLength_Success(t *testing.T) {
31+
data := bytes.NewReader([]byte("test"))
32+
dataS := internal_io.MakeReadSeekCloserFromLimitedReader(data, data.Size())
33+
34+
header := http.Header{}
35+
err := HttpHeadAddContentLength(header, dataS)
36+
if err != nil {
37+
t.Errorf("Expected no error, got %v", err)
38+
}
39+
40+
expectedLength := "4"
41+
actualLength := header.Get("Content-Length")
42+
if actualLength != expectedLength {
43+
t.Errorf("Expected Content-Length to be %s, got %s", expectedLength, actualLength)
44+
}
45+
}
46+
47+
func TestHttpHeadAddContentLength_SeekStartError(t *testing.T) {
48+
header := http.Header{}
49+
data := &errorSeeker{
50+
ReadSeeker: bytes.NewReader([]byte("test")),
51+
err: errors.New("seek start error"),
52+
}
53+
54+
err := HttpHeadAddContentLength(header, data)
55+
if err == nil {
56+
t.Errorf("Expected error, got nil")
57+
}
58+
}
59+
60+
func TestHttpHeadAddContentLength_SeekEndError(t *testing.T) {
61+
header := http.Header{}
62+
data := &errorSeeker{
63+
ReadSeeker: bytes.NewReader([]byte("test")),
64+
err: errors.New("seek end error"),
65+
}
66+
67+
err := HttpHeadAddContentLength(header, data)
68+
if err == nil {
69+
t.Errorf("Expected error, got nil")
70+
}
71+
}

0 commit comments

Comments
 (0)