Comments (5)
This is not how static middleware is indented to work. If you need this logic I suggest taking https://github.com/labstack/echo/blob/master/middleware/static.go that middleware code and strip it only to logic necessary for your requirements (only block related to configuration flags that you use) and add retry for .html
from echo.
ps. if you are not building an API and only need to serve static files I think using Nginx, Apache, Caddy etc would be more suitable.
from echo.
ps. if you are not building an API and only need to serve static files I think using Nginx, Apache, Caddy etc would be more suitable.
No, I have handler that serving API backend calls. And I am no claiming that the current behavior is a bug (hence the "Question:" in the title). I just want to understand how it should be implemented following the design ideas of Echo.
I tried to use Echo#Static and Echo#File that look like the methods designed to address this function. But these calls do not change the behavior.
If you need this logic I suggest taking https://github.com/labstack/echo/blob/master/middleware/static.go that middleware code and strip it only to logic necessary for your requirements (only block related to configuration flags that you use) and add retry for .html
Are you proposing to wrap or replace StaticWithConfig
call with code that serves the described logic? What the above method Echo#File
and Echo#Static
are for? Can they be used with StaticWithConfig
?
from echo.
You might want to try this. This mw tries ".html" as fallback. it is not designed to be added to specific group or handler.
func myStaticMw(next echo.HandlerFunc) echo.HandlerFunc {
mwFs := http.Dir("./")
rootFolder := "_fixture"
rootIndex := path.Join(rootFolder, "index.html")
return func(c echo.Context) error {
if c.Path() != "" {
return next(c)
}
p, err := url.PathUnescape(c.Request().URL.Path)
if err != nil {
return err
}
name := path.Join(rootFolder, path.Clean("./"+p))
file, err := mwFs.Open(name)
if err != nil {
if !os.IsNotExist(err) {
return err
}
if !strings.HasSuffix(name, ".html") {
file, err = mwFs.Open(name + ".html")
}
}
if err != nil {
if !os.IsNotExist(err) {
return err
}
file, err = mwFs.Open(rootIndex)
if err != nil {
return err
}
}
defer file.Close()
info, err := file.Stat()
if err != nil {
return err
}
if info.IsDir() {
index, err := mwFs.Open(path.Join(name, "index.html"))
if err != nil {
// FIXME: listing files in directory is not implemented
return next(c)
}
defer index.Close()
info, err = index.Stat()
if err != nil {
return err
}
http.ServeContent(c.Response(), c.Request(), info.Name(), info.ModTime(), index)
return nil
}
http.ServeContent(c.Response(), c.Request(), info.Name(), info.ModTime(), file)
return nil
}
}
func main() {
e := echo.New()
e.Use(middleware.Logger())
e.Use(middleware.Recover())
e.Use(myStaticMw)
e.GET("/api/*", func(c echo.Context) error {
return c.JSON(http.StatusOK, []string{c.Path()})
})
s := http.Server{
Addr: ":8080",
Handler: e,
}
if err := s.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) {
log.Fatal(err)
}
}
from echo.
Thank you. It looks like the recommended way is to replace the currently used WithStaticConfig middleware with a customized version.
Thank you. Given this is the recommended approach, I will close the issue. Would you mind to comment here about the use cases for Echo#Static and Echo#File functions?
from echo.
Related Issues (20)
- echo v4 websocket client closed, program exited HOT 3
- router not setting ContextKeyHeaderAllow for group, causing cors preflight to not work HOT 6
- Static file has wrong body returned when using a custom HTTP Error Handler and complex paths HOT 2
- QueryParams seem to override formValues HOT 3
- DefaultHTTPErrorHandler does not log HOT 3
- Support Casbin Authorization Middleware HOT 1
- Echo response object calls flush on unflushable objects HOT 7
- Feature request: support Yaml responses transparently. HOT 1
- static middleware: path ist unescaped twice for file names, leading to not downloadable content
- CSRF middleware form lookup consumes all the request body HOT 1
- Omitempty in form HOT 1
- Return error if reverse() does not find a match HOT 9
- How to read a path param with echo that can contain slashes? HOT 3
- Unclear behaviour of `*` in routes HOT 7
- middleware.CORSConfig can not be configured per path HOT 3
- Is there any plan to facilitate responses in the Protobuf data format? HOT 2
- When `c.bind()` fails with a type error on POST'd form data the `inputfieldname` is not available HOT 3
- Using static middleware, does not raise handler at '/*' path HOT 13
- proposal: Micro-optimization for better memory utilization HOT 4
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from echo.