mirror of
				https://github.com/labstack/echo.git
				synced 2025-10-30 23:57:38 +02:00 
			
		
		
		
	Signed-off-by: Vishal Rana <vr@labstack.com>
This commit is contained in:
		
							
								
								
									
										3
									
								
								echo.go
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								echo.go
									
									
									
									
									
								
							| @@ -283,7 +283,7 @@ func (e *Echo) WebSocket(path string, h HandlerFunc) { | |||||||
| 				err = h(c) | 				err = h(c) | ||||||
| 			}, | 			}, | ||||||
| 		} | 		} | ||||||
| 		wss.ServeHTTP(c.response.writer, c.request) | 		wss.ServeHTTP(c.response, c.request) | ||||||
| 		return err | 		return err | ||||||
| 	}) | 	}) | ||||||
| } | } | ||||||
| @@ -400,7 +400,6 @@ func (e *Echo) ServeHTTP(w http.ResponseWriter, r *http.Request) { | |||||||
| 	} | 	} | ||||||
| 	c.reset(r, w, e) | 	c.reset(r, w, e) | ||||||
| 	if h == nil { | 	if h == nil { | ||||||
| 		c.response.status = http.StatusNotFound // Helpful to skip middleware |  | ||||||
| 		h = e.notFoundHandler | 		h = e.notFoundHandler | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|   | |||||||
| @@ -64,6 +64,7 @@ func main() { | |||||||
| 	// Middleware | 	// Middleware | ||||||
| 	e.Use(mw.Logger()) | 	e.Use(mw.Logger()) | ||||||
| 	e.Use(mw.Recover()) | 	e.Use(mw.Recover()) | ||||||
|  | 	e.Use(mw.Gzip()) | ||||||
|  |  | ||||||
| 	//------------------------ | 	//------------------------ | ||||||
| 	// Third-party middleware | 	// Third-party middleware | ||||||
|   | |||||||
							
								
								
									
										18
									
								
								examples/websocket/server.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								examples/websocket/server.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | |||||||
|  | package main | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"github.com/labstack/echo" | ||||||
|  | 	"io" | ||||||
|  | 	mw "github.com/labstack/echo/middleware" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | func main() { | ||||||
|  | 	e := echo.New() | ||||||
|  | 	e.Use(mw.Logger()) | ||||||
|  | 	e.Use(mw.Gzip()) | ||||||
|  | 	e.WebSocket("/ws", func(c *echo.Context) error { | ||||||
|  | 		io.Copy(c.Socket(), c.Socket()) | ||||||
|  | 		return nil | ||||||
|  | 	}) | ||||||
|  | 	e.Run(":1323") | ||||||
|  | } | ||||||
| @@ -2,12 +2,15 @@ package middleware | |||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"compress/gzip" | 	"compress/gzip" | ||||||
| 	"io" |  | ||||||
| 	"strings" | 	"strings" | ||||||
|  |  | ||||||
| 	"net/http" | 	"net/http" | ||||||
|  |  | ||||||
|  | 	"bufio" | ||||||
|  | 	"net" | ||||||
|  |  | ||||||
| 	"github.com/labstack/echo" | 	"github.com/labstack/echo" | ||||||
|  | 	"io" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| type ( | type ( | ||||||
| @@ -21,6 +24,18 @@ func (w gzipWriter) Write(b []byte) (int, error) { | |||||||
| 	return w.Writer.Write(b) | 	return w.Writer.Write(b) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func (w gzipWriter) Flush() { | ||||||
|  | 	w.Writer.(*gzip.Writer).Flush() | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (w gzipWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) { | ||||||
|  | 	return w.ResponseWriter.(http.Hijacker).Hijack() | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (w *gzipWriter) CloseNotify() <-chan bool { | ||||||
|  | 	return w.ResponseWriter.(http.CloseNotifier).CloseNotify() | ||||||
|  | } | ||||||
|  |  | ||||||
| // Gzip returns a middleware which compresses HTTP response using gzip compression | // Gzip returns a middleware which compresses HTTP response using gzip compression | ||||||
| // scheme. | // scheme. | ||||||
| func Gzip() echo.MiddlewareFunc { | func Gzip() echo.MiddlewareFunc { | ||||||
| @@ -28,16 +43,17 @@ func Gzip() echo.MiddlewareFunc { | |||||||
|  |  | ||||||
| 	return func(h echo.HandlerFunc) echo.HandlerFunc { | 	return func(h echo.HandlerFunc) echo.HandlerFunc { | ||||||
| 		return func(c *echo.Context) error { | 		return func(c *echo.Context) error { | ||||||
| 			if (c.Request().Header.Get(echo.Upgrade)) != echo.WebSocket && // Skip for WebSocket | 			if strings.Contains(c.Request().Header.Get(echo.AcceptEncoding), scheme) { | ||||||
| 				strings.Contains(c.Request().Header.Get(echo.AcceptEncoding), scheme) && |  | ||||||
| 				c.Response().Status() != http.StatusNotFound { // Skip for "404 - Not Found" |  | ||||||
| 				w := gzip.NewWriter(c.Response().Writer()) | 				w := gzip.NewWriter(c.Response().Writer()) | ||||||
| 				defer w.Close() | 				defer w.Close() | ||||||
| 				gw := gzipWriter{Writer: w, ResponseWriter: c.Response().Writer()} | 				gw := gzipWriter{Writer: w, ResponseWriter: c.Response().Writer()} | ||||||
| 				c.Response().Header().Set(echo.ContentEncoding, scheme) | 				c.Response().Header().Set(echo.ContentEncoding, scheme) | ||||||
| 				c.Response().SetWriter(gw) | 				c.Response().SetWriter(gw) | ||||||
| 			} | 			} | ||||||
| 			return h(c) | 			if err := h(c); err != nil { | ||||||
|  | 				c.Error(err) | ||||||
|  | 			} | ||||||
|  | 			return nil | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|   | |||||||
| @@ -24,14 +24,6 @@ func TestGzip(t *testing.T) { | |||||||
| 	assert.Equal(t, http.StatusOK, rec.Code) | 	assert.Equal(t, http.StatusOK, rec.Code) | ||||||
| 	assert.Equal(t, "test", rec.Body.String()) | 	assert.Equal(t, "test", rec.Body.String()) | ||||||
|  |  | ||||||
| 	// Skip if WebSocket |  | ||||||
| 	rec = httptest.NewRecorder() |  | ||||||
| 	c = echo.NewContext(req, echo.NewResponse(rec), echo.New()) |  | ||||||
| 	c.Request().Header.Set(echo.Upgrade, echo.WebSocket) |  | ||||||
| 	Gzip()(h)(c) |  | ||||||
| 	assert.Equal(t, http.StatusOK, rec.Code) |  | ||||||
| 	assert.NotEqual(t, "gzip", rec.Header().Get(echo.ContentEncoding)) |  | ||||||
|  |  | ||||||
| 	// Gzip | 	// Gzip | ||||||
| 	req, _ = http.NewRequest(echo.GET, "/", nil) | 	req, _ = http.NewRequest(echo.GET, "/", nil) | ||||||
| 	req.Header.Set(echo.AcceptEncoding, "gzip") | 	req.Header.Set(echo.AcceptEncoding, "gzip") | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user