|  | @ -30,7 +30,7 @@ import ( | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  | func init() { |  |  | func init() { | 
			
		
	
		
		
			
				
					|  |  | 	RegisterDirective("bind", parseBind) |  |  | 	RegisterDirective("bind", parseBind) | 
			
		
	
		
		
			
				
					
					|  |  | 	RegisterDirective("root", parseRoot) |  |  | 	RegisterDirective("root", parseRoot) // TODO: isn't this a handler directive?
 | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  | 	RegisterDirective("tls", parseTLS) |  |  | 	RegisterDirective("tls", parseTLS) | 
			
		
	
		
		
			
				
					|  |  | 	RegisterHandlerDirective("redir", parseRedir) |  |  | 	RegisterHandlerDirective("redir", parseRedir) | 
			
		
	
		
		
			
				
					|  |  | 	RegisterHandlerDirective("respond", parseRespond) |  |  | 	RegisterHandlerDirective("respond", parseRespond) | 
			
		
	
	
		
		
			
				
					|  | @ -38,6 +38,10 @@ func init() { | 
			
		
	
		
		
			
				
					|  |  | 	RegisterHandlerDirective("handle", parseHandle) |  |  | 	RegisterHandlerDirective("handle", parseHandle) | 
			
		
	
		
		
			
				
					|  |  | } |  |  | } | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  | // parseBind parses the bind directive. Syntax:
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  | //
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  | //     bind <addresses...>
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  | //
 | 
			
		
	
		
		
			
				
					|  |  | func parseBind(h Helper) ([]ConfigValue, error) { |  |  | func parseBind(h Helper) ([]ConfigValue, error) { | 
			
		
	
		
		
			
				
					|  |  | 	var lnHosts []string |  |  | 	var lnHosts []string | 
			
		
	
		
		
			
				
					|  |  | 	for h.Next() { |  |  | 	for h.Next() { | 
			
		
	
	
		
		
			
				
					|  | @ -46,6 +50,10 @@ func parseBind(h Helper) ([]ConfigValue, error) { | 
			
		
	
		
		
			
				
					|  |  | 	return h.NewBindAddresses(lnHosts), nil |  |  | 	return h.NewBindAddresses(lnHosts), nil | 
			
		
	
		
		
			
				
					|  |  | } |  |  | } | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  | // parseRoot parses the root directive. Syntax:
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  | //
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  | //     root [<matcher>] <path>
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  | //
 | 
			
		
	
		
		
			
				
					|  |  | func parseRoot(h Helper) ([]ConfigValue, error) { |  |  | func parseRoot(h Helper) ([]ConfigValue, error) { | 
			
		
	
		
		
			
				
					|  |  | 	if !h.Next() { |  |  | 	if !h.Next() { | 
			
		
	
		
		
			
				
					|  |  | 		return nil, h.ArgErr() |  |  | 		return nil, h.ArgErr() | 
			
		
	
	
		
		
			
				
					|  | @ -251,6 +259,10 @@ func parseTLS(h Helper) ([]ConfigValue, error) { | 
			
		
	
		
		
			
				
					|  |  | 	return configVals, nil |  |  | 	return configVals, nil | 
			
		
	
		
		
			
				
					|  |  | } |  |  | } | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  | // parseRedir parses the redir directive. Syntax:
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  | //
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  | //     redir [<matcher>] <to> [<code>]
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  | //
 | 
			
		
	
		
		
			
				
					|  |  | func parseRedir(h Helper) (caddyhttp.MiddlewareHandler, error) { |  |  | func parseRedir(h Helper) (caddyhttp.MiddlewareHandler, error) { | 
			
		
	
		
		
			
				
					|  |  | 	if !h.Next() { |  |  | 	if !h.Next() { | 
			
		
	
		
		
			
				
					|  |  | 		return nil, h.ArgErr() |  |  | 		return nil, h.ArgErr() | 
			
		
	
	
		
		
			
				
					|  | @ -269,10 +281,10 @@ func parseRedir(h Helper) (caddyhttp.MiddlewareHandler, error) { | 
			
		
	
		
		
			
				
					|  |  | 		code = "301" |  |  | 		code = "301" | 
			
		
	
		
		
			
				
					|  |  | 	} |  |  | 	} | 
			
		
	
		
		
			
				
					|  |  | 	if code == "temporary" || code == "" { |  |  | 	if code == "temporary" || code == "" { | 
			
		
	
		
		
			
				
					
					|  |  | 		code = "307" |  |  | 		code = "302" | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  | 	} |  |  | 	} | 
			
		
	
		
		
			
				
					|  |  | 	var body string |  |  | 	var body string | 
			
		
	
		
		
			
				
					
					|  |  | 	if code == "meta" { |  |  | 	if code == "html" { | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  | 		// Script tag comes first since that will better imitate a redirect in the browser's
 |  |  | 		// Script tag comes first since that will better imitate a redirect in the browser's
 | 
			
		
	
		
		
			
				
					|  |  | 		// history, but the meta tag is a fallback for most non-JS clients.
 |  |  | 		// history, but the meta tag is a fallback for most non-JS clients.
 | 
			
		
	
		
		
			
				
					|  |  | 		const metaRedir = `<!DOCTYPE html> |  |  | 		const metaRedir = `<!DOCTYPE html> | 
			
		
	
	
		
		
			
				
					|  | @ -296,6 +308,7 @@ func parseRedir(h Helper) (caddyhttp.MiddlewareHandler, error) { | 
			
		
	
		
		
			
				
					|  |  | 	}, nil |  |  | 	}, nil | 
			
		
	
		
		
			
				
					|  |  | } |  |  | } | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  | // parseRespond parses the respond directive.
 | 
			
		
	
		
		
			
				
					|  |  | func parseRespond(h Helper) (caddyhttp.MiddlewareHandler, error) { |  |  | func parseRespond(h Helper) (caddyhttp.MiddlewareHandler, error) { | 
			
		
	
		
		
			
				
					|  |  | 	sr := new(caddyhttp.StaticResponse) |  |  | 	sr := new(caddyhttp.StaticResponse) | 
			
		
	
		
		
			
				
					|  |  | 	err := sr.UnmarshalCaddyfile(h.Dispenser) |  |  | 	err := sr.UnmarshalCaddyfile(h.Dispenser) | 
			
		
	
	
		
		
			
				
					|  | @ -305,6 +318,7 @@ func parseRespond(h Helper) (caddyhttp.MiddlewareHandler, error) { | 
			
		
	
		
		
			
				
					|  |  | 	return sr, nil |  |  | 	return sr, nil | 
			
		
	
		
		
			
				
					|  |  | } |  |  | } | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  | // parseRoute parses the route directive.
 | 
			
		
	
		
		
			
				
					|  |  | func parseRoute(h Helper) (caddyhttp.MiddlewareHandler, error) { |  |  | func parseRoute(h Helper) (caddyhttp.MiddlewareHandler, error) { | 
			
		
	
		
		
			
				
					|  |  | 	sr := new(caddyhttp.Subroute) |  |  | 	sr := new(caddyhttp.Subroute) | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  | @ -337,6 +351,7 @@ func parseRoute(h Helper) (caddyhttp.MiddlewareHandler, error) { | 
			
		
	
		
		
			
				
					|  |  | 	return sr, nil |  |  | 	return sr, nil | 
			
		
	
		
		
			
				
					|  |  | } |  |  | } | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  | // parseHandle parses the route directive.
 | 
			
		
	
		
		
			
				
					|  |  | func parseHandle(h Helper) (caddyhttp.MiddlewareHandler, error) { |  |  | func parseHandle(h Helper) (caddyhttp.MiddlewareHandler, error) { | 
			
		
	
		
		
			
				
					|  |  | 	var allResults []ConfigValue |  |  | 	var allResults []ConfigValue | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  | 
 |