host.go (1298B)
1 package awsrulesfn 2 3 import ( 4 "net" 5 "strings" 6 7 smithyhttp "github.com/aws/smithy-go/transport/http" 8 ) 9 10 // IsVirtualHostableS3Bucket returns if the input is a DNS compatible bucket 11 // name and can be used with Amazon S3 virtual hosted style addressing. Similar 12 // to [rulesfn.IsValidHostLabel] with the added restriction that the length of label 13 // must be [3:63] characters long, all lowercase, and not formatted as an IP 14 // address. 15 func IsVirtualHostableS3Bucket(input string, allowSubDomains bool) bool { 16 // input should not be formatted as an IP address 17 // NOTE: this will technically trip up on IPv6 hosts with zone IDs, but 18 // validation further down will catch that anyway (it's guaranteed to have 19 // unfriendly characters % and : if that's the case) 20 if net.ParseIP(input) != nil { 21 return false 22 } 23 24 var labels []string 25 if allowSubDomains { 26 labels = strings.Split(input, ".") 27 } else { 28 labels = []string{input} 29 } 30 31 for _, label := range labels { 32 // validate special length constraints 33 if l := len(label); l < 3 || l > 63 { 34 return false 35 } 36 37 // Validate no capital letters 38 for _, r := range label { 39 if r >= 'A' && r <= 'Z' { 40 return false 41 } 42 } 43 44 // Validate valid host label 45 if !smithyhttp.ValidHostLabel(label) { 46 return false 47 } 48 } 49 50 return true 51 }