Fix IllegalStateException in empty ProducesRequestCondition
When comparing empty ProducesRequestCondition, compareTo would throw an IllegalStateException if the Accept header was invalid. This commit fixes that behavior. Closes gh-29794
This commit is contained in:
		
							parent
							
								
									64de6de725
								
							
						
					
					
						commit
						9ebd1e8d64
					
				|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2022 the original author or authors. |  * Copyright 2002-2023 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. | ||||||
|  | @ -248,6 +248,9 @@ public final class ProducesRequestCondition extends AbstractRequestCondition<Pro | ||||||
| 	 */ | 	 */ | ||||||
| 	@Override | 	@Override | ||||||
| 	public int compareTo(ProducesRequestCondition other, ServerWebExchange exchange) { | 	public int compareTo(ProducesRequestCondition other, ServerWebExchange exchange) { | ||||||
|  | 		if (this.expressions.isEmpty() && other.expressions.isEmpty()) { | ||||||
|  | 			return 0; | ||||||
|  | 		} | ||||||
| 		try { | 		try { | ||||||
| 			List<MediaType> acceptedMediaTypes = getAcceptedMediaTypes(exchange); | 			List<MediaType> acceptedMediaTypes = getAcceptedMediaTypes(exchange); | ||||||
| 			for (MediaType acceptedMediaType : acceptedMediaTypes) { | 			for (MediaType acceptedMediaType : acceptedMediaTypes) { | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2022 the original author or authors. |  * Copyright 2002-2023 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. | ||||||
|  | @ -297,6 +297,18 @@ public class ProducesRequestConditionTests { | ||||||
| 		assertThat(result > 0).as("Should have used MediaType.equals(Object) to break the match").isTrue(); | 		assertThat(result > 0).as("Should have used MediaType.equals(Object) to break the match").isTrue(); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	@Test | ||||||
|  | 	public void compareEmptyInvalidAccept() { | ||||||
|  | 		MockServerWebExchange exchange = MockServerWebExchange.from(get("/").header("Accept", "foo")); | ||||||
|  | 
 | ||||||
|  | 		ProducesRequestCondition condition1 = new ProducesRequestCondition(); | ||||||
|  | 		ProducesRequestCondition condition2 = new ProducesRequestCondition(); | ||||||
|  | 
 | ||||||
|  | 		int result = condition1.compareTo(condition2, exchange); | ||||||
|  | 		assertThat(result).isEqualTo(0); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| 	@Test | 	@Test | ||||||
| 	public void combine() { | 	public void combine() { | ||||||
| 		ProducesRequestCondition condition1 = new ProducesRequestCondition("text/plain"); | 		ProducesRequestCondition condition1 = new ProducesRequestCondition("text/plain"); | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2022 the original author or authors. |  * Copyright 2002-2023 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. | ||||||
|  | @ -254,6 +254,9 @@ public final class ProducesRequestCondition extends AbstractRequestCondition<Pro | ||||||
| 	 */ | 	 */ | ||||||
| 	@Override | 	@Override | ||||||
| 	public int compareTo(ProducesRequestCondition other, HttpServletRequest request) { | 	public int compareTo(ProducesRequestCondition other, HttpServletRequest request) { | ||||||
|  | 		if (this.expressions.isEmpty() && other.expressions.isEmpty()) { | ||||||
|  | 			return 0; | ||||||
|  | 		} | ||||||
| 		try { | 		try { | ||||||
| 			List<MediaType> acceptedMediaTypes = getAcceptedMediaTypes(request); | 			List<MediaType> acceptedMediaTypes = getAcceptedMediaTypes(request); | ||||||
| 			for (MediaType acceptedMediaType : acceptedMediaTypes) { | 			for (MediaType acceptedMediaType : acceptedMediaTypes) { | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2022 the original author or authors. |  * Copyright 2002-2023 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. | ||||||
|  | @ -309,6 +309,17 @@ public class ProducesRequestConditionTests { | ||||||
| 		assertThat(result > 0).as("Should have used MediaType.equals(Object) to break the match").isTrue(); | 		assertThat(result > 0).as("Should have used MediaType.equals(Object) to break the match").isTrue(); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	@Test | ||||||
|  | 	public void compareEmptyInvalidAccept() { | ||||||
|  | 		HttpServletRequest request = createRequest("foo"); | ||||||
|  | 
 | ||||||
|  | 		ProducesRequestCondition condition1 = new ProducesRequestCondition(); | ||||||
|  | 		ProducesRequestCondition condition2 = new ProducesRequestCondition(); | ||||||
|  | 
 | ||||||
|  | 		int result = condition1.compareTo(condition2, request); | ||||||
|  | 		assertThat(result).isEqualTo(0); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	@Test | 	@Test | ||||||
| 	public void combine() { | 	public void combine() { | ||||||
| 		ProducesRequestCondition condition1 = new ProducesRequestCondition("text/plain"); | 		ProducesRequestCondition condition1 = new ProducesRequestCondition("text/plain"); | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue