mirror of
				https://github.com/caddyserver/caddy.git
				synced 2025-11-03 19:17:29 -05:00 
			
		
		
		
	
		
			Some checks failed
		
		
	
	Tests / test (./cmd/caddy/caddy, ~1.22.3, macos-14, 0, 1.22, mac) (push) Waiting to run
				
			Tests / test (./cmd/caddy/caddy, ~1.23.0, macos-14, 0, 1.23, mac) (push) Waiting to run
				
			Tests / test (./cmd/caddy/caddy.exe, ~1.22.3, windows-latest, True, 1.22, windows) (push) Waiting to run
				
			Tests / test (./cmd/caddy/caddy.exe, ~1.23.0, windows-latest, True, 1.23, windows) (push) Waiting to run
				
			Lint / lint (macos-14, mac) (push) Waiting to run
				
			Lint / lint (windows-latest, windows) (push) Waiting to run
				
			Tests / test (./cmd/caddy/caddy, ~1.22.3, ubuntu-latest, 0, 1.22, linux) (push) Failing after 3m36s
				
			Tests / test (./cmd/caddy/caddy, ~1.23.0, ubuntu-latest, 0, 1.23, linux) (push) Failing after 2m8s
				
			Tests / test (s390x on IBM Z) (push) Has been skipped
				
			Tests / goreleaser-check (push) Has been skipped
				
			Cross-Build / build (~1.22.3, 1.22, aix) (push) Successful in 1m58s
				
			Cross-Build / build (~1.22.3, 1.22, darwin) (push) Successful in 2m36s
				
			Cross-Build / build (~1.22.3, 1.22, dragonfly) (push) Successful in 1m33s
				
			Cross-Build / build (~1.22.3, 1.22, freebsd) (push) Successful in 1m25s
				
			Cross-Build / build (~1.22.3, 1.22, illumos) (push) Successful in 1m26s
				
			Cross-Build / build (~1.22.3, 1.22, linux) (push) Successful in 1m27s
				
			Cross-Build / build (~1.22.3, 1.22, netbsd) (push) Successful in 1m28s
				
			Cross-Build / build (~1.22.3, 1.22, openbsd) (push) Successful in 1m28s
				
			Cross-Build / build (~1.22.3, 1.22, solaris) (push) Successful in 1m25s
				
			Cross-Build / build (~1.22.3, 1.22, windows) (push) Successful in 1m24s
				
			Cross-Build / build (~1.23.0, 1.23, aix) (push) Successful in 1m39s
				
			Cross-Build / build (~1.23.0, 1.23, darwin) (push) Successful in 1m17s
				
			Cross-Build / build (~1.23.0, 1.23, dragonfly) (push) Successful in 1m17s
				
			Cross-Build / build (~1.23.0, 1.23, freebsd) (push) Successful in 1m18s
				
			Cross-Build / build (~1.23.0, 1.23, illumos) (push) Successful in 1m16s
				
			Cross-Build / build (~1.23.0, 1.23, linux) (push) Successful in 1m17s
				
			Cross-Build / build (~1.23.0, 1.23, netbsd) (push) Successful in 1m22s
				
			Cross-Build / build (~1.23.0, 1.23, openbsd) (push) Successful in 1m18s
				
			Cross-Build / build (~1.23.0, 1.23, solaris) (push) Successful in 1m16s
				
			Cross-Build / build (~1.23.0, 1.23, windows) (push) Successful in 1m15s
				
			Lint / lint (ubuntu-latest, linux) (push) Failing after 2m0s
				
			Lint / govulncheck (push) Successful in 1m29s
				
			* Allow log sampling configuration from Caddyfile * Add log sampling adapt tests
		
			
				
	
	
		
			370 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			370 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package httpcaddyfile
 | 
						|
 | 
						|
import (
 | 
						|
	"strings"
 | 
						|
	"testing"
 | 
						|
 | 
						|
	"github.com/caddyserver/caddy/v2/caddyconfig/caddyfile"
 | 
						|
	_ "github.com/caddyserver/caddy/v2/modules/logging"
 | 
						|
)
 | 
						|
 | 
						|
func TestLogDirectiveSyntax(t *testing.T) {
 | 
						|
	for i, tc := range []struct {
 | 
						|
		input       string
 | 
						|
		output      string
 | 
						|
		expectError bool
 | 
						|
	}{
 | 
						|
		{
 | 
						|
			input: `:8080 {
 | 
						|
				log
 | 
						|
			}
 | 
						|
			`,
 | 
						|
			output:      `{"apps":{"http":{"servers":{"srv0":{"listen":[":8080"],"logs":{}}}}}}`,
 | 
						|
			expectError: false,
 | 
						|
		},
 | 
						|
		{
 | 
						|
			input: `:8080 {
 | 
						|
				log {
 | 
						|
					core mock
 | 
						|
					output file foo.log
 | 
						|
				}
 | 
						|
			}
 | 
						|
			`,
 | 
						|
			output:      `{"logging":{"logs":{"default":{"exclude":["http.log.access.log0"]},"log0":{"writer":{"filename":"foo.log","output":"file"},"core":{"module":"mock"},"include":["http.log.access.log0"]}}},"apps":{"http":{"servers":{"srv0":{"listen":[":8080"],"logs":{"default_logger_name":"log0"}}}}}}`,
 | 
						|
			expectError: false,
 | 
						|
		},
 | 
						|
		{
 | 
						|
			input: `:8080 {
 | 
						|
				log {
 | 
						|
					format filter {
 | 
						|
						wrap console
 | 
						|
						fields {
 | 
						|
							request>remote_ip ip_mask {
 | 
						|
								ipv4 24
 | 
						|
								ipv6 32
 | 
						|
							}
 | 
						|
						}
 | 
						|
					}
 | 
						|
				}
 | 
						|
			}
 | 
						|
			`,
 | 
						|
			output:      `{"logging":{"logs":{"default":{"exclude":["http.log.access.log0"]},"log0":{"encoder":{"fields":{"request\u003eremote_ip":{"filter":"ip_mask","ipv4_cidr":24,"ipv6_cidr":32}},"format":"filter","wrap":{"format":"console"}},"include":["http.log.access.log0"]}}},"apps":{"http":{"servers":{"srv0":{"listen":[":8080"],"logs":{"default_logger_name":"log0"}}}}}}`,
 | 
						|
			expectError: false,
 | 
						|
		},
 | 
						|
		{
 | 
						|
			input: `:8080 {
 | 
						|
				log name-override {
 | 
						|
					core mock
 | 
						|
					output file foo.log
 | 
						|
				}
 | 
						|
			}
 | 
						|
			`,
 | 
						|
			output:      `{"logging":{"logs":{"default":{"exclude":["http.log.access.name-override"]},"name-override":{"writer":{"filename":"foo.log","output":"file"},"core":{"module":"mock"},"include":["http.log.access.name-override"]}}},"apps":{"http":{"servers":{"srv0":{"listen":[":8080"],"logs":{"default_logger_name":"name-override"}}}}}}`,
 | 
						|
			expectError: false,
 | 
						|
		},
 | 
						|
		{
 | 
						|
			input: `:8080 {
 | 
						|
				log {
 | 
						|
					sampling {
 | 
						|
						interval 2
 | 
						|
						first 3
 | 
						|
						thereafter 4
 | 
						|
					}
 | 
						|
				}
 | 
						|
			}
 | 
						|
			`,
 | 
						|
			output:      `{"logging":{"logs":{"default":{"exclude":["http.log.access.log0"]},"log0":{"sampling":{"interval":2,"first":3,"thereafter":4},"include":["http.log.access.log0"]}}},"apps":{"http":{"servers":{"srv0":{"listen":[":8080"],"logs":{"default_logger_name":"log0"}}}}}}`,
 | 
						|
			expectError: false,
 | 
						|
		},
 | 
						|
	} {
 | 
						|
 | 
						|
		adapter := caddyfile.Adapter{
 | 
						|
			ServerType: ServerType{},
 | 
						|
		}
 | 
						|
 | 
						|
		out, _, err := adapter.Adapt([]byte(tc.input), nil)
 | 
						|
 | 
						|
		if err != nil != tc.expectError {
 | 
						|
			t.Errorf("Test %d error expectation failed Expected: %v, got %s", i, tc.expectError, err)
 | 
						|
			continue
 | 
						|
		}
 | 
						|
 | 
						|
		if string(out) != tc.output {
 | 
						|
			t.Errorf("Test %d error output mismatch Expected: %s, got %s", i, tc.output, out)
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func TestRedirDirectiveSyntax(t *testing.T) {
 | 
						|
	for i, tc := range []struct {
 | 
						|
		input       string
 | 
						|
		expectError bool
 | 
						|
	}{
 | 
						|
		{
 | 
						|
			input: `:8080 {
 | 
						|
				redir :8081
 | 
						|
			}`,
 | 
						|
			expectError: false,
 | 
						|
		},
 | 
						|
		{
 | 
						|
			input: `:8080 {
 | 
						|
				redir * :8081
 | 
						|
			}`,
 | 
						|
			expectError: false,
 | 
						|
		},
 | 
						|
		{
 | 
						|
			input: `:8080 {
 | 
						|
				redir /api/* :8081 300
 | 
						|
			}`,
 | 
						|
			expectError: false,
 | 
						|
		},
 | 
						|
		{
 | 
						|
			input: `:8080 {
 | 
						|
				redir :8081 300
 | 
						|
			}`,
 | 
						|
			expectError: false,
 | 
						|
		},
 | 
						|
		{
 | 
						|
			input: `:8080 {
 | 
						|
				redir /api/* :8081 399
 | 
						|
			}`,
 | 
						|
			expectError: false,
 | 
						|
		},
 | 
						|
		{
 | 
						|
			input: `:8080 {
 | 
						|
				redir :8081 399
 | 
						|
			}`,
 | 
						|
			expectError: false,
 | 
						|
		},
 | 
						|
		{
 | 
						|
			input: `:8080 {
 | 
						|
				redir /old.html /new.html
 | 
						|
			}`,
 | 
						|
			expectError: false,
 | 
						|
		},
 | 
						|
		{
 | 
						|
			input: `:8080 {
 | 
						|
				redir /old.html /new.html temporary
 | 
						|
			}`,
 | 
						|
			expectError: false,
 | 
						|
		},
 | 
						|
		{
 | 
						|
			input: `:8080 {
 | 
						|
				redir https://example.com{uri} permanent
 | 
						|
			}`,
 | 
						|
			expectError: false,
 | 
						|
		},
 | 
						|
		{
 | 
						|
			input: `:8080 {
 | 
						|
				redir /old.html /new.html permanent
 | 
						|
			}`,
 | 
						|
			expectError: false,
 | 
						|
		},
 | 
						|
		{
 | 
						|
			input: `:8080 {
 | 
						|
				redir /old.html /new.html html
 | 
						|
			}`,
 | 
						|
			expectError: false,
 | 
						|
		},
 | 
						|
		{
 | 
						|
			// this is now allowed so a Location header
 | 
						|
			// can be written and consumed by JS
 | 
						|
			// in the case of XHR requests
 | 
						|
			input: `:8080 {
 | 
						|
				redir * :8081 401
 | 
						|
			}`,
 | 
						|
			expectError: false,
 | 
						|
		},
 | 
						|
		{
 | 
						|
			input: `:8080 {
 | 
						|
				redir * :8081 402
 | 
						|
			}`,
 | 
						|
			expectError: true,
 | 
						|
		},
 | 
						|
		{
 | 
						|
			input: `:8080 {
 | 
						|
				redir * :8081 {http.reverse_proxy.status_code}
 | 
						|
			}`,
 | 
						|
			expectError: false,
 | 
						|
		},
 | 
						|
		{
 | 
						|
			input: `:8080 {
 | 
						|
				redir /old.html /new.html htlm
 | 
						|
			}`,
 | 
						|
			expectError: true,
 | 
						|
		},
 | 
						|
		{
 | 
						|
			input: `:8080 {
 | 
						|
				redir * :8081 200
 | 
						|
			}`,
 | 
						|
			expectError: true,
 | 
						|
		},
 | 
						|
		{
 | 
						|
			input: `:8080 {
 | 
						|
				redir * :8081 temp
 | 
						|
			}`,
 | 
						|
			expectError: true,
 | 
						|
		},
 | 
						|
		{
 | 
						|
			input: `:8080 {
 | 
						|
				redir * :8081 perm
 | 
						|
			}`,
 | 
						|
			expectError: true,
 | 
						|
		},
 | 
						|
		{
 | 
						|
			input: `:8080 {
 | 
						|
				redir * :8081 php
 | 
						|
			}`,
 | 
						|
			expectError: true,
 | 
						|
		},
 | 
						|
	} {
 | 
						|
 | 
						|
		adapter := caddyfile.Adapter{
 | 
						|
			ServerType: ServerType{},
 | 
						|
		}
 | 
						|
 | 
						|
		_, _, err := adapter.Adapt([]byte(tc.input), nil)
 | 
						|
 | 
						|
		if err != nil != tc.expectError {
 | 
						|
			t.Errorf("Test %d error expectation failed Expected: %v, got %s", i, tc.expectError, err)
 | 
						|
			continue
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func TestImportErrorLine(t *testing.T) {
 | 
						|
	for i, tc := range []struct {
 | 
						|
		input     string
 | 
						|
		errorFunc func(err error) bool
 | 
						|
	}{
 | 
						|
		{
 | 
						|
			input: `(t1) {
 | 
						|
					abort {args[:]}
 | 
						|
				}
 | 
						|
				:8080 {
 | 
						|
					import t1
 | 
						|
					import t1 true
 | 
						|
				}`,
 | 
						|
			errorFunc: func(err error) bool {
 | 
						|
				return err != nil && strings.Contains(err.Error(), "Caddyfile:6 (import t1)")
 | 
						|
			},
 | 
						|
		},
 | 
						|
		{
 | 
						|
			input: `(t1) {
 | 
						|
					abort {args[:]}
 | 
						|
				}
 | 
						|
				:8080 {
 | 
						|
					import t1 true
 | 
						|
				}`,
 | 
						|
			errorFunc: func(err error) bool {
 | 
						|
				return err != nil && strings.Contains(err.Error(), "Caddyfile:5 (import t1)")
 | 
						|
			},
 | 
						|
		},
 | 
						|
		{
 | 
						|
			input: `
 | 
						|
				import testdata/import_variadic_snippet.txt
 | 
						|
				:8080 {
 | 
						|
					import t1 true
 | 
						|
				}`,
 | 
						|
			errorFunc: func(err error) bool {
 | 
						|
				return err == nil
 | 
						|
			},
 | 
						|
		},
 | 
						|
		{
 | 
						|
			input: `
 | 
						|
				import testdata/import_variadic_with_import.txt
 | 
						|
				:8080 {
 | 
						|
					import t1 true
 | 
						|
					import t2 true
 | 
						|
				}`,
 | 
						|
			errorFunc: func(err error) bool {
 | 
						|
				return err == nil
 | 
						|
			},
 | 
						|
		},
 | 
						|
	} {
 | 
						|
		adapter := caddyfile.Adapter{
 | 
						|
			ServerType: ServerType{},
 | 
						|
		}
 | 
						|
 | 
						|
		_, _, err := adapter.Adapt([]byte(tc.input), nil)
 | 
						|
 | 
						|
		if !tc.errorFunc(err) {
 | 
						|
			t.Errorf("Test %d error expectation failed, got %s", i, err)
 | 
						|
			continue
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func TestNestedImport(t *testing.T) {
 | 
						|
	for i, tc := range []struct {
 | 
						|
		input     string
 | 
						|
		errorFunc func(err error) bool
 | 
						|
	}{
 | 
						|
		{
 | 
						|
			input: `(t1) {
 | 
						|
						respond {args[0]} {args[1]}
 | 
						|
					}
 | 
						|
					
 | 
						|
					(t2) {
 | 
						|
						import t1 {args[0]} 202
 | 
						|
					}
 | 
						|
					
 | 
						|
					:8080 {
 | 
						|
						handle {
 | 
						|
							import t2 "foobar"
 | 
						|
						}
 | 
						|
					}`,
 | 
						|
			errorFunc: func(err error) bool {
 | 
						|
				return err == nil
 | 
						|
			},
 | 
						|
		},
 | 
						|
		{
 | 
						|
			input: `(t1) {
 | 
						|
						respond {args[:]}
 | 
						|
					}
 | 
						|
					
 | 
						|
					(t2) {
 | 
						|
						import t1 {args[0]} {args[1]}
 | 
						|
					}
 | 
						|
					
 | 
						|
					:8080 {
 | 
						|
						handle {
 | 
						|
							import t2 "foobar" 202
 | 
						|
						}
 | 
						|
					}`,
 | 
						|
			errorFunc: func(err error) bool {
 | 
						|
				return err == nil
 | 
						|
			},
 | 
						|
		},
 | 
						|
		{
 | 
						|
			input: `(t1) {
 | 
						|
						respond {args[0]} {args[1]}
 | 
						|
					}
 | 
						|
					
 | 
						|
					(t2) {
 | 
						|
						import t1 {args[:]}
 | 
						|
					}
 | 
						|
					
 | 
						|
					:8080 {
 | 
						|
						handle {
 | 
						|
							import t2 "foobar" 202
 | 
						|
						}
 | 
						|
					}`,
 | 
						|
			errorFunc: func(err error) bool {
 | 
						|
				return err == nil
 | 
						|
			},
 | 
						|
		},
 | 
						|
	} {
 | 
						|
		adapter := caddyfile.Adapter{
 | 
						|
			ServerType: ServerType{},
 | 
						|
		}
 | 
						|
 | 
						|
		_, _, err := adapter.Adapt([]byte(tc.input), nil)
 | 
						|
 | 
						|
		if !tc.errorFunc(err) {
 | 
						|
			t.Errorf("Test %d error expectation failed, got %s", i, err)
 | 
						|
			continue
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 |