mirror of
https://github.com/spring-projects/spring-boot.git
synced 2024-09-03 04:26:12 +08:00
Merge pull request #39617 from wanger26
* pr/39617: Polish "Prevent long parse times for images with illegal char in tag" Prevent long parse times for images with illegal char in tag Closes gh-39617
This commit is contained in:
commit
e6d9fcd208
@ -50,7 +50,7 @@ final class Regex implements CharSequence {
|
|||||||
private static final Regex PATH_COMPONENT;
|
private static final Regex PATH_COMPONENT;
|
||||||
static {
|
static {
|
||||||
Regex segment = Regex.of("[a-z0-9]+");
|
Regex segment = Regex.of("[a-z0-9]+");
|
||||||
Regex separator = Regex.group("[._]|__|[-]*");
|
Regex separator = Regex.group("[._-]{1,2}");
|
||||||
Regex separatedSegment = Regex.group(separator, segment).oneOrMoreTimes();
|
Regex separatedSegment = Regex.group(separator, segment).oneOrMoreTimes();
|
||||||
PATH_COMPONENT = Regex.of(segment, Regex.group(separatedSegment).zeroOrOnce());
|
PATH_COMPONENT = Regex.of(segment, Regex.group(separatedSegment).zeroOrOnce());
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2012-2023 the original author or authors.
|
* Copyright 2012-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -17,6 +17,8 @@
|
|||||||
package org.springframework.boot.docker.compose.core;
|
package org.springframework.boot.docker.compose.core;
|
||||||
|
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.junit.jupiter.api.Timeout;
|
||||||
|
import org.junit.jupiter.api.Timeout.ThreadMode;
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat;
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
|
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
|
||||||
@ -39,6 +41,16 @@ class ImageReferenceTests {
|
|||||||
assertThat(reference).hasToString("docker.io/library/ubuntu");
|
assertThat(reference).hasToString("docker.io/library/ubuntu");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void ofSimpleNameWithSingleCharacterSuffix() {
|
||||||
|
ImageReference reference = ImageReference.of("ubuntu-a");
|
||||||
|
assertThat(reference.getDomain()).isEqualTo("docker.io");
|
||||||
|
assertThat(reference.getName()).isEqualTo("library/ubuntu-a");
|
||||||
|
assertThat(reference.getTag()).isNull();
|
||||||
|
assertThat(reference.getDigest()).isNull();
|
||||||
|
assertThat(reference).hasToString("docker.io/library/ubuntu-a");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void ofLibrarySlashName() {
|
void ofLibrarySlashName() {
|
||||||
ImageReference reference = ImageReference.of("library/ubuntu");
|
ImageReference reference = ImageReference.of("library/ubuntu");
|
||||||
@ -149,13 +161,21 @@ class ImageReferenceTests {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void ofWhenHasIllegalCharacter() {
|
void ofWhenHasIllegalCharacterThrowsException() {
|
||||||
assertThatIllegalArgumentException()
|
assertThatIllegalArgumentException()
|
||||||
.isThrownBy(() -> ImageReference
|
.isThrownBy(() -> ImageReference
|
||||||
.of("registry.example.com/example/example-app:1.6.0-dev.2.uncommitted+wip.foo.c75795d"))
|
.of("registry.example.com/example/example-app:1.6.0-dev.2.uncommitted+wip.foo.c75795d"))
|
||||||
.withMessageContaining("Unable to parse image reference");
|
.withMessageContaining("Unable to parse image reference");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Timeout(value = 1, threadMode = ThreadMode.SEPARATE_THREAD)
|
||||||
|
void ofWhenImageNameIsVeryLongAndHasIllegalCharacterThrowsException() {
|
||||||
|
assertThatIllegalArgumentException().isThrownBy(() -> ImageReference
|
||||||
|
.of("docker.io/library/this-image-has-a-long-name-with-an-invalid-tag-which-is-at-danger-of-catastrophic-backtracking:1.0.0+1234"))
|
||||||
|
.withMessageContaining("Unable to parse image reference");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void equalsAndHashCode() {
|
void equalsAndHashCode() {
|
||||||
ImageReference r1 = ImageReference.of("ubuntu:bionic");
|
ImageReference r1 = ImageReference.of("ubuntu:bionic");
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2012-2023 the original author or authors.
|
* Copyright 2012-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -50,7 +50,7 @@ final class Regex implements CharSequence {
|
|||||||
private static final Regex PATH_COMPONENT;
|
private static final Regex PATH_COMPONENT;
|
||||||
static {
|
static {
|
||||||
Regex segment = Regex.of("[a-z0-9]+");
|
Regex segment = Regex.of("[a-z0-9]+");
|
||||||
Regex separator = Regex.group("[._]|__|[-]*");
|
Regex separator = Regex.group("[._-]{1,2}");
|
||||||
Regex separatedSegment = Regex.group(separator, segment).oneOrMoreTimes();
|
Regex separatedSegment = Regex.group(separator, segment).oneOrMoreTimes();
|
||||||
PATH_COMPONENT = Regex.of(segment, Regex.group(separatedSegment).zeroOrOnce());
|
PATH_COMPONENT = Regex.of(segment, Regex.group(separatedSegment).zeroOrOnce());
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2012-2023 the original author or authors.
|
* Copyright 2012-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -19,6 +19,8 @@ package org.springframework.boot.buildpack.platform.docker.type;
|
|||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.junit.jupiter.api.Timeout;
|
||||||
|
import org.junit.jupiter.api.Timeout.ThreadMode;
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat;
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
|
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
|
||||||
@ -43,6 +45,16 @@ class ImageReferenceTests {
|
|||||||
assertThat(reference).hasToString("docker.io/library/ubuntu");
|
assertThat(reference).hasToString("docker.io/library/ubuntu");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void ofSimpleNameWithSingleCharacterSuffix() {
|
||||||
|
ImageReference reference = ImageReference.of("ubuntu-a");
|
||||||
|
assertThat(reference.getDomain()).isEqualTo("docker.io");
|
||||||
|
assertThat(reference.getName()).isEqualTo("library/ubuntu-a");
|
||||||
|
assertThat(reference.getTag()).isNull();
|
||||||
|
assertThat(reference.getDigest()).isNull();
|
||||||
|
assertThat(reference).hasToString("docker.io/library/ubuntu-a");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void ofLibrarySlashName() {
|
void ofLibrarySlashName() {
|
||||||
ImageReference reference = ImageReference.of("library/ubuntu");
|
ImageReference reference = ImageReference.of("library/ubuntu");
|
||||||
@ -173,7 +185,7 @@ class ImageReferenceTests {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void ofWhenHasIllegalCharacter() {
|
void ofWhenHasIllegalCharacterThrowsException() {
|
||||||
assertThatIllegalArgumentException()
|
assertThatIllegalArgumentException()
|
||||||
.isThrownBy(() -> ImageReference
|
.isThrownBy(() -> ImageReference
|
||||||
.of("registry.example.com/example/example-app:1.6.0-dev.2.uncommitted+wip.foo.c75795d"))
|
.of("registry.example.com/example/example-app:1.6.0-dev.2.uncommitted+wip.foo.c75795d"))
|
||||||
@ -188,6 +200,14 @@ class ImageReferenceTests {
|
|||||||
.withMessageContaining("Unable to parse image reference");
|
.withMessageContaining("Unable to parse image reference");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Timeout(value = 1, threadMode = ThreadMode.SEPARATE_THREAD)
|
||||||
|
void ofWhenIsVeryLongAndHasIllegalCharacter() {
|
||||||
|
assertThatIllegalArgumentException().isThrownBy(() -> ImageReference
|
||||||
|
.of("docker.io/library/this-image-has-a-long-name-with-an-invalid-tag-which-is-at-danger-of-catastrophic-backtracking:1.0.0+1234"))
|
||||||
|
.withMessageContaining("Unable to parse image reference");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void forJarFile() {
|
void forJarFile() {
|
||||||
assertForJarFile("spring-boot.2.0.0.BUILD-SNAPSHOT.jar", "library/spring-boot", "2.0.0.BUILD-SNAPSHOT");
|
assertForJarFile("spring-boot.2.0.0.BUILD-SNAPSHOT.jar", "library/spring-boot", "2.0.0.BUILD-SNAPSHOT");
|
||||||
|
Loading…
Reference in New Issue
Block a user