diff --git a/is/rules.go b/is/rules.go index 3cad215..8c58361 100644 --- a/is/rules.go +++ b/is/rules.go @@ -122,6 +122,8 @@ var ( ErrSSN = validation.NewError("validation_is_ssn", "must be a valid social security number") // ErrSemver is the error that returns in case of an invalid semver. ErrSemver = validation.NewError("validation_is_semver", "must be a valid semantic version") + // ErrOrigin is the error that returns in case of an invalid origin. + ErrOrigin = validation.NewError("validation_is_origin", "must be a valid origin") ) var ( @@ -235,6 +237,8 @@ var ( SSN = validation.NewStringRuleWithError(govalidator.IsSSN, ErrSSN) // Semver validates if a string is a valid semantic version Semver = validation.NewStringRuleWithError(govalidator.IsSemver, ErrSemver) + // Origin validates if a string is valid origin + Origin = validation.NewStringRuleWithError(isOrigin, ErrOrigin) ) var ( @@ -247,6 +251,8 @@ var ( // Slightly modified: Removed 255 max length validation since Go regex does not // support lookarounds. More info: https://stackoverflow.com/a/38935027 reDomain = regexp.MustCompile(`^(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-z0-9])?\.)+(?:[a-zA-Z]{1,63}| xn--[a-z0-9]{1,59})$`) + // Origin https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS + reOrigin = regexp.MustCompile(`^(https?):\/\/([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+(\.[a-zA-Z]{2,})?(:\d+)?$`) ) func isISBN(value string) bool { @@ -281,3 +287,11 @@ func isUTFNumeric(value string) bool { } return true } + +func isOrigin(value string) bool { + if len(value) > 255 { + return false + } + + return reOrigin.MatchString(value) +} diff --git a/is/rules_test.go b/is/rules_test.go index e7b9ba6..574a833 100644 --- a/is/rules_test.go +++ b/is/rules_test.go @@ -76,6 +76,8 @@ func TestAll(t *testing.T) { {"Int", Int, "100", "1.1", "must be an integer number"}, {"Float", Float, "1.1", "a.1", "must be a floating point number"}, {"VariableWidth", VariableWidth, "", "", ""}, + {"Origin", Origin, "https://example.com", "example.com", "must be a valid origin"}, + {"Origin", Origin, "https://127.0.0.1:8080", "ws://example.com", "must be a valid origin"}, } for _, test := range tests {