Skip to content

Commit fc7f23f

Browse files
alnraeneasr
authored andcommitted
fix: add type assert to verify JSONWriter and TextWriter actually implement the Writer interface (which TextWriter in fact didn't)
1 parent 80cc3e9 commit fc7f23f

File tree

4 files changed

+21
-39
lines changed

4 files changed

+21
-39
lines changed

error.go

Lines changed: 0 additions & 10 deletions
This file was deleted.

error_assert.go

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,9 @@ package herodot
55

66
import "github.com/pkg/errors"
77

8-
func toError(e interface{}) error {
8+
func coalesceError(e error) error {
99
if e == nil {
1010
return errors.New("Error passed to WriteErrorCode is nil")
1111
}
12-
13-
err, ok := e.(error)
14-
if !ok {
15-
return errors.New("Error passed to WriteErrorCode does not implement the error interface")
16-
}
17-
18-
return err
12+
return e
1913
}

json.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ type JSONWriter struct {
3434
EnableDebug bool
3535
}
3636

37+
var _ Writer = (*JSONWriter)(nil)
38+
3739
func NewJSONWriter(reporter ErrorReporter) *JSONWriter {
3840
writer := &JSONWriter{
3941
Reporter: reporter,
@@ -97,13 +99,11 @@ func (h *JSONWriter) WriteCreated(w http.ResponseWriter, r *http.Request, locati
9799
// asserting statusCodeCarrier. If the error does not implement statusCodeCarrier, the status code
98100
// is set to 500.
99101
func (h *JSONWriter) WriteError(w http.ResponseWriter, r *http.Request, err error, opts ...Option) {
100-
if c := statusCodeCarrier(nil); stderr.As(err, &c) {
102+
if c := StatusCodeCarrier(nil); stderr.As(err, &c) {
101103
h.WriteErrorCode(w, r, c.StatusCode(), err)
102-
return
104+
} else {
105+
h.WriteErrorCode(w, r, http.StatusInternalServerError, err, opts...)
103106
}
104-
105-
h.WriteErrorCode(w, r, http.StatusInternalServerError, err, opts...)
106-
return
107107
}
108108

109109
// WriteErrorCode writes an error to ResponseWriter and forces an error code.
@@ -116,7 +116,7 @@ func (h *JSONWriter) WriteErrorCode(w http.ResponseWriter, r *http.Request, code
116116

117117
if !o.noLog {
118118
// All errors land here, so it's a really good idea to do the logging here as well!
119-
h.Reporter.ReportError(r, code, toError(err), "An error occurred while handling a request")
119+
h.Reporter.ReportError(r, code, coalesceError(err), "An error occurred while handling a request")
120120
}
121121

122122
w.Header().Set("Content-Type", "application/json")

plain.go

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,15 @@ import (
1010
"github.com/pkg/errors"
1111
)
1212

13-
// json outputs JSON.
13+
// TextWriter outputs plain text
1414
type TextWriter struct {
1515
Reporter ErrorReporter
1616
contentType string
1717
}
1818

19-
// NewPlainWriter returns a json
19+
var _ Writer = (*TextWriter)(nil)
20+
21+
// NewTextWriter returns a plain text writer
2022
func NewTextWriter(reporter ErrorReporter, contentType string) *TextWriter {
2123
if contentType == "" {
2224
contentType = "plain"
@@ -31,12 +33,12 @@ func NewTextWriter(reporter ErrorReporter, contentType string) *TextWriter {
3133
}
3234

3335
// Write a response object to the ResponseWriter with status code 200.
34-
func (h *TextWriter) Write(w http.ResponseWriter, r *http.Request, e interface{}) {
36+
func (h *TextWriter) Write(w http.ResponseWriter, r *http.Request, e interface{}, _ ...EncoderOptions) {
3537
h.WriteCode(w, r, http.StatusOK, e)
3638
}
3739

3840
// WriteCode writes a response object to the ResponseWriter and sets a response code.
39-
func (h *TextWriter) WriteCode(w http.ResponseWriter, r *http.Request, code int, e interface{}) {
41+
func (h *TextWriter) WriteCode(w http.ResponseWriter, r *http.Request, code int, e interface{}, _ ...EncoderOptions) {
4042
if code == 0 {
4143
code = http.StatusOK
4244
}
@@ -56,29 +58,25 @@ func (h *TextWriter) WriteCreated(w http.ResponseWriter, r *http.Request, locati
5658
// WriteError writes an error to ResponseWriter and tries to extract the error's status code by
5759
// asserting statusCodeCarrier. If the error does not implement statusCodeCarrier, the status code
5860
// is set to 500.
59-
func (h *TextWriter) WriteError(w http.ResponseWriter, r *http.Request, err interface{}) {
60-
if s, ok := errors.Cause(toError(err)).(statusCodeCarrier); ok {
61+
func (h *TextWriter) WriteError(w http.ResponseWriter, r *http.Request, err error, _ ...Option) {
62+
if s, ok := errors.Cause(coalesceError(err)).(StatusCodeCarrier); ok {
6163
h.WriteErrorCode(w, r, s.StatusCode(), err)
6264
return
65+
} else {
66+
h.WriteErrorCode(w, r, http.StatusInternalServerError, err)
6367
}
64-
65-
h.WriteErrorCode(w, r, http.StatusInternalServerError, err)
66-
return
6768
}
6869

6970
// WriteErrorCode writes an error to ResponseWriter and forces an error code.
70-
func (h *TextWriter) WriteErrorCode(w http.ResponseWriter, r *http.Request, code int, err interface{}) {
71-
e := toError(err)
72-
if err == nil {
73-
err = e
74-
}
71+
func (h *TextWriter) WriteErrorCode(w http.ResponseWriter, r *http.Request, code int, err error, _ ...Option) {
72+
err = coalesceError(err)
7573

7674
if code == 0 {
7775
code = http.StatusInternalServerError
7876
}
7977

8078
// All errors land here, so it's a really good idea to do the logging here as well!
81-
h.Reporter.ReportError(r, code, e, "An error occurred while handling a request")
79+
h.Reporter.ReportError(r, code, err, "An error occurred while handling a request")
8280

8381
w.Header().Set("Content-Type", h.contentType)
8482
w.WriteHeader(code)

0 commit comments

Comments
 (0)