Merge branch 'master' of github.com:mholt/caddy

This commit is contained in:
Matthew Holt 2016-01-30 21:05:18 -07:00
commit c5983e305f
3 changed files with 56 additions and 9 deletions

8
dist/README.txt vendored
View file

@ -8,9 +8,11 @@ Source Code
https://github.com/mholt/caddy https://github.com/mholt/caddy
For instructions on using Caddy, please see the user guide on the website. For a list of what's new in this version, see CHANGES.txt. For instructions on using Caddy, please see the user guide on the website.
For a list of what's new in this version, see CHANGES.txt.
If you have a question, bug report, or would like to contribute, please open an issue or submit a pull request on GitHub. Your contributions do not go unnoticed! If you have a question, bug report, or would like to contribute, please open an
issue or submit a pull request on GitHub. Your contributions do not go unnoticed!
For a good time, follow @mholt6 on Twitter. For a good time, follow @mholt6 on Twitter.
@ -18,4 +20,4 @@ And thanks - you're awesome!
--- ---
(c) 2015 Matthew Holt (c) 2015 - 2016 Matthew Holt

View file

@ -70,7 +70,8 @@ func (h Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error)
} }
// Connect to FastCGI gateway // Connect to FastCGI gateway
fcgi, err := getClient(&rule) network, address := rule.parseAddress()
fcgi, err := Dial(network, address)
if err != nil { if err != nil {
return http.StatusBadGateway, err return http.StatusBadGateway, err
} }
@ -128,15 +129,28 @@ func (h Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error)
return h.Next.ServeHTTP(w, r) return h.Next.ServeHTTP(w, r)
} }
func getClient(r *Rule) (*FCGIClient, error) { // parseAddress returns the network and address of r.
// check if unix socket or TCP // The first string is the network, "tcp" or "unix", implied from the scheme and address.
// The second string is r.Address, with scheme prefixes removed.
// The two returned strings can be used as parameters to the Dial() function.
func (r Rule) parseAddress() (string, string) {
// check if address has tcp scheme explicitly set
if strings.HasPrefix(r.Address, "tcp://") {
return "tcp", r.Address[len("tcp://"):]
}
// check if address has fastcgi scheme explicity set
if strings.HasPrefix(r.Address, "fastcgi://") {
return "tcp", r.Address[len("fastcgi://"):]
}
// check if unix socket
if trim := strings.HasPrefix(r.Address, "unix"); strings.HasPrefix(r.Address, "/") || trim { if trim := strings.HasPrefix(r.Address, "unix"); strings.HasPrefix(r.Address, "/") || trim {
if trim { if trim {
r.Address = r.Address[len("unix:"):] return "unix", r.Address[len("unix:"):]
} }
return Dial("unix", r.Address) return "unix", r.Address
} }
return Dial("tcp", r.Address) // default case, a plain tcp address with no scheme
return "tcp", r.Address
} }
func writeHeader(w http.ResponseWriter, r *http.Response) { func writeHeader(w http.ResponseWriter, r *http.Response) {

View file

@ -0,0 +1,31 @@
package fastcgi
import (
"testing"
)
func TestRuleParseAddress(t *testing.T) {
getClientTestTable := []struct {
rule *Rule
expectednetwork string
expectedaddress string
}{
{&Rule{Address: "tcp://172.17.0.1:9000"}, "tcp", "172.17.0.1:9000"},
{&Rule{Address: "fastcgi://localhost:9000"}, "tcp", "localhost:9000"},
{&Rule{Address: "172.17.0.15"}, "tcp", "172.17.0.15"},
{&Rule{Address: "/my/unix/socket"}, "unix", "/my/unix/socket"},
{&Rule{Address: "unix:/second/unix/socket"}, "unix", "/second/unix/socket"},
}
for _, entry := range getClientTestTable {
if actualnetwork, _ := entry.rule.parseAddress(); actualnetwork != entry.expectednetwork {
t.Errorf("Unexpected network for address string %v. Got %v, expected %v", entry.rule.Address, actualnetwork, entry.expectednetwork)
}
if _, actualaddress := entry.rule.parseAddress(); actualaddress != entry.expectedaddress {
t.Errorf("Unexpected parsed address for address string %v. Got %v, expected %v", entry.rule.Address, actualaddress, entry.expectedaddress)
}
}
}