From b121c0e2eac898d9762523af01895ca18219126d Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Thu, 19 Mar 2020 12:17:24 +0000 Subject: [PATCH] Avoid ClassCastException in TomcatHttpHandlerAdapter Closes gh-24707 --- .../server/reactive/TomcatHttpHandlerAdapter.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/spring-web/src/main/java/org/springframework/http/server/reactive/TomcatHttpHandlerAdapter.java b/spring-web/src/main/java/org/springframework/http/server/reactive/TomcatHttpHandlerAdapter.java index c01a11b5a7e..783be84a52a 100644 --- a/spring-web/src/main/java/org/springframework/http/server/reactive/TomcatHttpHandlerAdapter.java +++ b/spring-web/src/main/java/org/springframework/http/server/reactive/TomcatHttpHandlerAdapter.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2018 the original author or authors. + * Copyright 2002-2020 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. @@ -23,6 +23,7 @@ import java.nio.ByteBuffer; import java.nio.charset.Charset; import javax.servlet.AsyncContext; +import javax.servlet.ServletInputStream; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; @@ -131,13 +132,17 @@ public class TomcatHttpHandlerAdapter extends ServletHttpHandlerAdapter { @Override protected DataBuffer readFromInputStream() throws IOException { + ServletInputStream inputStream = ((ServletRequest) getNativeRequest()).getInputStream(); + if (!(inputStream instanceof CoyoteInputStream)) { + // It's possible InputStream can be wrapped, preventing use of CoyoteInputStream + return super.readFromInputStream(); + } boolean release = true; int capacity = this.bufferSize; DataBuffer dataBuffer = this.factory.allocateBuffer(capacity); try { ByteBuffer byteBuffer = dataBuffer.asByteBuffer(0, capacity); - ServletRequest request = getNativeRequest(); - int read = ((CoyoteInputStream) request.getInputStream()).read(byteBuffer); + int read = ((CoyoteInputStream) inputStream).read(byteBuffer); logBytesRead(read); if (read > 0) { dataBuffer.writePosition(read);