Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
caddy
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
caddy
Commits
6bac558c
Commit
6bac558c
authored
Jan 17, 2017
by
Mike Pastore
Committed by
Matt Holt
Jan 17, 2017
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add root option to fastcgi directive (#1337)
parent
8464020f
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
61 additions
and
10 deletions
+61
-10
caddyhttp/fastcgi/fastcgi.go
caddyhttp/fastcgi/fastcgi.go
+7
-4
caddyhttp/fastcgi/setup.go
caddyhttp/fastcgi/setup.go
+18
-6
caddyhttp/fastcgi/setup_test.go
caddyhttp/fastcgi/setup_test.go
+36
-0
No files found.
caddyhttp/fastcgi/fastcgi.go
View file @
6bac558c
...
...
@@ -23,7 +23,6 @@ type Handler struct {
Next
httpserver
.
Handler
Rules
[]
Rule
Root
string
AbsRoot
string
// same as root, but absolute path
FileSys
http
.
FileSystem
// These are sent to CGI scripts in env variables
...
...
@@ -184,7 +183,7 @@ func (h Handler) buildEnv(r *http.Request, rule Rule, fpath string) (map[string]
var
env
map
[
string
]
string
// Get absolute path of requested resource
absPath
:=
filepath
.
Join
(
h
.
Abs
Root
,
fpath
)
absPath
:=
filepath
.
Join
(
rule
.
Root
,
fpath
)
// Separate remote IP and port; more lenient than net.SplitHostPort
var
ip
,
port
string
...
...
@@ -244,7 +243,7 @@ func (h Handler) buildEnv(r *http.Request, rule Rule, fpath string) (map[string]
"SERVER_SOFTWARE"
:
h
.
SoftwareName
+
"/"
+
h
.
SoftwareVersion
,
// Other variables
"DOCUMENT_ROOT"
:
h
.
Abs
Root
,
"DOCUMENT_ROOT"
:
rule
.
Root
,
"DOCUMENT_URI"
:
docURI
,
"HTTP_HOST"
:
r
.
Host
,
// added here, since not always part of headers
"REQUEST_URI"
:
reqURI
,
...
...
@@ -256,7 +255,7 @@ func (h Handler) buildEnv(r *http.Request, rule Rule, fpath string) (map[string]
// should only exist if PATH_INFO is defined.
// Info: https://www.ietf.org/rfc/rfc3875 Page 14
if
env
[
"PATH_INFO"
]
!=
""
{
env
[
"PATH_TRANSLATED"
]
=
filepath
.
Join
(
h
.
Abs
Root
,
pathInfo
)
// Info: http://www.oreilly.com/openbook/cgi/ch02_04.html
env
[
"PATH_TRANSLATED"
]
=
filepath
.
Join
(
rule
.
Root
,
pathInfo
)
// Info: http://www.oreilly.com/openbook/cgi/ch02_04.html
}
// Some web apps rely on knowing HTTPS or not
...
...
@@ -295,6 +294,10 @@ type Rule struct {
// Always process files with this extension with fastcgi.
Ext
string
// Use this directory as the fastcgi root directory. Defaults to the root
// directory of the parent virtual host.
Root
string
// 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
...
...
caddyhttp/fastcgi/setup.go
View file @
6bac558c
...
...
@@ -22,10 +22,6 @@ func init() {
// setup configures a new FastCGI middleware instance.
func
setup
(
c
*
caddy
.
Controller
)
error
{
cfg
:=
httpserver
.
GetConfig
(
c
)
absRoot
,
err
:=
filepath
.
Abs
(
cfg
.
Root
)
if
err
!=
nil
{
return
err
}
rules
,
err
:=
fastcgiParse
(
c
)
if
err
!=
nil
{
...
...
@@ -37,7 +33,6 @@ func setup(c *caddy.Controller) error {
Next
:
next
,
Rules
:
rules
,
Root
:
cfg
.
Root
,
AbsRoot
:
absRoot
,
FileSys
:
http
.
Dir
(
cfg
.
Root
),
SoftwareName
:
caddy
.
AppName
,
SoftwareVersion
:
caddy
.
AppVersion
,
...
...
@@ -52,6 +47,12 @@ func setup(c *caddy.Controller) error {
func
fastcgiParse
(
c
*
caddy
.
Controller
)
([]
Rule
,
error
)
{
var
rules
[]
Rule
cfg
:=
httpserver
.
GetConfig
(
c
)
absRoot
,
err
:=
filepath
.
Abs
(
cfg
.
Root
)
if
err
!=
nil
{
return
nil
,
err
}
for
c
.
Next
()
{
args
:=
c
.
RemainingArgs
()
...
...
@@ -59,7 +60,12 @@ func fastcgiParse(c *caddy.Controller) ([]Rule, error) {
return
rules
,
c
.
ArgErr
()
}
rule
:=
Rule
{
Path
:
args
[
0
],
ReadTimeout
:
60
*
time
.
Second
,
SendTimeout
:
60
*
time
.
Second
}
rule
:=
Rule
{
Root
:
absRoot
,
Path
:
args
[
0
],
ReadTimeout
:
60
*
time
.
Second
,
SendTimeout
:
60
*
time
.
Second
,
}
upstreams
:=
[]
string
{
args
[
1
]}
if
len
(
args
)
==
3
{
...
...
@@ -76,6 +82,12 @@ func fastcgiParse(c *caddy.Controller) ([]Rule, error) {
for
c
.
NextBlock
()
{
switch
c
.
Val
()
{
case
"root"
:
if
!
c
.
NextArg
()
{
return
rules
,
c
.
ArgErr
()
}
rule
.
Root
=
c
.
Val
()
case
"ext"
:
if
!
c
.
NextArg
()
{
return
rules
,
c
.
ArgErr
()
...
...
caddyhttp/fastcgi/setup_test.go
View file @
6bac558c
...
...
@@ -2,6 +2,7 @@ package fastcgi
import
(
"fmt"
"os"
"reflect"
"testing"
"time"
...
...
@@ -61,6 +62,11 @@ func (p *persistentDialer) Equals(q *persistentDialer) bool {
}
func
TestFastcgiParse
(
t
*
testing
.
T
)
{
rootPath
,
err
:=
os
.
Getwd
()
if
err
!=
nil
{
t
.
Errorf
(
"Can't determine current working directory; got '%v'"
,
err
)
}
defaultAddress
:=
"127.0.0.1:9001"
network
,
address
:=
parseAddress
(
defaultAddress
)
t
.
Logf
(
"Address '%v' was parsed to network '%v' and address '%v'"
,
defaultAddress
,
network
,
address
)
...
...
@@ -73,6 +79,21 @@ func TestFastcgiParse(t *testing.T) {
{
`fastcgi /blog 127.0.0.1:9000 php`
,
false
,
[]
Rule
{{
Root
:
rootPath
,
Path
:
"/blog"
,
Address
:
"127.0.0.1:9000"
,
Ext
:
".php"
,
SplitPath
:
".php"
,
dialer
:
&
loadBalancingDialer
{
dialers
:
[]
dialer
{
basicDialer
{
network
:
"tcp"
,
address
:
"127.0.0.1:9000"
,
timeout
:
60
*
time
.
Second
}}},
IndexFiles
:
[]
string
{
"index.php"
},
ReadTimeout
:
60
*
time
.
Second
,
SendTimeout
:
60
*
time
.
Second
,
}}},
{
`fastcgi /blog 127.0.0.1:9000 php {
root /tmp
}`
,
false
,
[]
Rule
{{
Root
:
"/tmp"
,
Path
:
"/blog"
,
Address
:
"127.0.0.1:9000"
,
Ext
:
".php"
,
...
...
@@ -86,6 +107,7 @@ func TestFastcgiParse(t *testing.T) {
upstream 127.0.0.1:9001
}`
,
false
,
[]
Rule
{{
Root
:
rootPath
,
Path
:
"/blog"
,
Address
:
"127.0.0.1:9000,127.0.0.1:9001"
,
Ext
:
".php"
,
...
...
@@ -99,6 +121,7 @@ func TestFastcgiParse(t *testing.T) {
upstream 127.0.0.1:9001
}`
,
false
,
[]
Rule
{{
Root
:
rootPath
,
Path
:
"/blog"
,
Address
:
"127.0.0.1:9000,127.0.0.1:9001"
,
Ext
:
""
,
...
...
@@ -112,6 +135,7 @@ func TestFastcgiParse(t *testing.T) {
split .html
}`
,
false
,
[]
Rule
{{
Root
:
rootPath
,
Path
:
"/"
,
Address
:
defaultAddress
,
Ext
:
""
,
...
...
@@ -126,6 +150,7 @@ func TestFastcgiParse(t *testing.T) {
except /admin /user
}`
,
false
,
[]
Rule
{{
Root
:
rootPath
,
Path
:
"/"
,
Address
:
"127.0.0.1:9001"
,
Ext
:
""
,
...
...
@@ -140,6 +165,7 @@ func TestFastcgiParse(t *testing.T) {
pool 0
}`
,
false
,
[]
Rule
{{
Root
:
rootPath
,
Path
:
"/"
,
Address
:
defaultAddress
,
Ext
:
""
,
...
...
@@ -154,6 +180,7 @@ func TestFastcgiParse(t *testing.T) {
pool 5
}`
,
false
,
[]
Rule
{{
Root
:
rootPath
,
Path
:
"/"
,
Address
:
"127.0.0.1:8080,127.0.0.1:9000"
,
Ext
:
""
,
...
...
@@ -167,6 +194,7 @@ func TestFastcgiParse(t *testing.T) {
split .php
}`
,
false
,
[]
Rule
{{
Root
:
rootPath
,
Path
:
"/"
,
Address
:
defaultAddress
,
Ext
:
""
,
...
...
@@ -180,6 +208,7 @@ func TestFastcgiParse(t *testing.T) {
connect_timeout 5s
}`
,
false
,
[]
Rule
{{
Root
:
rootPath
,
Path
:
"/"
,
Address
:
defaultAddress
,
Ext
:
""
,
...
...
@@ -198,6 +227,7 @@ func TestFastcgiParse(t *testing.T) {
read_timeout 5s
}`
,
false
,
[]
Rule
{{
Root
:
rootPath
,
Path
:
"/"
,
Address
:
defaultAddress
,
Ext
:
""
,
...
...
@@ -216,6 +246,7 @@ func TestFastcgiParse(t *testing.T) {
send_timeout 5s
}`
,
false
,
[]
Rule
{{
Root
:
rootPath
,
Path
:
"/"
,
Address
:
defaultAddress
,
Ext
:
""
,
...
...
@@ -250,6 +281,11 @@ func TestFastcgiParse(t *testing.T) {
}
for
j
,
actualFastcgiConfig
:=
range
actualFastcgiConfigs
{
if
actualFastcgiConfig
.
Root
!=
test
.
expectedFastcgiConfig
[
j
]
.
Root
{
t
.
Errorf
(
"Test %d expected %dth FastCGI Root to be %s , but got %s"
,
i
,
j
,
test
.
expectedFastcgiConfig
[
j
]
.
Root
,
actualFastcgiConfig
.
Root
)
}
if
actualFastcgiConfig
.
Path
!=
test
.
expectedFastcgiConfig
[
j
]
.
Path
{
t
.
Errorf
(
"Test %d expected %dth FastCGI Path to be %s , but got %s"
,
i
,
j
,
test
.
expectedFastcgiConfig
[
j
]
.
Path
,
actualFastcgiConfig
.
Path
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment