src

Go monorepo.
git clone git://code.dwrz.net/src
Log | Files | Refs

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 }