summaryrefslogtreecommitdiffhomepage
path: root/caddytest
diff options
context:
space:
mode:
authorMatt Holt <[email protected]>2020-10-13 10:35:20 -0600
committerGitHub <[email protected]>2020-10-13 10:35:20 -0600
commitc7efb0307d425eb533885e314518c370a06763da (patch)
treedfebe5f16db89c4e8f458c7fdbef5d55cd768277 /caddytest
parente34d9f1244439a01a195febd966c7c5d88c98d33 (diff)
downloadcaddy-c7efb0307d425eb533885e314518c370a06763da.tar.gz
caddy-c7efb0307d425eb533885e314518c370a06763da.zip
reverseproxy: Fix dial placeholders, SRV, active health checks (#3780)
* reverseproxy: Fix dial placeholders, SRV, active health checks Supercedes #3776 Partially reverts or updates #3756, #3693, and #3695 * reverseproxy: add integration tests Co-authored-by: Mohammed Al Sahaf <[email protected]>
Diffstat (limited to 'caddytest')
-rw-r--r--caddytest/integration/reverseproxy_test.go238
1 files changed, 238 insertions, 0 deletions
diff --git a/caddytest/integration/reverseproxy_test.go b/caddytest/integration/reverseproxy_test.go
index 0505becf7..e838d8694 100644
--- a/caddytest/integration/reverseproxy_test.go
+++ b/caddytest/integration/reverseproxy_test.go
@@ -79,6 +79,244 @@ func TestSRVWithDial(t *testing.T) {
`, "json", `upstream: specifying dial address is incompatible with lookup_srv: 0: {\"dial\": \"tcp/address.to.upstream:80\", \"lookup_srv\": \"srv.host.service.consul\"}`)
}
+func TestDialWithPlaceholderUnix(t *testing.T) {
+
+ if runtime.GOOS == "windows" {
+ t.SkipNow()
+ }
+
+ f, err := ioutil.TempFile("", "*.sock")
+ if err != nil {
+ t.Errorf("failed to create TempFile: %s", err)
+ return
+ }
+ // a hack to get a file name within a valid path to use as socket
+ socketName := f.Name()
+ os.Remove(f.Name())
+
+ server := http.Server{
+ Handler: http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
+ w.Write([]byte("Hello, World!"))
+ }),
+ }
+
+ unixListener, err := net.Listen("unix", socketName)
+ if err != nil {
+ t.Errorf("failed to listen on the socket: %s", err)
+ return
+ }
+ go server.Serve(unixListener)
+ t.Cleanup(func() {
+ server.Close()
+ })
+ runtime.Gosched() // Allow other goroutines to run
+
+ tester := caddytest.NewTester(t)
+ tester.InitServer(`
+ {
+ "apps": {
+ "http": {
+ "servers": {
+ "srv0": {
+ "listen": [
+ ":8080"
+ ],
+ "routes": [
+ {
+ "handle": [
+ {
+ "handler": "reverse_proxy",
+ "upstreams": [
+ {
+ "dial": "unix/{http.request.header.X-Caddy-Upstream-Dial}"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+ }
+ `, "json")
+
+ req, err := http.NewRequest(http.MethodGet, "http://localhost:8080", nil)
+ if err != nil {
+ t.Fail()
+ return
+ }
+ req.Header.Set("X-Caddy-Upstream-Dial", socketName)
+ tester.AssertResponse(req, 200, "Hello, World!")
+}
+
+func TestReverseProxyWithPlaceholderDialAddress(t *testing.T) {
+ tester := caddytest.NewTester(t)
+ tester.InitServer(`
+ {
+ "apps": {
+ "http": {
+ "servers": {
+ "srv0": {
+ "listen": [
+ ":8080"
+ ],
+ "routes": [
+ {
+ "match": [
+ {
+ "host": [
+ "localhost"
+ ]
+ }
+ ],
+ "handle": [
+ {
+ "handler": "static_response",
+ "body": "Hello, World!"
+ }
+ ],
+ "terminal": true
+ }
+ ],
+ "automatic_https": {
+ "skip": [
+ "localhost"
+ ]
+ }
+ },
+ "srv1": {
+ "listen": [
+ ":9080"
+ ],
+ "routes": [
+ {
+ "match": [
+ {
+ "host": [
+ "localhost"
+ ]
+ }
+ ],
+ "handle": [
+ {
+
+ "handler": "reverse_proxy",
+ "upstreams": [
+ {
+ "dial": "{http.request.header.X-Caddy-Upstream-Dial}"
+ }
+ ]
+ }
+ ],
+ "terminal": true
+ }
+ ],
+ "automatic_https": {
+ "skip": [
+ "localhost"
+ ]
+ }
+ }
+ }
+ }
+ }
+ }
+ `, "json")
+
+ req, err := http.NewRequest(http.MethodGet, "http://localhost:9080", nil)
+ if err != nil {
+ t.Fail()
+ return
+ }
+ req.Header.Set("X-Caddy-Upstream-Dial", "localhost:8080")
+ tester.AssertResponse(req, 200, "Hello, World!")
+}
+
+func TestReverseProxyWithPlaceholderTCPDialAddress(t *testing.T) {
+ tester := caddytest.NewTester(t)
+ tester.InitServer(`
+ {
+ "apps": {
+ "http": {
+ "servers": {
+ "srv0": {
+ "listen": [
+ ":8080"
+ ],
+ "routes": [
+ {
+ "match": [
+ {
+ "host": [
+ "localhost"
+ ]
+ }
+ ],
+ "handle": [
+ {
+ "handler": "static_response",
+ "body": "Hello, World!"
+ }
+ ],
+ "terminal": true
+ }
+ ],
+ "automatic_https": {
+ "skip": [
+ "localhost"
+ ]
+ }
+ },
+ "srv1": {
+ "listen": [
+ ":9080"
+ ],
+ "routes": [
+ {
+ "match": [
+ {
+ "host": [
+ "localhost"
+ ]
+ }
+ ],
+ "handle": [
+ {
+
+ "handler": "reverse_proxy",
+ "upstreams": [
+ {
+ "dial": "tcp/{http.request.header.X-Caddy-Upstream-Dial}:8080"
+ }
+ ]
+ }
+ ],
+ "terminal": true
+ }
+ ],
+ "automatic_https": {
+ "skip": [
+ "localhost"
+ ]
+ }
+ }
+ }
+ }
+ }
+ }
+ `, "json")
+
+ req, err := http.NewRequest(http.MethodGet, "http://localhost:9080", nil)
+ if err != nil {
+ t.Fail()
+ return
+ }
+ req.Header.Set("X-Caddy-Upstream-Dial", "localhost")
+ tester.AssertResponse(req, 200, "Hello, World!")
+}
+
func TestSRVWithActiveHealthcheck(t *testing.T) {
caddytest.AssertLoadError(t, `
{