// Copyright GoFrame Author(https://goframe.org). All Rights Reserved. // // This Source Code Form is subject to the terms of the MIT License. // If a copy of the MIT was not distributed with this file, // You can obtain one at https://github.com/gogf/gf. package ghttp import ( "mime" "net/http" "github.com/gogf/gf/v2/errors/gcode" "github.com/gogf/gf/v2/errors/gerror" ) // DefaultHandlerResponse is the default implementation of HandlerResponse. type DefaultHandlerResponse struct { Code int `json:"code" dc:"Error code"` Message string `json:"message" dc:"Error message"` Data interface{} `json:"data" dc:"Result data for certain request according API definition"` } const ( contentTypeEventStream = "text/event-stream" contentTypeOctetStream = "application/octet-stream" contentTypeMixedReplace = "multipart/x-mixed-replace" ) var ( // streamContentType is the content types for stream response. streamContentType = []string{contentTypeEventStream, contentTypeOctetStream, contentTypeMixedReplace} ) // MiddlewareHandlerResponse is the default middleware handling handler response object and its error. func MiddlewareHandlerResponse(r *Request) { r.Middleware.Next() // There's custom buffer content, it then exits current handler. if r.Response.BufferLength() > 0 { return } // It does not output common response content if it is stream response. mediaType, _, _ := mime.ParseMediaType(r.Response.Header().Get("Content-Type")) for _, ct := range streamContentType { if mediaType == ct { return } } var ( msg string err = r.GetError() res = r.GetHandlerResponse() code = gerror.Code(err) ) if err != nil { if code == gcode.CodeNil { code = gcode.CodeInternalError } msg = err.Error() } else { if r.Response.Status > 0 && r.Response.Status != http.StatusOK { msg = http.StatusText(r.Response.Status) switch r.Response.Status { case http.StatusNotFound: code = gcode.CodeNotFound case http.StatusForbidden: code = gcode.CodeNotAuthorized default: code = gcode.CodeUnknown } // It creates error as it can be retrieved by other middlewares. err = gerror.NewCode(code, msg) r.SetError(err) } else { code = gcode.CodeOK } } r.Response.WriteJson(DefaultHandlerResponse{ Code: code.Code(), Message: msg, Data: res, }) }