Added unit tests for getFile headers (#7045)
* Added unit tests for getFile headers * Fixed exe type test to run correctly on multiple platforms * Make sure we close the body on all Client4 calls * Changed Response.Response field to Response.Header * Clarified type of Response.Header
Этот коммит содержится в:
коммит произвёл
Saturnino Abril
родитель
2105b10ccd
Коммит
6964ae61dc
@@ -165,6 +165,71 @@ func TestGetFile(t *testing.T) {
|
|||||||
CheckNoError(t, resp)
|
CheckNoError(t, resp)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestGetFileHeaders(t *testing.T) {
|
||||||
|
th := Setup().InitBasic()
|
||||||
|
defer TearDown()
|
||||||
|
|
||||||
|
Client := th.Client
|
||||||
|
channel := th.BasicChannel
|
||||||
|
|
||||||
|
if utils.Cfg.FileSettings.DriverName == "" {
|
||||||
|
t.Skip("skipping because no file driver is enabled")
|
||||||
|
}
|
||||||
|
|
||||||
|
testHeaders := func(data []byte, filename string, expectedContentType string, getInline bool) func(*testing.T) {
|
||||||
|
return func(t *testing.T) {
|
||||||
|
fileResp, resp := Client.UploadFile(data, channel.Id, filename)
|
||||||
|
CheckNoError(t, resp)
|
||||||
|
|
||||||
|
fileId := fileResp.FileInfos[0].Id
|
||||||
|
|
||||||
|
_, resp = Client.GetFile(fileId)
|
||||||
|
CheckNoError(t, resp)
|
||||||
|
|
||||||
|
if contentType := resp.Header.Get("Content-Type"); !strings.HasPrefix(contentType, expectedContentType) {
|
||||||
|
t.Fatal("returned incorrect Content-Type", contentType)
|
||||||
|
}
|
||||||
|
|
||||||
|
if getInline {
|
||||||
|
if contentDisposition := resp.Header.Get("Content-Disposition"); !strings.HasPrefix(contentDisposition, "inline") {
|
||||||
|
t.Fatal("returned incorrect Content-Disposition", contentDisposition)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if contentDisposition := resp.Header.Get("Content-Disposition"); !strings.HasPrefix(contentDisposition, "attachment") {
|
||||||
|
t.Fatal("returned incorrect Content-Disposition", contentDisposition)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_, resp = Client.DownloadFile(fileId, true)
|
||||||
|
CheckNoError(t, resp)
|
||||||
|
|
||||||
|
if contentType := resp.Header.Get("Content-Type"); !strings.HasPrefix(contentType, expectedContentType) {
|
||||||
|
t.Fatal("returned incorrect Content-Type", contentType)
|
||||||
|
}
|
||||||
|
|
||||||
|
if contentDisposition := resp.Header.Get("Content-Disposition"); !strings.HasPrefix(contentDisposition, "attachment") {
|
||||||
|
t.Fatal("returned incorrect Content-Disposition", contentDisposition)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
data := []byte("ABC")
|
||||||
|
|
||||||
|
t.Run("png", testHeaders(data, "test.png", "image/png", true))
|
||||||
|
t.Run("gif", testHeaders(data, "test.gif", "image/gif", true))
|
||||||
|
t.Run("mp4", testHeaders(data, "test.mp4", "video/mp4", true))
|
||||||
|
t.Run("mp3", testHeaders(data, "test.mp3", "audio/mpeg", true))
|
||||||
|
t.Run("pdf", testHeaders(data, "test.pdf", "application/pdf", false))
|
||||||
|
t.Run("txt", testHeaders(data, "test.txt", "text/plain", false))
|
||||||
|
t.Run("html", testHeaders(data, "test.html", "text/plain", false))
|
||||||
|
t.Run("js", testHeaders(data, "test.js", "text/plain", false))
|
||||||
|
t.Run("go", testHeaders(data, "test.go", "application/octet-stream", false))
|
||||||
|
t.Run("zip", testHeaders(data, "test.zip", "application/zip", false))
|
||||||
|
t.Run("exe", testHeaders(data, "test.exe", "application/x-ms", false))
|
||||||
|
t.Run("no extension", testHeaders(data, "test", "application/octet-stream", false))
|
||||||
|
t.Run("no extension 2", testHeaders([]byte("<html></html>"), "test", "application/octet-stream", false))
|
||||||
|
}
|
||||||
|
|
||||||
func TestGetFileThumbnail(t *testing.T) {
|
func TestGetFileThumbnail(t *testing.T) {
|
||||||
th := Setup().InitBasic().InitSystemAdmin()
|
th := Setup().InitBasic().InitSystemAdmin()
|
||||||
defer TearDown()
|
defer TearDown()
|
||||||
|
|||||||
174
model/client4.go
174
model/client4.go
@@ -21,6 +21,7 @@ type Response struct {
|
|||||||
RequestId string
|
RequestId string
|
||||||
Etag string
|
Etag string
|
||||||
ServerVersion string
|
ServerVersion string
|
||||||
|
Header http.Header
|
||||||
}
|
}
|
||||||
|
|
||||||
type Client4 struct {
|
type Client4 struct {
|
||||||
@@ -36,10 +37,20 @@ func NewAPIv4Client(url string) *Client4 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func BuildErrorResponse(r *http.Response, err *AppError) *Response {
|
func BuildErrorResponse(r *http.Response, err *AppError) *Response {
|
||||||
if r == nil {
|
var statusCode int
|
||||||
return &Response{StatusCode: 0, Error: err}
|
var header http.Header
|
||||||
|
if r != nil {
|
||||||
|
statusCode = r.StatusCode
|
||||||
|
header = r.Header
|
||||||
} else {
|
} else {
|
||||||
return &Response{StatusCode: r.StatusCode, Error: err}
|
statusCode = 0
|
||||||
|
header = make(http.Header, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
return &Response{
|
||||||
|
StatusCode: statusCode,
|
||||||
|
Error: err,
|
||||||
|
Header: header,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -49,6 +60,7 @@ func BuildResponse(r *http.Response) *Response {
|
|||||||
RequestId: r.Header.Get(HEADER_REQUEST_ID),
|
RequestId: r.Header.Get(HEADER_REQUEST_ID),
|
||||||
Etag: r.Header.Get(HEADER_ETAG_SERVER),
|
Etag: r.Header.Get(HEADER_ETAG_SERVER),
|
||||||
ServerVersion: r.Header.Get(HEADER_VERSION_ID),
|
ServerVersion: r.Header.Get(HEADER_VERSION_ID),
|
||||||
|
Header: r.Header,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -328,13 +340,16 @@ func (c *Client4) DoUploadFile(url string, data []byte, contentType string) (*Fi
|
|||||||
}
|
}
|
||||||
|
|
||||||
if rp, err := c.HttpClient.Do(rq); err != nil || rp == nil {
|
if rp, err := c.HttpClient.Do(rq); err != nil || rp == nil {
|
||||||
return nil, &Response{Error: NewAppError(url, "model.client.connecting.app_error", nil, err.Error(), 0)}
|
return nil, BuildErrorResponse(rp, NewAppError(url, "model.client.connecting.app_error", nil, err.Error(), 0))
|
||||||
} else if rp.StatusCode >= 300 {
|
|
||||||
return nil, &Response{StatusCode: rp.StatusCode, Error: AppErrorFromJson(rp.Body)}
|
|
||||||
} else {
|
} else {
|
||||||
defer closeBody(rp)
|
defer closeBody(rp)
|
||||||
|
|
||||||
|
if rp.StatusCode >= 300 {
|
||||||
|
return nil, BuildErrorResponse(rp, AppErrorFromJson(rp.Body))
|
||||||
|
} else {
|
||||||
return FileUploadResponseFromJson(rp.Body), BuildResponse(rp)
|
return FileUploadResponseFromJson(rp.Body), BuildResponse(rp)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Client4) DoEmojiUploadFile(url string, data []byte, contentType string) (*Emoji, *Response) {
|
func (c *Client4) DoEmojiUploadFile(url string, data []byte, contentType string) (*Emoji, *Response) {
|
||||||
@@ -347,13 +362,16 @@ func (c *Client4) DoEmojiUploadFile(url string, data []byte, contentType string)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if rp, err := c.HttpClient.Do(rq); err != nil || rp == nil {
|
if rp, err := c.HttpClient.Do(rq); err != nil || rp == nil {
|
||||||
return nil, &Response{Error: NewAppError(url, "model.client.connecting.app_error", nil, err.Error(), 0)}
|
return nil, BuildErrorResponse(rp, NewAppError(url, "model.client.connecting.app_error", nil, err.Error(), 0))
|
||||||
} else if rp.StatusCode >= 300 {
|
|
||||||
return nil, &Response{StatusCode: rp.StatusCode, Error: AppErrorFromJson(rp.Body)}
|
|
||||||
} else {
|
} else {
|
||||||
defer closeBody(rp)
|
defer closeBody(rp)
|
||||||
|
|
||||||
|
if rp.StatusCode >= 300 {
|
||||||
|
return nil, BuildErrorResponse(rp, AppErrorFromJson(rp.Body))
|
||||||
|
} else {
|
||||||
return EmojiFromJson(rp.Body), BuildResponse(rp)
|
return EmojiFromJson(rp.Body), BuildResponse(rp)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Client4) DoUploadImportTeam(url string, data []byte, contentType string) (map[string]string, *Response) {
|
func (c *Client4) DoUploadImportTeam(url string, data []byte, contentType string) (map[string]string, *Response) {
|
||||||
@@ -366,13 +384,16 @@ func (c *Client4) DoUploadImportTeam(url string, data []byte, contentType string
|
|||||||
}
|
}
|
||||||
|
|
||||||
if rp, err := c.HttpClient.Do(rq); err != nil || rp == nil {
|
if rp, err := c.HttpClient.Do(rq); err != nil || rp == nil {
|
||||||
return nil, &Response{Error: NewAppError(url, "model.client.connecting.app_error", nil, err.Error(), 0)}
|
return nil, BuildErrorResponse(rp, NewAppError(url, "model.client.connecting.app_error", nil, err.Error(), 0))
|
||||||
} else if rp.StatusCode >= 300 {
|
|
||||||
return nil, &Response{StatusCode: rp.StatusCode, Error: AppErrorFromJson(rp.Body)}
|
|
||||||
} else {
|
} else {
|
||||||
defer closeBody(rp)
|
defer closeBody(rp)
|
||||||
|
|
||||||
|
if rp.StatusCode >= 300 {
|
||||||
|
return nil, BuildErrorResponse(rp, AppErrorFromJson(rp.Body))
|
||||||
|
} else {
|
||||||
return MapFromJson(rp.Body), BuildResponse(rp)
|
return MapFromJson(rp.Body), BuildResponse(rp)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// CheckStatusOK is a convenience function for checking the standard OK response
|
// CheckStatusOK is a convenience function for checking the standard OK response
|
||||||
@@ -584,11 +605,15 @@ func (c *Client4) AutocompleteUsers(username string, etag string) (*UserAutocomp
|
|||||||
func (c *Client4) GetProfileImage(userId, etag string) ([]byte, *Response) {
|
func (c *Client4) GetProfileImage(userId, etag string) ([]byte, *Response) {
|
||||||
if r, err := c.DoApiGet(c.GetUserRoute(userId)+"/image", etag); err != nil {
|
if r, err := c.DoApiGet(c.GetUserRoute(userId)+"/image", etag); err != nil {
|
||||||
return nil, BuildErrorResponse(r, err)
|
return nil, BuildErrorResponse(r, err)
|
||||||
} else if data, err := ioutil.ReadAll(r.Body); err != nil {
|
} else {
|
||||||
return nil, &Response{StatusCode: r.StatusCode, Error: NewAppError("GetProfileImage", "model.client.read_file.app_error", nil, err.Error(), r.StatusCode)}
|
defer closeBody(r)
|
||||||
|
|
||||||
|
if data, err := ioutil.ReadAll(r.Body); err != nil {
|
||||||
|
return nil, BuildErrorResponse(r, NewAppError("GetProfileImage", "model.client.read_file.app_error", nil, err.Error(), r.StatusCode))
|
||||||
} else {
|
} else {
|
||||||
return data, BuildResponse(r)
|
return data, BuildResponse(r)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetUsers returns a page of users on the system. Page counting starts at 0.
|
// GetUsers returns a page of users on the system. Page counting starts at 0.
|
||||||
@@ -953,12 +978,15 @@ func (c *Client4) SetProfileImage(userId string, data []byte) (bool, *Response)
|
|||||||
if rp, err := c.HttpClient.Do(rq); err != nil || rp == nil {
|
if rp, err := c.HttpClient.Do(rq); err != nil || rp == nil {
|
||||||
// set to http.StatusForbidden(403)
|
// set to http.StatusForbidden(403)
|
||||||
return false, &Response{StatusCode: http.StatusForbidden, Error: NewAppError(c.GetUserRoute(userId)+"/image", "model.client.connecting.app_error", nil, err.Error(), 403)}
|
return false, &Response{StatusCode: http.StatusForbidden, Error: NewAppError(c.GetUserRoute(userId)+"/image", "model.client.connecting.app_error", nil, err.Error(), 403)}
|
||||||
} else if rp.StatusCode >= 300 {
|
|
||||||
return false, &Response{StatusCode: rp.StatusCode, Error: AppErrorFromJson(rp.Body)}
|
|
||||||
} else {
|
} else {
|
||||||
defer closeBody(rp)
|
defer closeBody(rp)
|
||||||
|
|
||||||
|
if rp.StatusCode >= 300 {
|
||||||
|
return false, BuildErrorResponse(rp, AppErrorFromJson(rp.Body))
|
||||||
|
} else {
|
||||||
return CheckStatusOK(rp), BuildResponse(rp)
|
return CheckStatusOK(rp), BuildResponse(rp)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// CreateUserAccessToken will generate a user access token that can be used in place
|
// CreateUserAccessToken will generate a user access token that can be used in place
|
||||||
@@ -1805,22 +1833,60 @@ func (c *Client4) UploadFile(data []byte, channelId string, filename string) (*F
|
|||||||
func (c *Client4) GetFile(fileId string) ([]byte, *Response) {
|
func (c *Client4) GetFile(fileId string) ([]byte, *Response) {
|
||||||
if r, err := c.DoApiGet(c.GetFileRoute(fileId), ""); err != nil {
|
if r, err := c.DoApiGet(c.GetFileRoute(fileId), ""); err != nil {
|
||||||
return nil, BuildErrorResponse(r, err)
|
return nil, BuildErrorResponse(r, err)
|
||||||
} else if data, err := ioutil.ReadAll(r.Body); err != nil {
|
} else {
|
||||||
return nil, &Response{StatusCode: r.StatusCode, Error: NewAppError("GetFile", "model.client.read_file.app_error", nil, err.Error(), r.StatusCode)}
|
defer closeBody(r)
|
||||||
|
|
||||||
|
if data, err := ioutil.ReadAll(r.Body); err != nil {
|
||||||
|
return nil, BuildErrorResponse(r, NewAppError("GetFile", "model.client.read_file.app_error", nil, err.Error(), r.StatusCode))
|
||||||
} else {
|
} else {
|
||||||
return data, BuildResponse(r)
|
return data, BuildResponse(r)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// DownloadFile gets the bytes for a file by id, optionally adding headers to force the browser to download it
|
||||||
|
func (c *Client4) DownloadFile(fileId string, download bool) ([]byte, *Response) {
|
||||||
|
if r, err := c.DoApiGet(c.GetFileRoute(fileId)+fmt.Sprintf("?download=%v", download), ""); err != nil {
|
||||||
|
return nil, BuildErrorResponse(r, err)
|
||||||
|
} else {
|
||||||
|
defer closeBody(r)
|
||||||
|
|
||||||
|
if data, err := ioutil.ReadAll(r.Body); err != nil {
|
||||||
|
return nil, BuildErrorResponse(r, NewAppError("DownloadFile", "model.client.read_file.app_error", nil, err.Error(), r.StatusCode))
|
||||||
|
} else {
|
||||||
|
return data, BuildResponse(r)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetFileThumbnail gets the bytes for a file by id.
|
// GetFileThumbnail gets the bytes for a file by id.
|
||||||
func (c *Client4) GetFileThumbnail(fileId string) ([]byte, *Response) {
|
func (c *Client4) GetFileThumbnail(fileId string) ([]byte, *Response) {
|
||||||
if r, err := c.DoApiGet(c.GetFileRoute(fileId)+"/thumbnail", ""); err != nil {
|
if r, err := c.DoApiGet(c.GetFileRoute(fileId)+"/thumbnail", ""); err != nil {
|
||||||
return nil, BuildErrorResponse(r, err)
|
return nil, BuildErrorResponse(r, err)
|
||||||
} else if data, err := ioutil.ReadAll(r.Body); err != nil {
|
} else {
|
||||||
return nil, &Response{StatusCode: r.StatusCode, Error: NewAppError("GetFileThumbnail", "model.client.read_file.app_error", nil, err.Error(), r.StatusCode)}
|
defer closeBody(r)
|
||||||
|
|
||||||
|
if data, err := ioutil.ReadAll(r.Body); err != nil {
|
||||||
|
return nil, BuildErrorResponse(r, NewAppError("GetFileThumbnail", "model.client.read_file.app_error", nil, err.Error(), r.StatusCode))
|
||||||
} else {
|
} else {
|
||||||
return data, BuildResponse(r)
|
return data, BuildResponse(r)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// DownloadFileThumbnail gets the bytes for a file by id, optionally adding headers to force the browser to download it.
|
||||||
|
func (c *Client4) DownloadFileThumbnail(fileId string, download bool) ([]byte, *Response) {
|
||||||
|
if r, err := c.DoApiGet(c.GetFileRoute(fileId)+fmt.Sprintf("/thumbnail?download=%v", download), ""); err != nil {
|
||||||
|
return nil, BuildErrorResponse(r, err)
|
||||||
|
} else {
|
||||||
|
defer closeBody(r)
|
||||||
|
|
||||||
|
if data, err := ioutil.ReadAll(r.Body); err != nil {
|
||||||
|
return nil, BuildErrorResponse(r, NewAppError("DownloadFileThumbnail", "model.client.read_file.app_error", nil, err.Error(), r.StatusCode))
|
||||||
|
} else {
|
||||||
|
return data, BuildResponse(r)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetFileLink gets the public link of a file by id.
|
// GetFileLink gets the public link of a file by id.
|
||||||
@@ -1828,6 +1894,8 @@ func (c *Client4) GetFileLink(fileId string) (string, *Response) {
|
|||||||
if r, err := c.DoApiGet(c.GetFileRoute(fileId)+"/link", ""); err != nil {
|
if r, err := c.DoApiGet(c.GetFileRoute(fileId)+"/link", ""); err != nil {
|
||||||
return "", BuildErrorResponse(r, err)
|
return "", BuildErrorResponse(r, err)
|
||||||
} else {
|
} else {
|
||||||
|
defer closeBody(r)
|
||||||
|
|
||||||
return MapFromJson(r.Body)["link"], BuildResponse(r)
|
return MapFromJson(r.Body)["link"], BuildResponse(r)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1836,11 +1904,30 @@ func (c *Client4) GetFileLink(fileId string) (string, *Response) {
|
|||||||
func (c *Client4) GetFilePreview(fileId string) ([]byte, *Response) {
|
func (c *Client4) GetFilePreview(fileId string) ([]byte, *Response) {
|
||||||
if r, err := c.DoApiGet(c.GetFileRoute(fileId)+"/preview", ""); err != nil {
|
if r, err := c.DoApiGet(c.GetFileRoute(fileId)+"/preview", ""); err != nil {
|
||||||
return nil, BuildErrorResponse(r, err)
|
return nil, BuildErrorResponse(r, err)
|
||||||
} else if data, err := ioutil.ReadAll(r.Body); err != nil {
|
} else {
|
||||||
return nil, &Response{StatusCode: r.StatusCode, Error: NewAppError("GetFilePreview", "model.client.read_file.app_error", nil, err.Error(), r.StatusCode)}
|
defer closeBody(r)
|
||||||
|
|
||||||
|
if data, err := ioutil.ReadAll(r.Body); err != nil {
|
||||||
|
return nil, BuildErrorResponse(r, NewAppError("GetFilePreview", "model.client.read_file.app_error", nil, err.Error(), r.StatusCode))
|
||||||
} else {
|
} else {
|
||||||
return data, BuildResponse(r)
|
return data, BuildResponse(r)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// DownloadFilePreview gets the bytes for a file by id.
|
||||||
|
func (c *Client4) DownloadFilePreview(fileId string, download bool) ([]byte, *Response) {
|
||||||
|
if r, err := c.DoApiGet(c.GetFileRoute(fileId)+fmt.Sprintf("/preview?download=%v", download), ""); err != nil {
|
||||||
|
return nil, BuildErrorResponse(r, err)
|
||||||
|
} else {
|
||||||
|
defer closeBody(r)
|
||||||
|
|
||||||
|
if data, err := ioutil.ReadAll(r.Body); err != nil {
|
||||||
|
return nil, BuildErrorResponse(r, NewAppError("DownloadFilePreview", "model.client.read_file.app_error", nil, err.Error(), r.StatusCode))
|
||||||
|
} else {
|
||||||
|
return data, BuildResponse(r)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetFileInfo gets all the file info objects.
|
// GetFileInfo gets all the file info objects.
|
||||||
@@ -1985,12 +2072,15 @@ func (c *Client4) UploadLicenseFile(data []byte) (bool, *Response) {
|
|||||||
|
|
||||||
if rp, err := c.HttpClient.Do(rq); err != nil || rp == nil {
|
if rp, err := c.HttpClient.Do(rq); err != nil || rp == nil {
|
||||||
return false, &Response{StatusCode: http.StatusForbidden, Error: NewAppError(c.GetLicenseRoute(), "model.client.connecting.app_error", nil, err.Error(), http.StatusForbidden)}
|
return false, &Response{StatusCode: http.StatusForbidden, Error: NewAppError(c.GetLicenseRoute(), "model.client.connecting.app_error", nil, err.Error(), http.StatusForbidden)}
|
||||||
} else if rp.StatusCode >= 300 {
|
|
||||||
return false, &Response{StatusCode: rp.StatusCode, Error: AppErrorFromJson(rp.Body)}
|
|
||||||
} else {
|
} else {
|
||||||
defer closeBody(rp)
|
defer closeBody(rp)
|
||||||
|
|
||||||
|
if rp.StatusCode >= 300 {
|
||||||
|
return false, BuildErrorResponse(rp, AppErrorFromJson(rp.Body))
|
||||||
|
} else {
|
||||||
return CheckStatusOK(rp), BuildResponse(rp)
|
return CheckStatusOK(rp), BuildResponse(rp)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// RemoveLicenseFile will remove the server license it exists. Note that this will
|
// RemoveLicenseFile will remove the server license it exists. Note that this will
|
||||||
@@ -2370,16 +2460,17 @@ func (c *Client4) DownloadComplianceReport(reportId string) ([]byte, *Response)
|
|||||||
|
|
||||||
if rp, err := c.HttpClient.Do(rq); err != nil || rp == nil {
|
if rp, err := c.HttpClient.Do(rq); err != nil || rp == nil {
|
||||||
return nil, &Response{Error: NewAppError("DownloadComplianceReport", "model.client.connecting.app_error", nil, err.Error(), http.StatusBadRequest)}
|
return nil, &Response{Error: NewAppError("DownloadComplianceReport", "model.client.connecting.app_error", nil, err.Error(), http.StatusBadRequest)}
|
||||||
} else if rp.StatusCode >= 300 {
|
|
||||||
defer rp.Body.Close()
|
|
||||||
return nil, &Response{StatusCode: rp.StatusCode, Error: AppErrorFromJson(rp.Body)}
|
|
||||||
} else if data, err := ioutil.ReadAll(rp.Body); err != nil {
|
|
||||||
defer closeBody(rp)
|
|
||||||
return nil, &Response{StatusCode: rp.StatusCode, Error: NewAppError("DownloadComplianceReport", "model.client.read_file.app_error", nil, err.Error(), rp.StatusCode)}
|
|
||||||
} else {
|
} else {
|
||||||
defer closeBody(rp)
|
defer closeBody(rp)
|
||||||
|
|
||||||
|
if rp.StatusCode >= 300 {
|
||||||
|
return nil, BuildErrorResponse(rp, AppErrorFromJson(rp.Body))
|
||||||
|
} else if data, err := ioutil.ReadAll(rp.Body); err != nil {
|
||||||
|
return nil, BuildErrorResponse(rp, NewAppError("DownloadComplianceReport", "model.client.read_file.app_error", nil, err.Error(), rp.StatusCode))
|
||||||
|
} else {
|
||||||
return data, BuildResponse(rp)
|
return data, BuildResponse(rp)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Cluster Section
|
// Cluster Section
|
||||||
@@ -2436,11 +2527,17 @@ func (c *Client4) GetAudits(page int, perPage int, etag string) (Audits, *Respon
|
|||||||
func (c *Client4) GetBrandImage() ([]byte, *Response) {
|
func (c *Client4) GetBrandImage() ([]byte, *Response) {
|
||||||
if r, err := c.DoApiGet(c.GetBrandRoute()+"/image", ""); err != nil {
|
if r, err := c.DoApiGet(c.GetBrandRoute()+"/image", ""); err != nil {
|
||||||
return nil, BuildErrorResponse(r, err)
|
return nil, BuildErrorResponse(r, err)
|
||||||
|
} else {
|
||||||
|
defer closeBody(r)
|
||||||
|
|
||||||
|
if r.StatusCode >= 300 {
|
||||||
|
return nil, BuildErrorResponse(r, AppErrorFromJson(r.Body))
|
||||||
} else if data, err := ioutil.ReadAll(r.Body); err != nil {
|
} else if data, err := ioutil.ReadAll(r.Body); err != nil {
|
||||||
return nil, &Response{StatusCode: r.StatusCode, Error: NewAppError("GetBrandImage", "model.client.read_file.app_error", nil, err.Error(), r.StatusCode)}
|
return nil, BuildErrorResponse(r, NewAppError("GetBrandImage", "model.client.read_file.app_error", nil, err.Error(), r.StatusCode))
|
||||||
} else {
|
} else {
|
||||||
return data, BuildResponse(r)
|
return data, BuildResponse(r)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// UploadBrandImage sets the brand image for the system.
|
// UploadBrandImage sets the brand image for the system.
|
||||||
@@ -2468,12 +2565,15 @@ func (c *Client4) UploadBrandImage(data []byte) (bool, *Response) {
|
|||||||
|
|
||||||
if rp, err := c.HttpClient.Do(rq); err != nil || rp == nil {
|
if rp, err := c.HttpClient.Do(rq); err != nil || rp == nil {
|
||||||
return false, &Response{StatusCode: http.StatusForbidden, Error: NewAppError(c.GetBrandRoute()+"/image", "model.client.connecting.app_error", nil, err.Error(), http.StatusForbidden)}
|
return false, &Response{StatusCode: http.StatusForbidden, Error: NewAppError(c.GetBrandRoute()+"/image", "model.client.connecting.app_error", nil, err.Error(), http.StatusForbidden)}
|
||||||
} else if rp.StatusCode >= 300 {
|
|
||||||
return false, &Response{StatusCode: rp.StatusCode, Error: AppErrorFromJson(rp.Body)}
|
|
||||||
} else {
|
} else {
|
||||||
defer closeBody(rp)
|
defer closeBody(rp)
|
||||||
|
|
||||||
|
if rp.StatusCode >= 300 {
|
||||||
|
return false, BuildErrorResponse(rp, AppErrorFromJson(rp.Body))
|
||||||
|
} else {
|
||||||
return CheckStatusOK(rp), BuildResponse(rp)
|
return CheckStatusOK(rp), BuildResponse(rp)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Logs Section
|
// Logs Section
|
||||||
@@ -2800,11 +2900,15 @@ func (c *Client4) GetEmoji(emojiId string) (*Emoji, *Response) {
|
|||||||
func (c *Client4) GetEmojiImage(emojiId string) ([]byte, *Response) {
|
func (c *Client4) GetEmojiImage(emojiId string) ([]byte, *Response) {
|
||||||
if r, err := c.DoApiGet(c.GetEmojiRoute(emojiId)+"/image", ""); err != nil {
|
if r, err := c.DoApiGet(c.GetEmojiRoute(emojiId)+"/image", ""); err != nil {
|
||||||
return nil, BuildErrorResponse(r, err)
|
return nil, BuildErrorResponse(r, err)
|
||||||
} else if data, err := ioutil.ReadAll(r.Body); err != nil {
|
} else {
|
||||||
return nil, &Response{StatusCode: r.StatusCode, Error: NewAppError("GetEmojiImage", "model.client.read_file.app_error", nil, err.Error(), r.StatusCode)}
|
defer closeBody(r)
|
||||||
|
|
||||||
|
if data, err := ioutil.ReadAll(r.Body); err != nil {
|
||||||
|
return nil, BuildErrorResponse(r, NewAppError("GetEmojiImage", "model.client.read_file.app_error", nil, err.Error(), r.StatusCode))
|
||||||
} else {
|
} else {
|
||||||
return data, BuildResponse(r)
|
return data, BuildResponse(r)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reaction Section
|
// Reaction Section
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user