parent
050a68a359
commit
4925a356e3
@ -1,52 +0,0 @@
|
|||||||
package request
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"errors"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/cloudreve/Cloudreve/v3/pkg/auth"
|
|
||||||
"github.com/cloudreve/Cloudreve/v3/pkg/conf"
|
|
||||||
"github.com/cloudreve/Cloudreve/v3/pkg/serializer"
|
|
||||||
)
|
|
||||||
|
|
||||||
// TODO: move to slave pkg
|
|
||||||
// RemoteCallback 发送远程存储策略上传回调请求
|
|
||||||
func RemoteCallback(url string, body serializer.UploadCallback) error {
|
|
||||||
callbackBody, err := json.Marshal(struct {
|
|
||||||
Data serializer.UploadCallback `json:"data"`
|
|
||||||
}{
|
|
||||||
Data: body,
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return serializer.NewError(serializer.CodeCallbackError, "无法编码回调正文", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
resp := GeneralClient.Request(
|
|
||||||
"POST",
|
|
||||||
url,
|
|
||||||
bytes.NewReader(callbackBody),
|
|
||||||
WithTimeout(time.Duration(conf.SlaveConfig.CallbackTimeout)*time.Second),
|
|
||||||
WithCredential(auth.General, int64(conf.SlaveConfig.SignatureTTL)),
|
|
||||||
)
|
|
||||||
|
|
||||||
if resp.Err != nil {
|
|
||||||
return serializer.NewError(serializer.CodeCallbackError, "无法发起回调请求", resp.Err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 解析回调服务端响应
|
|
||||||
resp = resp.CheckHTTPResponse(200)
|
|
||||||
if resp.Err != nil {
|
|
||||||
return serializer.NewError(serializer.CodeCallbackError, "服务器返回异常响应", resp.Err)
|
|
||||||
}
|
|
||||||
response, err := resp.DecodeResponse()
|
|
||||||
if err != nil {
|
|
||||||
return serializer.NewError(serializer.CodeCallbackError, "无法解析服务端返回的响应", err)
|
|
||||||
}
|
|
||||||
if response.Code != 0 {
|
|
||||||
return serializer.NewError(response.Code, response.Msg, errors.New(response.Error))
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
@ -1,137 +0,0 @@
|
|||||||
package request
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"errors"
|
|
||||||
"io/ioutil"
|
|
||||||
"net/http"
|
|
||||||
"strings"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/cloudreve/Cloudreve/v3/pkg/serializer"
|
|
||||||
"github.com/stretchr/testify/assert"
|
|
||||||
testMock "github.com/stretchr/testify/mock"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestRemoteCallback(t *testing.T) {
|
|
||||||
asserts := assert.New(t)
|
|
||||||
|
|
||||||
// 回调成功
|
|
||||||
{
|
|
||||||
clientMock := ClientMock{}
|
|
||||||
mockResp, _ := json.Marshal(serializer.Response{Code: 0})
|
|
||||||
clientMock.On(
|
|
||||||
"Request",
|
|
||||||
"POST",
|
|
||||||
"http://test/test/url",
|
|
||||||
testMock.Anything,
|
|
||||||
testMock.Anything,
|
|
||||||
).Return(&Response{
|
|
||||||
Err: nil,
|
|
||||||
Response: &http.Response{
|
|
||||||
StatusCode: 200,
|
|
||||||
Body: ioutil.NopCloser(bytes.NewReader(mockResp)),
|
|
||||||
},
|
|
||||||
})
|
|
||||||
GeneralClient = clientMock
|
|
||||||
resp := RemoteCallback("http://test/test/url", serializer.UploadCallback{
|
|
||||||
SourceName: "source",
|
|
||||||
})
|
|
||||||
asserts.NoError(resp)
|
|
||||||
clientMock.AssertExpectations(t)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 服务端返回业务错误
|
|
||||||
{
|
|
||||||
clientMock := ClientMock{}
|
|
||||||
mockResp, _ := json.Marshal(serializer.Response{Code: 401})
|
|
||||||
clientMock.On(
|
|
||||||
"Request",
|
|
||||||
"POST",
|
|
||||||
"http://test/test/url",
|
|
||||||
testMock.Anything,
|
|
||||||
testMock.Anything,
|
|
||||||
).Return(&Response{
|
|
||||||
Err: nil,
|
|
||||||
Response: &http.Response{
|
|
||||||
StatusCode: 200,
|
|
||||||
Body: ioutil.NopCloser(bytes.NewReader(mockResp)),
|
|
||||||
},
|
|
||||||
})
|
|
||||||
GeneralClient = clientMock
|
|
||||||
resp := RemoteCallback("http://test/test/url", serializer.UploadCallback{
|
|
||||||
SourceName: "source",
|
|
||||||
})
|
|
||||||
asserts.EqualValues(401, resp.(serializer.AppError).Code)
|
|
||||||
clientMock.AssertExpectations(t)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 无法解析回调响应
|
|
||||||
{
|
|
||||||
clientMock := ClientMock{}
|
|
||||||
clientMock.On(
|
|
||||||
"Request",
|
|
||||||
"POST",
|
|
||||||
"http://test/test/url",
|
|
||||||
testMock.Anything,
|
|
||||||
testMock.Anything,
|
|
||||||
).Return(&Response{
|
|
||||||
Err: nil,
|
|
||||||
Response: &http.Response{
|
|
||||||
StatusCode: 200,
|
|
||||||
Body: ioutil.NopCloser(strings.NewReader("mockResp")),
|
|
||||||
},
|
|
||||||
})
|
|
||||||
GeneralClient = clientMock
|
|
||||||
resp := RemoteCallback("http://test/test/url", serializer.UploadCallback{
|
|
||||||
SourceName: "source",
|
|
||||||
})
|
|
||||||
asserts.Error(resp)
|
|
||||||
clientMock.AssertExpectations(t)
|
|
||||||
}
|
|
||||||
|
|
||||||
// HTTP状态码非200
|
|
||||||
{
|
|
||||||
clientMock := ClientMock{}
|
|
||||||
clientMock.On(
|
|
||||||
"Request",
|
|
||||||
"POST",
|
|
||||||
"http://test/test/url",
|
|
||||||
testMock.Anything,
|
|
||||||
testMock.Anything,
|
|
||||||
).Return(&Response{
|
|
||||||
Err: nil,
|
|
||||||
Response: &http.Response{
|
|
||||||
StatusCode: 404,
|
|
||||||
Body: ioutil.NopCloser(strings.NewReader("mockResp")),
|
|
||||||
},
|
|
||||||
})
|
|
||||||
GeneralClient = clientMock
|
|
||||||
resp := RemoteCallback("http://test/test/url", serializer.UploadCallback{
|
|
||||||
SourceName: "source",
|
|
||||||
})
|
|
||||||
asserts.Error(resp)
|
|
||||||
clientMock.AssertExpectations(t)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 无法发起回调
|
|
||||||
{
|
|
||||||
clientMock := ClientMock{}
|
|
||||||
clientMock.On(
|
|
||||||
"Request",
|
|
||||||
"POST",
|
|
||||||
"http://test/test/url",
|
|
||||||
testMock.Anything,
|
|
||||||
testMock.Anything,
|
|
||||||
).Return(&Response{
|
|
||||||
Err: errors.New("error"),
|
|
||||||
})
|
|
||||||
GeneralClient = clientMock
|
|
||||||
resp := RemoteCallback("http://test/test/url", serializer.UploadCallback{
|
|
||||||
SourceName: "source",
|
|
||||||
})
|
|
||||||
asserts.Error(resp)
|
|
||||||
clientMock.AssertExpectations(t)
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in new issue