mirror of
https://github.com/kataras/iris.git
synced 2025-12-28 07:17:06 +00:00
file-server: fix ShowList on root dir
Former-commit-id: 6795382235d76942bcfd31ecc0b4ab02ecb85a8a
This commit is contained in:
@@ -390,12 +390,11 @@ func (api *APIBuilder) HandleMany(methodOrMulti string, relativePathorMulti stri
|
||||
//
|
||||
// api.HandleDir("/static", "./assets", DirOptions {ShowList: true, Gzip: true, IndexName: "index.html"})
|
||||
//
|
||||
// Returns the GET *Route.
|
||||
// Returns all the registered routes, including GET index and path patterm and HEAD.
|
||||
//
|
||||
// Examples can be found at: https://github.com/kataras/iris/tree/master/_examples/file-server
|
||||
func (api *APIBuilder) HandleDir(requestPath, directory string, opts ...DirOptions) (getRoute *Route) {
|
||||
func (api *APIBuilder) HandleDir(requestPath, directory string, opts ...DirOptions) (routes []*Route) {
|
||||
options := getDirOptions(opts...)
|
||||
|
||||
h := FileServer(directory, options)
|
||||
description := directory
|
||||
fileName, lineNumber := context.HandlerFileLine(h) // take those before StripPrefix.
|
||||
@@ -408,42 +407,15 @@ func (api *APIBuilder) HandleDir(requestPath, directory string, opts ...DirOptio
|
||||
h = StripPrefix(fullpath, h)
|
||||
}
|
||||
|
||||
requestPath = joinPath(requestPath, WildcardFileParam())
|
||||
routes := api.CreateRoutes([]string{http.MethodGet, http.MethodHead}, requestPath, h)
|
||||
getRoute = routes[0]
|
||||
// we get all index, including sub directories even if those
|
||||
// are already managed by the static handler itself.
|
||||
staticSites := context.GetStaticSites(directory, getRoute.StaticPath(), options.IndexName)
|
||||
for _, s := range staticSites {
|
||||
// if the end-dev did manage that index route manually already
|
||||
// then skip the auto-registration.
|
||||
//
|
||||
// Also keep note that end-dev is still able to replace this route and manage by him/herself
|
||||
// later on by a simple `Handle/Get/` call, refer to `repository#register`.
|
||||
if api.GetRouteByPath(s.RequestPath) != nil {
|
||||
continue
|
||||
}
|
||||
|
||||
if n := len(api.relativePath); n > 0 && api.relativePath[n-1] == SubdomainPrefix[0] {
|
||||
// this api is a subdomain-based.
|
||||
slashIdx := strings.IndexByte(s.RequestPath, '/')
|
||||
if slashIdx == -1 {
|
||||
slashIdx = 0
|
||||
}
|
||||
|
||||
requestPath = s.RequestPath[slashIdx:]
|
||||
} else {
|
||||
requestPath = s.RequestPath[strings.Index(s.RequestPath, api.relativePath)+len(api.relativePath):]
|
||||
}
|
||||
|
||||
if requestPath == "" {
|
||||
requestPath = "/"
|
||||
}
|
||||
|
||||
routes = append(routes, api.CreateRoutes([]string{http.MethodGet}, requestPath, h)...)
|
||||
getRoute.StaticSites = append(getRoute.StaticSites, s)
|
||||
if api.GetRouteByPath(fullpath) == nil {
|
||||
// register index if not registered by the end-developer.
|
||||
routes = api.CreateRoutes([]string{http.MethodGet, http.MethodHead}, requestPath, h)
|
||||
}
|
||||
|
||||
requestPath = joinPath(requestPath, WildcardFileParam())
|
||||
|
||||
routes = append(routes, api.CreateRoutes([]string{http.MethodGet, http.MethodHead}, requestPath, h)...)
|
||||
|
||||
for _, route := range routes {
|
||||
if route.Method == http.MethodHead {
|
||||
} else {
|
||||
@@ -457,7 +429,7 @@ func (api *APIBuilder) HandleDir(requestPath, directory string, opts ...DirOptio
|
||||
}
|
||||
}
|
||||
|
||||
return getRoute
|
||||
return routes
|
||||
}
|
||||
|
||||
// CreateRoutes returns a list of Party-based Routes.
|
||||
|
||||
@@ -316,10 +316,22 @@ func FileServer(directory string, opts ...DirOptions) context.Handler {
|
||||
if d.IsDir() {
|
||||
name += "/"
|
||||
}
|
||||
|
||||
upath := ""
|
||||
// if ctx.Path() == "/" && dirName == strings.TrimPrefix(directory, "./") {
|
||||
if ctx.Path() == "/" {
|
||||
upath = ctx.GetCurrentRoute().StaticPath() + "/" + name
|
||||
} else {
|
||||
upath = "./" + dirName + "/" + name
|
||||
}
|
||||
|
||||
url := url.URL{
|
||||
Path: upath,
|
||||
} // edit here to redirect correctly, standard library misses that.
|
||||
|
||||
// name may contain '?' or '#', which must be escaped to remain
|
||||
// part of the URL path, and not indicate the start of a query
|
||||
// string or fragment.
|
||||
url := url.URL{Path: joinPath("./"+dirName, name)} // edit here to redirect correctly, standard library misses that.
|
||||
_, err = ctx.Writef("<a href=\"%s\">%s</a>\n", url.String(), htmlReplacer.Replace(name))
|
||||
if err != nil {
|
||||
return err
|
||||
|
||||
@@ -152,14 +152,14 @@ type Party interface {
|
||||
// second parameter : the system or the embedded directory that needs to be served
|
||||
// third parameter : not required, the directory options, set fields is optional.
|
||||
//
|
||||
// for more options look router.FileServer.
|
||||
// Alternatively, to get just the handler for that look the FileServer function instead.
|
||||
//
|
||||
// api.HandleDir("/static", "./assets", DirOptions {ShowList: true, Gzip: true, IndexName: "index.html"})
|
||||
//
|
||||
// Returns the GET *Route.
|
||||
// Returns all the registered routes, including GET index and path patterm and HEAD.
|
||||
//
|
||||
// Examples can be found at: https://github.com/kataras/iris/tree/master/_examples/file-server
|
||||
HandleDir(requestPath, directory string, opts ...DirOptions) *Route
|
||||
HandleDir(requestPath, directory string, opts ...DirOptions) []*Route
|
||||
|
||||
// None registers an "offline" route
|
||||
// see context.ExecRoute(routeName) and
|
||||
|
||||
@@ -51,13 +51,7 @@ type Route struct {
|
||||
RegisterFileName string `json:"registerFileName"`
|
||||
RegisterLineNumber int `json:"registerLineNumber"`
|
||||
|
||||
// StaticSites if not empty, refers to the system (or virtual if embedded) directory
|
||||
// and sub directories that this "GET" route was registered to serve files and folders
|
||||
// that contain index.html (a site). The index handler may registered by other
|
||||
// route, manually or automatic by the framework,
|
||||
// get the route by `Application#GetRouteByPath(staticSite.RequestPath)`.
|
||||
StaticSites []context.StaticSite `json:"staticSites"`
|
||||
topLink *Route
|
||||
topLink *Route
|
||||
|
||||
// Sitemap properties: https://www.sitemaps.org/protocol.html
|
||||
LastMod time.Time `json:"lastMod,omitempty"`
|
||||
@@ -521,10 +515,6 @@ func (rd routeReadOnlyWrapper) MainHandlerIndex() int {
|
||||
return rd.Route.MainHandlerIndex
|
||||
}
|
||||
|
||||
func (rd routeReadOnlyWrapper) StaticSites() []context.StaticSite {
|
||||
return rd.Route.StaticSites
|
||||
}
|
||||
|
||||
func (rd routeReadOnlyWrapper) GetLastMod() time.Time {
|
||||
return rd.Route.LastMod
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user