Skip to content

Commit c654c42

Browse files
committed
More coverage and better response adapter for standard/response
Signed-off-by: Vishal Rana <[email protected]>
1 parent 8fbe719 commit c654c42

File tree

7 files changed

+139
-47
lines changed

7 files changed

+139
-47
lines changed

engine/fasthttp/response.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ func (r *Response) WriteHeader(code int) {
5252

5353
// Write implements `engine.Response#Write` function.
5454
func (r *Response) Write(b []byte) (n int, err error) {
55-
if !r.Committed() {
55+
if !r.committed {
5656
r.WriteHeader(http.StatusOK)
5757
}
5858
n, err = r.writer.Write(b)

engine/standard/response.go

Lines changed: 13 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ type (
1414
// Response implements `engine.Response`.
1515
Response struct {
1616
http.ResponseWriter
17+
adapter *responseAdapter
1718
header engine.Header
1819
status int
1920
size int64
@@ -23,19 +24,20 @@ type (
2324
}
2425

2526
responseAdapter struct {
26-
http.ResponseWriter
27-
response *Response
27+
*Response
2828
}
2929
)
3030

3131
// NewResponse returns `Response` instance.
32-
func NewResponse(w http.ResponseWriter, l log.Logger) *Response {
33-
return &Response{
32+
func NewResponse(w http.ResponseWriter, l log.Logger) (r *Response) {
33+
r = &Response{
3434
ResponseWriter: w,
3535
header: &Header{Header: w.Header()},
3636
writer: w,
3737
logger: l,
3838
}
39+
r.adapter = &responseAdapter{Response: r}
40+
return
3941
}
4042

4143
// Header implements `engine.Response#Header` function.
@@ -56,7 +58,7 @@ func (r *Response) WriteHeader(code int) {
5658

5759
// Write implements `engine.Response#Write` function.
5860
func (r *Response) Write(b []byte) (n int, err error) {
59-
if !r.Committed() {
61+
if !r.committed {
6062
r.WriteHeader(http.StatusOK)
6163
}
6264
n, err = r.writer.Write(b)
@@ -126,31 +128,19 @@ func (r *Response) CloseNotify() <-chan bool {
126128
}
127129

128130
func (r *Response) reset(w http.ResponseWriter, a *responseAdapter, h engine.Header) {
129-
r.ResponseWriter = a
131+
r.ResponseWriter = w
132+
r.adapter = a
130133
r.header = h
131134
r.status = http.StatusOK
132135
r.size = 0
133136
r.committed = false
134137
r.writer = w
135138
}
136139

137-
func (a *responseAdapter) Write(b []byte) (n int, err error) {
138-
return a.response.Write(b)
139-
}
140-
141-
func (a *responseAdapter) Flush() {
142-
a.ResponseWriter.(http.Flusher).Flush()
143-
}
144-
145-
func (a *responseAdapter) Hijack() (net.Conn, *bufio.ReadWriter, error) {
146-
return a.ResponseWriter.(http.Hijacker).Hijack()
147-
}
148-
149-
func (a *responseAdapter) CloseNotify() <-chan bool {
150-
return a.ResponseWriter.(http.CloseNotifier).CloseNotify()
140+
func (r *responseAdapter) Header() http.Header {
141+
return r.ResponseWriter.Header()
151142
}
152143

153-
func (a *responseAdapter) reset(w http.ResponseWriter, r *Response) {
154-
a.ResponseWriter = w
155-
a.response = r
144+
func (r *responseAdapter) reset(res *Response) {
145+
r.Response = res
156146
}

engine/standard/response_test.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
11
package standard
22

33
import (
4-
"github.com/labstack/gommon/log"
5-
"github.com/stretchr/testify/assert"
64
"io/ioutil"
75
"net/http"
86
"net/http/httptest"
97
"testing"
108
"time"
9+
10+
"github.com/labstack/gommon/log"
11+
"github.com/stretchr/testify/assert"
1112
)
1213

13-
func TestResponse_WriteHeader(t *testing.T) {
14+
func TestResponseWriteHeader(t *testing.T) {
1415
recorder := httptest.NewRecorder()
1516
resp := NewResponse(recorder, log.New("echo"))
1617

@@ -20,7 +21,7 @@ func TestResponse_WriteHeader(t *testing.T) {
2021
assert.True(t, resp.Committed())
2122
}
2223

23-
func TestResponse_Write(t *testing.T) {
24+
func TestResponseWrite(t *testing.T) {
2425
recorder := httptest.NewRecorder()
2526
resp := NewResponse(recorder, log.New("echo"))
2627
resp.Write([]byte("Hello"))
@@ -32,7 +33,7 @@ func TestResponse_Write(t *testing.T) {
3233
assert.True(t, recorder.Flushed)
3334
}
3435

35-
func TestResponse_SetCookie(t *testing.T) {
36+
func TestResponseSetCookie(t *testing.T) {
3637
recorder := httptest.NewRecorder()
3738
resp := NewResponse(recorder, log.New("echo"))
3839

engine/standard/server.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
130130
// Response
131131
res := s.pool.response.Get().(*Response)
132132
resAdpt := s.pool.responseAdapter.Get().(*responseAdapter)
133-
resAdpt.reset(w, res)
133+
resAdpt.reset(res)
134134
resHdr := s.pool.header.Get().(*Header)
135135
resHdr.reset(w.Header())
136136
res.reset(w, resAdpt, resHdr)
@@ -150,7 +150,7 @@ func WrapHandler(h http.Handler) echo.HandlerFunc {
150150
return func(c echo.Context) error {
151151
req := c.Request().(*Request)
152152
res := c.Response().(*Response)
153-
h.ServeHTTP(res.ResponseWriter, req.Request)
153+
h.ServeHTTP(res.adapter, req.Request)
154154
return nil
155155
}
156156
}

middleware/compress_test.go

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package middleware
33
import (
44
"bytes"
55
"compress/gzip"
6-
"io/ioutil"
76
"net/http"
87
"testing"
98

@@ -52,13 +51,10 @@ func TestGzipNoContent(t *testing.T) {
5251
h := Gzip()(func(c echo.Context) error {
5352
return c.NoContent(http.StatusOK)
5453
})
55-
h(c)
56-
57-
assert.Empty(t, rec.Header().Get(echo.HeaderContentEncoding))
58-
assert.Empty(t, rec.Header().Get(echo.HeaderContentType))
59-
b, err := ioutil.ReadAll(rec.Body)
60-
if assert.NoError(t, err) {
61-
assert.Equal(t, 0, len(b))
54+
if assert.NoError(t, h(c)) {
55+
assert.Empty(t, rec.Header().Get(echo.HeaderContentEncoding))
56+
assert.Empty(t, rec.Header().Get(echo.HeaderContentType))
57+
assert.Equal(t, 0, len(rec.Body.Bytes()))
6258
}
6359
}
6460

@@ -71,10 +67,6 @@ func TestGzipErrorReturned(t *testing.T) {
7167
req := test.NewRequest(echo.GET, "/", nil)
7268
rec := test.NewResponseRecorder()
7369
e.ServeHTTP(req, rec)
74-
7570
assert.Empty(t, rec.Header().Get(echo.HeaderContentEncoding))
76-
b, err := ioutil.ReadAll(rec.Body)
77-
if assert.NoError(t, err) {
78-
assert.Equal(t, "error", string(b))
79-
}
71+
assert.Equal(t, "error", rec.Body.String())
8072
}

middleware/csrf_test.go

Lines changed: 46 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package middleware
22

33
import (
44
"net/http"
5+
"net/url"
6+
"strings"
57
"testing"
68

79
"github.com/labstack/echo"
@@ -14,11 +16,20 @@ func TestCSRF(t *testing.T) {
1416
req := test.NewRequest(echo.GET, "/", nil)
1517
rec := test.NewResponseRecorder()
1618
c := e.NewContext(req, rec)
17-
csrf := CSRF([]byte("secret"))
19+
csrf := CSRFWithConfig(CSRFConfig{
20+
Secret: []byte("secret"),
21+
CookiePath: "/",
22+
CookieDomain: "labstack.com",
23+
})
1824
h := csrf(func(c echo.Context) error {
1925
return c.String(http.StatusOK, "test")
2026
})
2127

28+
// No secret
29+
assert.Panics(t, func() {
30+
CSRF(nil)
31+
})
32+
2233
// Generate CSRF token
2334
h(c)
2435
assert.Contains(t, rec.Header().Get(echo.HeaderSetCookie), "csrf")
@@ -35,6 +46,38 @@ func TestCSRF(t *testing.T) {
3546
salt, _ := generateSalt(8)
3647
token := generateCSRFToken([]byte("secret"), salt)
3748
req.Header().Set(echo.HeaderXCSRFToken, token)
38-
h(c)
39-
assert.Equal(t, http.StatusOK, rec.Status())
49+
if assert.NoError(t, h(c)) {
50+
assert.Equal(t, http.StatusOK, rec.Status())
51+
}
52+
}
53+
54+
func TestCSRFTokenFromForm(t *testing.T) {
55+
f := make(url.Values)
56+
f.Set("csrf", "token")
57+
e := echo.New()
58+
req := test.NewRequest(echo.POST, "/", strings.NewReader(f.Encode()))
59+
req.Header().Add(echo.HeaderContentType, echo.MIMEApplicationForm)
60+
c := e.NewContext(req, nil)
61+
token, err := csrfTokenFromForm("csrf")(c)
62+
if assert.NoError(t, err) {
63+
assert.Equal(t, "token", token)
64+
}
65+
token, err = csrfTokenFromForm("invalid")(c)
66+
assert.Error(t, err)
67+
}
68+
69+
func TestCSRFTokenFromQuery(t *testing.T) {
70+
q := make(url.Values)
71+
q.Set("csrf", "token")
72+
e := echo.New()
73+
req := test.NewRequest(echo.GET, "/?"+q.Encode(), nil)
74+
req.Header().Add(echo.HeaderContentType, echo.MIMEApplicationForm)
75+
c := e.NewContext(req, nil)
76+
token, err := csrfTokenFromQuery("csrf")(c)
77+
if assert.NoError(t, err) {
78+
assert.Equal(t, "token", token)
79+
}
80+
token, err = csrfTokenFromQuery("invalid")(c)
81+
assert.Error(t, err)
82+
csrfTokenFromQuery("csrf")
4083
}

middleware/static_test.go

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,67 @@
11
package middleware
2+
3+
import (
4+
"net/http"
5+
"testing"
6+
7+
"github.com/labstack/echo"
8+
"github.com/labstack/echo/test"
9+
"github.com/stretchr/testify/assert"
10+
)
11+
12+
func TestStatic(t *testing.T) {
13+
e := echo.New()
14+
req := test.NewRequest(echo.GET, "/", nil)
15+
rec := test.NewResponseRecorder()
16+
c := e.NewContext(req, rec)
17+
h := Static("../_fixture")(func(c echo.Context) error {
18+
return echo.ErrNotFound
19+
})
20+
21+
// Directory
22+
if assert.NoError(t, h(c)) {
23+
assert.Contains(t, rec.Body.String(), "Echo")
24+
}
25+
26+
// HTML5 mode
27+
req = test.NewRequest(echo.GET, "/client", nil)
28+
rec = test.NewResponseRecorder()
29+
c = e.NewContext(req, rec)
30+
static := StaticWithConfig(StaticConfig{
31+
Root: "../_fixture",
32+
HTML5: true,
33+
})
34+
h = static(func(c echo.Context) error {
35+
return echo.ErrNotFound
36+
})
37+
if assert.NoError(t, h(c)) {
38+
assert.Equal(t, http.StatusOK, rec.Status())
39+
}
40+
41+
// Browse
42+
req = test.NewRequest(echo.GET, "/", nil)
43+
rec = test.NewResponseRecorder()
44+
c = e.NewContext(req, rec)
45+
static = StaticWithConfig(StaticConfig{
46+
Root: "../_fixture/images",
47+
Browse: true,
48+
})
49+
h = static(func(c echo.Context) error {
50+
return echo.ErrNotFound
51+
})
52+
if assert.NoError(t, h(c)) {
53+
assert.Contains(t, rec.Body.String(), "walle")
54+
}
55+
56+
// Not found
57+
req = test.NewRequest(echo.GET, "/not-found", nil)
58+
rec = test.NewResponseRecorder()
59+
c = e.NewContext(req, rec)
60+
static = StaticWithConfig(StaticConfig{
61+
Root: "../_fixture/images",
62+
})
63+
h = static(func(c echo.Context) error {
64+
return echo.ErrNotFound
65+
})
66+
assert.Error(t, h(c))
67+
}

0 commit comments

Comments
 (0)