mirror of
https://github.com/labstack/echo.git
synced 2025-01-01 22:09:21 +02:00
6d9e043284
This reintroduces support for Go modules, as v4. CloseNotifier() is removed as it has been obsoleted, see https://golang.org/doc/go1.11#net/http It was already NOT working (not sending signals) as of 1.11 the functionality was gone, we merely deleted the functions that exposed it. If anyone still relies on it they should migrate to using `c.Request().Context().Done()` instead. Closes #1268, #1255
105 lines
2.8 KiB
Go
105 lines
2.8 KiB
Go
package middleware
|
|
|
|
import (
|
|
"bytes"
|
|
"compress/gzip"
|
|
"io/ioutil"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"testing"
|
|
|
|
"github.com/labstack/echo/v4"
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func TestGzip(t *testing.T) {
|
|
e := echo.New()
|
|
req := httptest.NewRequest(http.MethodGet, "/", nil)
|
|
rec := httptest.NewRecorder()
|
|
c := e.NewContext(req, rec)
|
|
|
|
// Skip if no Accept-Encoding header
|
|
h := Gzip()(func(c echo.Context) error {
|
|
c.Response().Write([]byte("test")) // For Content-Type sniffing
|
|
return nil
|
|
})
|
|
h(c)
|
|
|
|
assert := assert.New(t)
|
|
|
|
assert.Equal("test", rec.Body.String())
|
|
|
|
// Gzip
|
|
req = httptest.NewRequest(http.MethodGet, "/", nil)
|
|
req.Header.Set(echo.HeaderAcceptEncoding, gzipScheme)
|
|
rec = httptest.NewRecorder()
|
|
c = e.NewContext(req, rec)
|
|
h(c)
|
|
assert.Equal(gzipScheme, rec.Header().Get(echo.HeaderContentEncoding))
|
|
assert.Contains(rec.Header().Get(echo.HeaderContentType), echo.MIMETextPlain)
|
|
r, err := gzip.NewReader(rec.Body)
|
|
if assert.NoError(err) {
|
|
buf := new(bytes.Buffer)
|
|
defer r.Close()
|
|
buf.ReadFrom(r)
|
|
assert.Equal("test", buf.String())
|
|
}
|
|
}
|
|
|
|
func TestGzipNoContent(t *testing.T) {
|
|
e := echo.New()
|
|
req := httptest.NewRequest(http.MethodGet, "/", nil)
|
|
req.Header.Set(echo.HeaderAcceptEncoding, gzipScheme)
|
|
rec := httptest.NewRecorder()
|
|
c := e.NewContext(req, rec)
|
|
h := Gzip()(func(c echo.Context) error {
|
|
return c.NoContent(http.StatusNoContent)
|
|
})
|
|
if assert.NoError(t, h(c)) {
|
|
assert.Empty(t, rec.Header().Get(echo.HeaderContentEncoding))
|
|
assert.Empty(t, rec.Header().Get(echo.HeaderContentType))
|
|
assert.Equal(t, 0, len(rec.Body.Bytes()))
|
|
}
|
|
}
|
|
|
|
func TestGzipErrorReturned(t *testing.T) {
|
|
e := echo.New()
|
|
e.Use(Gzip())
|
|
e.GET("/", func(c echo.Context) error {
|
|
return echo.ErrNotFound
|
|
})
|
|
req := httptest.NewRequest(http.MethodGet, "/", nil)
|
|
req.Header.Set(echo.HeaderAcceptEncoding, gzipScheme)
|
|
rec := httptest.NewRecorder()
|
|
e.ServeHTTP(rec, req)
|
|
assert.Equal(t, http.StatusNotFound, rec.Code)
|
|
assert.Empty(t, rec.Header().Get(echo.HeaderContentEncoding))
|
|
}
|
|
|
|
// Issue #806
|
|
func TestGzipWithStatic(t *testing.T) {
|
|
e := echo.New()
|
|
e.Use(Gzip())
|
|
e.Static("/test", "../_fixture/images")
|
|
req := httptest.NewRequest(http.MethodGet, "/test/walle.png", nil)
|
|
req.Header.Set(echo.HeaderAcceptEncoding, gzipScheme)
|
|
rec := httptest.NewRecorder()
|
|
e.ServeHTTP(rec, req)
|
|
assert.Equal(t, http.StatusOK, rec.Code)
|
|
// Data is written out in chunks when Content-Length == "", so only
|
|
// validate the content length if it's not set.
|
|
if cl := rec.Header().Get("Content-Length"); cl != "" {
|
|
assert.Equal(t, cl, rec.Body.Len())
|
|
}
|
|
r, err := gzip.NewReader(rec.Body)
|
|
if assert.NoError(t, err) {
|
|
defer r.Close()
|
|
want, err := ioutil.ReadFile("../_fixture/images/walle.png")
|
|
if assert.NoError(t, err) {
|
|
buf := new(bytes.Buffer)
|
|
buf.ReadFrom(r)
|
|
assert.Equal(t, want, buf.Bytes())
|
|
}
|
|
}
|
|
}
|