Require trailing slash when specifying directory path
This commit is contained in:
parent
3a46bd1de8
commit
a96e2123fb
3 changed files with 23 additions and 14 deletions
|
@ -29,9 +29,12 @@ Hosts are defined by their hostname followed by one or more paths to serve.
|
|||
|
||||
Paths may be defined as fixed strings or regular expressions (starting with `^`).
|
||||
|
||||
Paths are matched in the order they are defined.
|
||||
Any path not matching a specific page, file name or file extension should end
|
||||
in a trailing slash, signifying that it is a directory. Visitors are
|
||||
automatically redirected when accessing a directory path without including a
|
||||
trailing slash.
|
||||
|
||||
Fixed string paths will match with and without a trailing slash.
|
||||
Paths are matched in the order they are defined.
|
||||
|
||||
When accessing a directory the file `index.gemini` or `index.gmi` is served.
|
||||
|
||||
|
@ -223,18 +226,18 @@ hosts:
|
|||
root: /home/geminirocks/public_html
|
||||
fastcgi: unix:///var/run/php.sock
|
||||
-
|
||||
path: /files
|
||||
path: /files/
|
||||
root: /home/geminirocks/files
|
||||
cache: 604800 # Cache for 1 week
|
||||
list: true # Enable directory listing
|
||||
-
|
||||
path: ^/(help|info)$
|
||||
path: ^/(help|info)/$
|
||||
root: /home/geminirocks/docs/help
|
||||
-
|
||||
path: ^/proxy-example$
|
||||
path: /proxy-example/
|
||||
proxy: gemini://localhost:1966
|
||||
-
|
||||
path: ^/cmd-example$
|
||||
path: /cmd-example
|
||||
command: uname -a
|
||||
cache: 0 # Do not cache
|
||||
-
|
||||
|
|
|
@ -214,9 +214,6 @@ func readconfig(configPath string) error {
|
|||
if serve.Path == "" {
|
||||
log.Fatal("a path must be specified in each serve entry")
|
||||
}
|
||||
if len(serve.Path) > 1 && serve.Path[len(serve.Path)-1] == '/' {
|
||||
serve.Path = serve.Path[:len(serve.Path)-1]
|
||||
}
|
||||
if serve.Path[0] == '^' {
|
||||
serve.r = regexp.MustCompile(serve.Path)
|
||||
}
|
||||
|
|
19
server.go
19
server.go
|
@ -133,9 +133,6 @@ func servePath(c *tls.Conn, request *url.URL, serve *pathConfig) (int, int64) {
|
|||
if serve.Path[0] == '/' {
|
||||
pathSlashes++ // Regexp does not match starting slash
|
||||
}
|
||||
if serve.Path[0] != '^' && serve.Path[len(serve.Path)-1] != '/' {
|
||||
pathSlashes++
|
||||
}
|
||||
}
|
||||
if len(requestSplit) >= pathSlashes {
|
||||
resolvedPath = strings.Join(requestSplit[pathSlashes:], "/")
|
||||
|
@ -262,15 +259,27 @@ func handleRequest(c *tls.Conn, request *url.URL, requestData string) (int, int6
|
|||
matchedRegexp := serve.r != nil && serve.r.Match(pathBytes)
|
||||
matchedPrefix := serve.r == nil && strings.HasPrefix(request.Path, serve.Path)
|
||||
if !matchedRegexp && !matchedPrefix {
|
||||
matchedRegexp = serve.r != nil && serve.r.Match(append(pathBytes[:], byte('/')))
|
||||
matchedPrefix = serve.r == nil && strings.HasPrefix(request.Path+"/", serve.Path)
|
||||
if matchedRegexp || matchedPrefix {
|
||||
newRequest, err := url.Parse(request.String())
|
||||
if err != nil {
|
||||
return writeStatus(c, statusBadRequest), -1, ""
|
||||
}
|
||||
newRequest.Path += "/"
|
||||
|
||||
return writeHeader(c, statusRedirectTemporary, newRequest.String()), -1, serve.Log
|
||||
}
|
||||
|
||||
continue
|
||||
}
|
||||
|
||||
requireInput := serve.Input != "" || serve.SensitiveInput != ""
|
||||
if request.RawQuery == "" && requireInput {
|
||||
if serve.SensitiveInput != "" {
|
||||
return writeHeader(c, statusSensitiveInput, serve.SensitiveInput), -1, ""
|
||||
return writeHeader(c, statusSensitiveInput, serve.SensitiveInput), -1, serve.Log
|
||||
}
|
||||
return writeHeader(c, statusInput, serve.Input), -1, ""
|
||||
return writeHeader(c, statusInput, serve.Input), -1, serve.Log
|
||||
}
|
||||
|
||||
if matchedRegexp || matchedPrefix {
|
||||
|
|
Loading…
Reference in a new issue