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"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  | @ -248,6 +248,9 @@ public final class ProducesRequestCondition extends AbstractRequestCondition<Pro | |||
| 	 */ | ||||
| 	@Override | ||||
| 	public int compareTo(ProducesRequestCondition other, ServerWebExchange exchange) { | ||||
| 		if (this.expressions.isEmpty() && other.expressions.isEmpty()) { | ||||
| 			return 0; | ||||
| 		} | ||||
| 		try { | ||||
| 			List<MediaType> acceptedMediaTypes = getAcceptedMediaTypes(exchange); | ||||
| 			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"); | ||||
|  * 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(); | ||||
| 	} | ||||
| 
 | ||||
| 	@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 | ||||
| 	public void combine() { | ||||
| 		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"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  | @ -254,6 +254,9 @@ public final class ProducesRequestCondition extends AbstractRequestCondition<Pro | |||
| 	 */ | ||||
| 	@Override | ||||
| 	public int compareTo(ProducesRequestCondition other, HttpServletRequest request) { | ||||
| 		if (this.expressions.isEmpty() && other.expressions.isEmpty()) { | ||||
| 			return 0; | ||||
| 		} | ||||
| 		try { | ||||
| 			List<MediaType> acceptedMediaTypes = getAcceptedMediaTypes(request); | ||||
| 			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"); | ||||
|  * 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(); | ||||
| 	} | ||||
| 
 | ||||
| 	@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 | ||||
| 	public void combine() { | ||||
| 		ProducesRequestCondition condition1 = new ProducesRequestCondition("text/plain"); | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue