Skip to content

Commit

Permalink
http: fix encodeError can't write response header (#782)
Browse files Browse the repository at this point in the history
* http: fix encodeError can't write response header
* http: not handle Write error
  • Loading branch information
elricli authored Mar 17, 2021
1 parent 8e21de5 commit 4e2ae20
Showing 1 changed file with 22 additions and 12 deletions.
34 changes: 22 additions & 12 deletions transport/http/handle.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"strings"

"github.com/go-kratos/kratos/v2/encoding"
"github.com/go-kratos/kratos/v2/encoding/json"
"github.com/go-kratos/kratos/v2/errors"
"github.com/go-kratos/kratos/v2/middleware"
"github.com/go-kratos/kratos/v2/transport/http/binding"
Expand Down Expand Up @@ -95,25 +96,17 @@ func decodeRequest(req *http.Request, v interface{}) error {

// encodeResponse encodes the object to the HTTP response.
func encodeResponse(w http.ResponseWriter, r *http.Request, v interface{}) error {
var codec encoding.Codec
for _, accept := range r.Header[acceptHeader] {
if codec = encoding.GetCodec(contentSubtype(accept)); codec != nil {
break
}
}
if codec == nil {
codec = encoding.GetCodec("json")
}
codec := codecForRequest(r)
data, err := codec.Marshal(v)
if err != nil {
return err
}
w.Header().Set(contentTypeHeader, contentType(codec.Name()))
w.Write(data)
_, _ = w.Write(data)
return nil
}

// encodeError encodes the erorr to the HTTP response.
// encodeError encodes the error to the HTTP response.
func encodeError(w http.ResponseWriter, r *http.Request, err error) {
se, ok := errors.FromError(err)
if !ok {
Expand All @@ -122,8 +115,25 @@ func encodeError(w http.ResponseWriter, r *http.Request, err error) {
Message: err.Error(),
}
}
codec := codecForRequest(r)
data, _ := codec.Marshal(se)
w.Header().Set(contentTypeHeader, contentType(codec.Name()))
w.WriteHeader(se.HTTPStatus())
encodeResponse(w, r, se)
_, _ = w.Write(data)
}

// codecForRequest get encoding.Codec via http.Request
func codecForRequest(r *http.Request) encoding.Codec {
var codec encoding.Codec
for _, accept := range r.Header[acceptHeader] {
if codec = encoding.GetCodec(contentSubtype(accept)); codec != nil {
break
}
}
if codec == nil {
codec = encoding.GetCodec(json.Name)
}
return codec
}

func contentType(subtype string) string {
Expand Down

0 comments on commit 4e2ae20

Please sign in to comment.