forked from dunglas/frankenphp
-
Notifications
You must be signed in to change notification settings - Fork 0
/
request_options.go
87 lines (70 loc) · 2.48 KB
/
request_options.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
package frankenphp
import (
"path/filepath"
"go.uber.org/zap"
)
// RequestOption instances allow to configure a FrankenPHP Request.
type RequestOption func(h *FrankenPHPContext) error
// WithRequestDocumentRoot sets the root directory of the PHP application.
// if resolveSymlink is true, oath declared as root directory will be resolved
// to its absolute value after the evaluation of any symbolic links.
// Due to the nature of PHP opcache, root directory path is cached: when
// using a symlinked directory as root this could generate errors when
// symlink is changed without PHP being restarted; enabling this
// directive will set $_SERVER['DOCUMENT_ROOT'] to the real directory path.
func WithRequestDocumentRoot(documentRoot string, resolveSymlink bool) RequestOption {
return func(o *FrankenPHPContext) error {
// make sure file root is absolute
root, err := filepath.Abs(documentRoot)
if err != nil {
return err
}
if resolveSymlink {
if root, err = filepath.EvalSymlinks(root); err != nil {
return err
}
}
o.documentRoot = root
return nil
}
}
// The path in the URL will be split into two, with the first piece ending
// with the value of SplitPath. The first piece will be assumed as the
// actual resource (CGI script) name, and the second piece will be set to
// PATH_INFO for the CGI script to use.
//
// Future enhancements should be careful to avoid CVE-2019-11043,
// which can be mitigated with use of a try_files-like behavior
// that 404s if the fastcgi path info is not found.
func WithRequestSplitPath(splitPath []string) RequestOption {
return func(o *FrankenPHPContext) error {
o.splitPath = splitPath
return nil
}
}
type PreparedEnv = map[string]string
func PrepareEnv(env map[string]string) PreparedEnv {
preparedEnv := make(PreparedEnv, len(env))
for k, v := range env {
preparedEnv[k+"\x00"] = v
}
return preparedEnv
}
// WithRequestEnv set CGI-like environment variables that will be available in $_SERVER.
// Values set with WithEnv always have priority over automatically populated values.
func WithRequestEnv(env map[string]string) RequestOption {
return WithRequestPreparedEnv(PrepareEnv(env))
}
func WithRequestPreparedEnv(env PreparedEnv) RequestOption {
return func(o *FrankenPHPContext) error {
o.env = env
return nil
}
}
// WithRequestLogger sets the logger associated with the current request
func WithRequestLogger(logger *zap.Logger) RequestOption {
return func(o *FrankenPHPContext) error {
o.logger = logger
return nil
}
}