aboutsummaryrefslogtreecommitdiffstats
path: root/vespajlib
diff options
context:
space:
mode:
authorJon Marius Venstad <venstad@gmail.com>2022-03-30 15:52:09 +0200
committerJon Marius Venstad <venstad@gmail.com>2022-03-30 15:52:09 +0200
commit51368648e157524420ece2e1754acbe93e0c1eaf (patch)
tree99d61228b06ff81c2f9bc9260eb8c178e5116c82 /vespajlib
parent43567e1f53e756772316ea7f0850fdc1602f2f73 (diff)
Split in DomainName and Hostname
Diffstat (limited to 'vespajlib')
-rw-r--r--vespajlib/src/main/java/ai/vespa/validation/DomainName.java34
-rw-r--r--vespajlib/src/main/java/ai/vespa/validation/Hostname.java19
-rw-r--r--vespajlib/src/test/java/ai/vespa/validation/DomainNameTest.java34
-rw-r--r--vespajlib/src/test/java/ai/vespa/validation/HostnameTest.java34
-rw-r--r--vespajlib/src/test/java/ai/vespa/validation/NameTest.java28
5 files changed, 135 insertions, 14 deletions
diff --git a/vespajlib/src/main/java/ai/vespa/validation/DomainName.java b/vespajlib/src/main/java/ai/vespa/validation/DomainName.java
new file mode 100644
index 00000000000..52d9acc822c
--- /dev/null
+++ b/vespajlib/src/main/java/ai/vespa/validation/DomainName.java
@@ -0,0 +1,34 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package ai.vespa.validation;
+
+import java.util.regex.Pattern;
+
+import static ai.vespa.validation.Validation.requireInRange;
+import static ai.vespa.validation.Validation.requireMatch;
+
+/**
+ * A valid domain name, which can be used in a {@link java.net.URI}.
+ *
+ * @author jonmv
+ */
+public class DomainName extends StringWrapper<DomainName> {
+
+ public static final Pattern labelPattern = Pattern.compile("([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])");
+ public static final Pattern domainNamePattern = Pattern.compile("(" + labelPattern + "\\.)*" + labelPattern);
+
+ public static final DomainName localhost = DomainName.of("localhost");
+
+ private DomainName(String value) {
+ super(value);
+ }
+
+ public static DomainName of(String value) {
+ requireInRange(value.length(), "domain name", 1, 255);
+ return new DomainName(requireMatch(value, "domain name", domainNamePattern));
+ }
+
+ public static String requireLabel(String label) {
+ return requireMatch(label, "domain name label", labelPattern);
+ }
+
+}
diff --git a/vespajlib/src/main/java/ai/vespa/validation/Hostname.java b/vespajlib/src/main/java/ai/vespa/validation/Hostname.java
index 1af1d5e9a19..e53dd501c45 100644
--- a/vespajlib/src/main/java/ai/vespa/validation/Hostname.java
+++ b/vespajlib/src/main/java/ai/vespa/validation/Hostname.java
@@ -1,32 +1,23 @@
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package ai.vespa.validation;
-import java.util.regex.Pattern;
-
+import static ai.vespa.validation.Validation.requireInRange;
import static ai.vespa.validation.Validation.requireMatch;
/**
- * A valid hostname.
+ * A valid hostname, matching {@link DomainName#domainNamePattern}, and no more than 64 characters in length.
*
* @author jonmv
*/
public class Hostname extends StringWrapper<Hostname> {
- public static final Pattern hostnameLabel = Pattern.compile("([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])");
- public static final Pattern hostnamePattern = Pattern.compile("(?=.{1,255})(" + hostnameLabel + "\\.)*" + hostnameLabel);
-
- public static final Hostname localhost = Hostname.of("localhost");
-
private Hostname(String value) {
super(value);
}
- public static Hostname of(String hostname) {
- return new Hostname(requireMatch(hostname, "hostname", hostnamePattern));
- }
-
- public static String requireLabel(String label) {
- return requireMatch(label, "hostname label", hostnameLabel);
+ public static Hostname of(String value) {
+ requireInRange(value.length(), "hostname length", 1, 64);
+ return new Hostname(requireMatch(value, "hostname", DomainName.domainNamePattern));
}
}
diff --git a/vespajlib/src/test/java/ai/vespa/validation/DomainNameTest.java b/vespajlib/src/test/java/ai/vespa/validation/DomainNameTest.java
new file mode 100644
index 00000000000..dad2086d6ea
--- /dev/null
+++ b/vespajlib/src/test/java/ai/vespa/validation/DomainNameTest.java
@@ -0,0 +1,34 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package ai.vespa.validation;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+/**
+ * @author jonmv
+ */
+class DomainNameTest {
+
+ @Test
+ void testNames() {
+ DomainName.of("name-123.0.321-eman");
+ DomainName.of(("." + "a".repeat(63)).repeat(4).substring(1));
+ DomainName.of("123");
+
+ assertThrows(IllegalArgumentException.class, () -> DomainName.of("_"));
+ assertThrows(IllegalArgumentException.class, () -> DomainName.of("-"));
+ assertThrows(IllegalArgumentException.class, () -> DomainName.of("."));
+ assertThrows(IllegalArgumentException.class, () -> DomainName.of("-foo"));
+ assertThrows(IllegalArgumentException.class, () -> DomainName.of("foo-"));
+ assertThrows(IllegalArgumentException.class, () -> DomainName.of(".foo"));
+ assertThrows(IllegalArgumentException.class, () -> DomainName.of("foo."));
+ assertThrows(IllegalArgumentException.class, () -> DomainName.of("foo..bar"));
+ assertThrows(IllegalArgumentException.class, () -> DomainName.of("foo.-.bar"));
+ assertThrows(IllegalArgumentException.class, () -> DomainName.of("foo/"));
+ assertThrows(IllegalArgumentException.class, () -> DomainName.of("foo%"));
+ assertThrows(IllegalArgumentException.class, () -> DomainName.of(("." + "a".repeat(32)).repeat(8).substring(1, 257)));
+ assertThrows(IllegalArgumentException.class, () -> DomainName.of("a".repeat(64)));
+ }
+
+}
diff --git a/vespajlib/src/test/java/ai/vespa/validation/HostnameTest.java b/vespajlib/src/test/java/ai/vespa/validation/HostnameTest.java
new file mode 100644
index 00000000000..7969c2a5f78
--- /dev/null
+++ b/vespajlib/src/test/java/ai/vespa/validation/HostnameTest.java
@@ -0,0 +1,34 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package ai.vespa.validation;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+/**
+ * @author jonmv
+ */
+public class HostnameTest {
+
+ @Test
+ void testNames() {
+ Hostname.of("name-123.0.321-eman");
+ Hostname.of(("." + "a".repeat(32)).repeat(2).substring(1, 65));
+ Hostname.of("123");
+
+ assertThrows(IllegalArgumentException.class, () -> Hostname.of("_"));
+ assertThrows(IllegalArgumentException.class, () -> Hostname.of("-"));
+ assertThrows(IllegalArgumentException.class, () -> Hostname.of("."));
+ assertThrows(IllegalArgumentException.class, () -> Hostname.of("-foo"));
+ assertThrows(IllegalArgumentException.class, () -> Hostname.of("foo-"));
+ assertThrows(IllegalArgumentException.class, () -> Hostname.of(".foo"));
+ assertThrows(IllegalArgumentException.class, () -> Hostname.of("foo."));
+ assertThrows(IllegalArgumentException.class, () -> Hostname.of("foo..bar"));
+ assertThrows(IllegalArgumentException.class, () -> Hostname.of("foo.-.bar"));
+ assertThrows(IllegalArgumentException.class, () -> Hostname.of("foo/"));
+ assertThrows(IllegalArgumentException.class, () -> Hostname.of("foo%"));
+ assertThrows(IllegalArgumentException.class, () -> Hostname.of(("." + "a".repeat(32)).repeat(2).substring(1, 66)));
+ assertThrows(IllegalArgumentException.class, () -> Hostname.of("a".repeat(64)));
+ }
+
+}
diff --git a/vespajlib/src/test/java/ai/vespa/validation/NameTest.java b/vespajlib/src/test/java/ai/vespa/validation/NameTest.java
new file mode 100644
index 00000000000..a578bb718a7
--- /dev/null
+++ b/vespajlib/src/test/java/ai/vespa/validation/NameTest.java
@@ -0,0 +1,28 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package ai.vespa.validation;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+/**
+ * @author jonmv
+ */
+class NameTest {
+
+ @Test
+ void testNames() {
+ Name.of("name123-_-");
+ Name.of("O".repeat(255));
+
+ assertThrows(IllegalArgumentException.class, () -> Name.of("0"));
+ assertThrows(IllegalArgumentException.class, () -> Name.of("_"));
+ assertThrows(IllegalArgumentException.class, () -> Name.of("-"));
+ assertThrows(IllegalArgumentException.class, () -> Name.of("foo."));
+ assertThrows(IllegalArgumentException.class, () -> Name.of("foo/"));
+ assertThrows(IllegalArgumentException.class, () -> Name.of("foo%"));
+ assertThrows(IllegalArgumentException.class, () -> Name.of("w".repeat(256)));
+ }
+
+}