58 lines
1.4 KiB
Go
58 lines
1.4 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"regexp"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
func validateDomain(domain string) error {
|
|
if domain == "" {
|
|
return fmt.Errorf("domain cannot be empty")
|
|
}
|
|
domainRegex := regexp.MustCompile(`^(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)*[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?$`)
|
|
if !domainRegex.MatchString(domain) {
|
|
return fmt.Errorf("invalid domain format: %s", domain)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func validatePath(path string) error {
|
|
if path == "" {
|
|
return fmt.Errorf("path cannot be empty")
|
|
}
|
|
if strings.Contains(path, "..") {
|
|
return fmt.Errorf("path cannot contain parent directory references (..)")
|
|
}
|
|
if !strings.HasPrefix(path, "/") {
|
|
return fmt.Errorf("path must start with /")
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func validatePort(port string) error {
|
|
if port == "" {
|
|
return fmt.Errorf("port cannot be empty")
|
|
}
|
|
p, err := strconv.Atoi(port)
|
|
if err != nil {
|
|
return fmt.Errorf("invalid port number: %s", port)
|
|
}
|
|
if p < 1 || p > 65535 {
|
|
return fmt.Errorf("port must be between 1 and 65535, got: %d", p)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func validateHeaderName(name string) error {
|
|
if name == "" {
|
|
return fmt.Errorf("header name cannot be empty")
|
|
}
|
|
headerRegex := regexp.MustCompile("^[a-zA-Z0-9!#$%&'*+\\-\\.^_`\\|~]+$")
|
|
if !headerRegex.MatchString(name) {
|
|
return fmt.Errorf("invalid header name format: %s (must be valid HTTP token characters only)", name)
|
|
}
|
|
return nil
|
|
}
|