mirror of
https://github.com/caddyserver/caddy.git
synced 2024-12-23 22:27:38 -05:00
parent
d227bec0ff
commit
dd1c49bde9
1 changed files with 30 additions and 17 deletions
|
@ -4,6 +4,7 @@
|
||||||
package fastcgi
|
package fastcgi
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"io"
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
|
@ -46,10 +47,21 @@ func (h Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error)
|
||||||
fpath := r.URL.Path
|
fpath := r.URL.Path
|
||||||
if idx, ok := middleware.IndexFile(h.FileSys, fpath, rule.IndexFiles); ok {
|
if idx, ok := middleware.IndexFile(h.FileSys, fpath, rule.IndexFiles); ok {
|
||||||
fpath = idx
|
fpath = idx
|
||||||
|
// Index file present.
|
||||||
|
// If request path cannot be split, return error.
|
||||||
|
if !h.canSplit(fpath, rule) {
|
||||||
|
return http.StatusInternalServerError, ErrIndexMissingSplit
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// No index file present.
|
||||||
|
// If request path cannot be split, ignore request.
|
||||||
|
if !h.canSplit(fpath, rule) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// These criteria work well in this order for PHP sites
|
// These criteria work well in this order for PHP sites
|
||||||
if fpath[len(fpath)-1] == '/' || strings.HasSuffix(fpath, rule.Ext) || !h.exists(fpath) {
|
if !h.exists(fpath) || fpath[len(fpath)-1] == '/' || strings.HasSuffix(fpath, rule.Ext) {
|
||||||
|
|
||||||
// Create environment for CGI script
|
// Create environment for CGI script
|
||||||
env, err := h.buildEnv(r, rule, fpath)
|
env, err := h.buildEnv(r, rule, fpath)
|
||||||
|
@ -137,6 +149,10 @@ func (h Handler) exists(path string) bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (h Handler) canSplit(path string, rule Rule) bool {
|
||||||
|
return strings.Contains(path, rule.SplitPath)
|
||||||
|
}
|
||||||
|
|
||||||
// buildEnv returns a set of CGI environment variables for the request.
|
// buildEnv returns a set of CGI environment variables for the request.
|
||||||
func (h Handler) buildEnv(r *http.Request, rule Rule, fpath string) (map[string]string, error) {
|
func (h Handler) buildEnv(r *http.Request, rule Rule, fpath string) (map[string]string, error) {
|
||||||
var env map[string]string
|
var env map[string]string
|
||||||
|
@ -153,22 +169,15 @@ func (h Handler) buildEnv(r *http.Request, rule Rule, fpath string) (map[string]
|
||||||
ip = r.RemoteAddr
|
ip = r.RemoteAddr
|
||||||
}
|
}
|
||||||
|
|
||||||
// Split path in preparation for env variables
|
// Split path in preparation for env variables.
|
||||||
|
// Previous h.canSplit checks ensure this can never be -1.
|
||||||
splitPos := strings.Index(fpath, rule.SplitPath)
|
splitPos := strings.Index(fpath, rule.SplitPath)
|
||||||
var docURI, scriptName, scriptFilename, pathInfo string
|
|
||||||
if splitPos == -1 {
|
// Request has the extension; path was split successfully
|
||||||
// Request doesn't have the extension, so assume index file in root
|
docURI := fpath[:splitPos+len(rule.SplitPath)]
|
||||||
docURI = "/" + rule.IndexFiles[0]
|
pathInfo := fpath[splitPos+len(rule.SplitPath):]
|
||||||
scriptName = "/" + rule.IndexFiles[0]
|
scriptName := fpath
|
||||||
scriptFilename = filepath.Join(h.AbsRoot, rule.IndexFiles[0])
|
scriptFilename := absPath
|
||||||
pathInfo = fpath
|
|
||||||
} else {
|
|
||||||
// Request has the extension; path was split successfully
|
|
||||||
docURI = fpath[:splitPos+len(rule.SplitPath)]
|
|
||||||
pathInfo = fpath[splitPos+len(rule.SplitPath):]
|
|
||||||
scriptName = fpath
|
|
||||||
scriptFilename = absPath
|
|
||||||
}
|
|
||||||
|
|
||||||
// Strip PATH_INFO from SCRIPT_NAME
|
// Strip PATH_INFO from SCRIPT_NAME
|
||||||
scriptName = strings.TrimSuffix(scriptName, pathInfo)
|
scriptName = strings.TrimSuffix(scriptName, pathInfo)
|
||||||
|
@ -267,4 +276,8 @@ type Rule struct {
|
||||||
EnvVars [][2]string
|
EnvVars [][2]string
|
||||||
}
|
}
|
||||||
|
|
||||||
var headerNameReplacer = strings.NewReplacer(" ", "_", "-", "_")
|
var (
|
||||||
|
headerNameReplacer = strings.NewReplacer(" ", "_", "-", "_")
|
||||||
|
|
||||||
|
ErrIndexMissingSplit = errors.New("configured index file(s) must include split value")
|
||||||
|
)
|
||||||
|
|
Loading…
Reference in a new issue