forked from TrueCloudLab/frostfs-s3-gw
[#60] Add *NoHeader functions
Such functions should be used together with periodic white space XML writer. Signed-off-by: Alex Vanin <a.vanin@yadro.com>
This commit is contained in:
parent
43685e03d9
commit
2282c32822
2 changed files with 43 additions and 1 deletions
|
@ -29,6 +29,19 @@ func (h *handler) logAndSendError(w http.ResponseWriter, logText string, reqInfo
|
||||||
h.log.Error("call method", fields...)
|
h.log.Error("call method", fields...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (h *handler) logAndSendErrorNoHeader(w http.ResponseWriter, logText string, reqInfo *api.ReqInfo, err error, additional ...zap.Field) {
|
||||||
|
api.WriteErrorResponseNoHeader(w, reqInfo, transformToS3Error(err))
|
||||||
|
fields := []zap.Field{
|
||||||
|
zap.String("request_id", reqInfo.RequestID),
|
||||||
|
zap.String("method", reqInfo.API),
|
||||||
|
zap.String("bucket", reqInfo.BucketName),
|
||||||
|
zap.String("object", reqInfo.ObjectName),
|
||||||
|
zap.String("description", logText),
|
||||||
|
zap.Error(err)}
|
||||||
|
fields = append(fields, additional...)
|
||||||
|
h.log.Error("call method", fields...)
|
||||||
|
}
|
||||||
|
|
||||||
func transformToS3Error(err error) error {
|
func transformToS3Error(err error) error {
|
||||||
if _, ok := err.(errors.Error); ok {
|
if _, ok := err.(errors.Error); ok {
|
||||||
return err
|
return err
|
||||||
|
|
|
@ -133,6 +133,13 @@ func WriteErrorResponse(w http.ResponseWriter, reqInfo *ReqInfo, err error) int
|
||||||
return code
|
return code
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// WriteErrorResponseNoHeader writes XML encoded error to the response body.
|
||||||
|
func WriteErrorResponseNoHeader(w http.ResponseWriter, reqInfo *ReqInfo, err error) {
|
||||||
|
errorResponse := getAPIErrorResponse(reqInfo, err)
|
||||||
|
encodedErrorResponse := EncodeResponse(errorResponse)
|
||||||
|
WriteResponseBody(w, encodedErrorResponse)
|
||||||
|
}
|
||||||
|
|
||||||
// If none of the http routes match respond with appropriate errors.
|
// If none of the http routes match respond with appropriate errors.
|
||||||
func errorResponseHandler(w http.ResponseWriter, r *http.Request) {
|
func errorResponseHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
desc := fmt.Sprintf("Unknown API request at %s", r.URL.Path)
|
desc := fmt.Sprintf("Unknown API request at %s", r.URL.Path)
|
||||||
|
@ -172,6 +179,11 @@ func WriteResponse(w http.ResponseWriter, statusCode int, response []byte, mType
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
WriteResponseBody(w, response)
|
||||||
|
}
|
||||||
|
|
||||||
|
// WriteResponseBody writes response into w.
|
||||||
|
func WriteResponseBody(w http.ResponseWriter, response []byte) {
|
||||||
_, _ = w.Write(response)
|
_, _ = w.Write(response)
|
||||||
if flusher, ok := w.(http.Flusher); ok {
|
if flusher, ok := w.(http.Flusher); ok {
|
||||||
flusher.Flush()
|
flusher.Flush()
|
||||||
|
@ -188,13 +200,30 @@ func EncodeResponse(response interface{}) []byte {
|
||||||
return bytesBuffer.Bytes()
|
return bytesBuffer.Bytes()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// EncodeResponseNoHeader encodes response without setting xml.Header.
|
||||||
|
// Should be used with periodicXMLWriter which sends xml.Header to the client
|
||||||
|
// with whitespaces to keep connection alive.
|
||||||
|
func EncodeResponseNoHeader(response interface{}) []byte {
|
||||||
|
var bytesBuffer bytes.Buffer
|
||||||
|
_ = xml.NewEncoder(&bytesBuffer).Encode(response)
|
||||||
|
return bytesBuffer.Bytes()
|
||||||
|
}
|
||||||
|
|
||||||
// EncodeToResponse encodes the response into ResponseWriter.
|
// EncodeToResponse encodes the response into ResponseWriter.
|
||||||
func EncodeToResponse(w http.ResponseWriter, response interface{}) error {
|
func EncodeToResponse(w http.ResponseWriter, response interface{}) error {
|
||||||
w.WriteHeader(http.StatusOK)
|
w.WriteHeader(http.StatusOK)
|
||||||
|
|
||||||
if _, err := w.Write(xmlHeader); err != nil {
|
if _, err := w.Write(xmlHeader); err != nil {
|
||||||
return fmt.Errorf("write headers: %w", err)
|
return fmt.Errorf("write headers: %w", err)
|
||||||
} else if err = xml.NewEncoder(w).Encode(response); err != nil {
|
}
|
||||||
|
|
||||||
|
return EncodeToResponseNoHeader(w, response)
|
||||||
|
}
|
||||||
|
|
||||||
|
// EncodeToResponseNoHeader encodes the response into ResponseWriter without
|
||||||
|
// header status.
|
||||||
|
func EncodeToResponseNoHeader(w http.ResponseWriter, response interface{}) error {
|
||||||
|
if err := xml.NewEncoder(w).Encode(response); err != nil {
|
||||||
return fmt.Errorf("encode xml response: %w", err)
|
return fmt.Errorf("encode xml response: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue