2021-04-18 15:41:13 -04:00
|
|
|
// Copyright (c) 2015-2021 MinIO, Inc.
|
|
|
|
//
|
|
|
|
// This file is part of MinIO Object Storage stack
|
|
|
|
//
|
|
|
|
// This program is free software: you can redistribute it and/or modify
|
|
|
|
// it under the terms of the GNU Affero General Public License as published by
|
|
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
|
|
// (at your option) any later version.
|
|
|
|
//
|
|
|
|
// This program is distributed in the hope that it will be useful
|
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
// GNU Affero General Public License for more details.
|
|
|
|
//
|
|
|
|
// You should have received a copy of the GNU Affero General Public License
|
|
|
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
2016-12-20 17:45:17 -05:00
|
|
|
|
|
|
|
package madmin
|
|
|
|
|
2017-01-17 17:25:59 -05:00
|
|
|
import (
|
|
|
|
"encoding/xml"
|
2020-05-26 21:03:00 -04:00
|
|
|
"fmt"
|
2017-01-17 17:25:59 -05:00
|
|
|
"net/http"
|
|
|
|
)
|
2016-12-20 17:45:17 -05:00
|
|
|
|
|
|
|
/* **** SAMPLE ERROR RESPONSE ****
|
|
|
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
|
|
<Error>
|
|
|
|
<Code>AccessDenied</Code>
|
|
|
|
<Message>Access Denied</Message>
|
|
|
|
<BucketName>bucketName</BucketName>
|
|
|
|
<Key>objectName</Key>
|
|
|
|
<RequestId>F19772218238A85A</RequestId>
|
|
|
|
<HostId>GuWkjyviSiGHizehqpmsD1ndz5NClSP19DOT+s2mv7gXGQ8/X1lhbDGiIJEXpGFD</HostId>
|
|
|
|
</Error>
|
|
|
|
*/
|
|
|
|
|
|
|
|
// ErrorResponse - Is the typed error returned by all API operations.
|
|
|
|
type ErrorResponse struct {
|
|
|
|
XMLName xml.Name `xml:"Error" json:"-"`
|
|
|
|
Code string
|
|
|
|
Message string
|
|
|
|
BucketName string
|
|
|
|
Key string
|
|
|
|
RequestID string `xml:"RequestId"`
|
|
|
|
HostID string `xml:"HostId"`
|
|
|
|
|
|
|
|
// Region where the bucket is located. This header is returned
|
|
|
|
// only in HEAD bucket and ListObjects response.
|
|
|
|
Region string
|
|
|
|
}
|
|
|
|
|
|
|
|
// Error - Returns HTTP error string
|
|
|
|
func (e ErrorResponse) Error() string {
|
|
|
|
return e.Message
|
|
|
|
}
|
|
|
|
|
2017-01-17 17:25:59 -05:00
|
|
|
const (
|
2018-01-22 17:54:55 -05:00
|
|
|
reportIssue = "Please report this issue at https://github.com/minio/minio/issues."
|
2017-01-17 17:25:59 -05:00
|
|
|
)
|
|
|
|
|
|
|
|
// httpRespToErrorResponse returns a new encoded ErrorResponse
|
|
|
|
// structure as error.
|
|
|
|
func httpRespToErrorResponse(resp *http.Response) error {
|
|
|
|
if resp == nil {
|
|
|
|
msg := "Response is empty. " + reportIssue
|
|
|
|
return ErrInvalidArgument(msg)
|
|
|
|
}
|
|
|
|
var errResp ErrorResponse
|
2018-01-22 17:54:55 -05:00
|
|
|
// Decode the json error
|
|
|
|
err := jsonDecoder(resp.Body, &errResp)
|
2017-01-17 17:25:59 -05:00
|
|
|
if err != nil {
|
|
|
|
return ErrorResponse{
|
|
|
|
Code: resp.Status,
|
2020-05-26 21:03:00 -04:00
|
|
|
Message: fmt.Sprintf("Failed to parse server response: %s.", err),
|
2017-01-17 17:25:59 -05:00
|
|
|
}
|
|
|
|
}
|
2018-09-26 14:03:35 -04:00
|
|
|
closeResponse(resp)
|
2017-01-17 17:25:59 -05:00
|
|
|
return errResp
|
|
|
|
}
|
|
|
|
|
2019-05-09 20:41:54 -04:00
|
|
|
// ToErrorResponse - Returns parsed ErrorResponse struct from body and
|
|
|
|
// http headers.
|
|
|
|
//
|
|
|
|
// For example:
|
|
|
|
//
|
|
|
|
// import admin "github.com/minio/minio/pkg/madmin"
|
|
|
|
// ...
|
|
|
|
// ...
|
|
|
|
// ss, err := adm.ServiceStatus(...)
|
|
|
|
// if err != nil {
|
|
|
|
// resp := admin.ToErrorResponse(err)
|
|
|
|
// }
|
|
|
|
// ...
|
|
|
|
func ToErrorResponse(err error) ErrorResponse {
|
|
|
|
switch err := err.(type) {
|
|
|
|
case ErrorResponse:
|
|
|
|
return err
|
|
|
|
default:
|
|
|
|
return ErrorResponse{}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-12-20 17:45:17 -05:00
|
|
|
// ErrInvalidArgument - Invalid argument response.
|
|
|
|
func ErrInvalidArgument(message string) error {
|
|
|
|
return ErrorResponse{
|
|
|
|
Code: "InvalidArgument",
|
|
|
|
Message: message,
|
|
|
|
RequestID: "minio",
|
|
|
|
}
|
|
|
|
}
|