[BUG] - Issue Title cse 2.8.20版本 org.apache.servicecomb.foundation.vertx.stream.BufferInputStream流 int read()方法读取单字节,如果读取到流末尾会抛异常IndexOutOfBoundsException
Ninguém assumiu esta issue ainda.
Avaliação
- Dificuldade
- 2/5
- Tempo estimado
- 1-3 horas
- Facilidade para iniciantes
- 45/100
Direção de pesquisa
Comece com org.apache.servicecomb.foundation.vertx.stream.BufferInputStream e reproduza o problema usando o exemplo CseBufferInputStream.main. Verifique o comportamento de int read() quando o ByteBuf encapsulado chega ao fim e, em seguida, confirme que gzipRead com dados gzip válidos também é concluído sem IndexOutOfBoundsException e que o fim do fluxo retorna -1.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
Steps to Reproduce
cse 2.8.20版本 org.apache.servicecomb.foundation.vertx.stream.BufferInputStream流 int read()方法读取单字节,如果读取到流末尾会抛异常IndexOutOfBoundsException
示例代码1: 单独构造失败用例
public class CseBufferInputStream {
public static void main(String[] args) throws IOException {
byte[] byteArray = new byte[10];
BufferedReader br = null;
try {
// 由于StsCseServerFilter要在此Filter之前执行,所以,需要重置码流,将ridx置0
InputStream inputStream = getRealInputStream(byteArray);
if (inputStream == null) {
return;
}
inputStream.reset();
while (inputStream.read() >= 0) {
;
}
} finally {
IOUtils.closeQuietly(br);
}
}
public static InputStream getRealInputStream(byte[] byteArray) {
// 创建 UnpooledSlicedByteBuf
ByteBuf slicedByteBuf = Unpooled.wrappedBuffer(byteArray);
// 创建 BufferInputStream,这个stream类型,以及里面的Buffer和真实的走CSE请求的一致
InputStream inputStream = new BufferInputStream(slicedByteBuf);
return inputStream;
}
}
直接执行CseBufferInputStream.main()
运行结果
org.apache.servicecomb.foundation.vertx.stream.BufferInputStream流 int read()方法读取单字节,如果读取到流末尾会抛异常IndexOutOfBoundsException
示例代码2: 实际应用
/**
* gzip解压
* @param byteArray gzip压缩数据
*
* @throws IOException IOException
*/
public static void gzipRead(byte[] byteArray) throws IOException {
BufferedReader br = null;
try {
// 由于StsCseServerFilter要在此Filter之前执行,所以,需要重置码流,将ridx置0
InputStream inputStream = getRealInputStream(byteArray);
if (inputStream == null) {
return;
}
inputStream.reset();
br = new BufferedReader(new InputStreamReader(new GZIPInputStream(inputStream), "UTF-8"));
char[] readBuff = new char[2048];
while ((br.read(readBuff)) > 0) {
}
} finally {
IOUtils.closeQuietly(br);
}
}
public static InputStream getRealInputStream(byte[] byteArray) {
// 创建 UnpooledSlicedByteBuf
ByteBuf slicedByteBuf = Unpooled.wrappedBuffer(byteArray);
// 创建 BufferInputStream,这个stream类型,以及里面的Buffer和真实的走CSE请求的一致
InputStream inputStream = new BufferInputStream(slicedByteBuf);
return inputStream;
}
调用gzipRead方法,传一个正确的gzip压缩二进制流进去, 在 java 1.8.0_432 会报错,其现象和原因同 示例1一致,
int read()方法读取单字节,如果读取到流末尾会抛异常IndexOutOfBoundsException
详细调用链见图 java 1.8.0_432 见红色流程。
Expected Behavior
org.apache.servicecomb.foundation.vertx.stream.BufferInputStream流 实现 java.io.InputStream
没字节的时候 应该返回-1,接口定义如下
Servicecomb Version
2.8.20
Additional Context
No response
- Linguagem predominante
- Java
- Estrelas
- 1.9k
- Forks
- 813
- Métricas de merge de PRs
- Nenhum PR com merge em 30d
Preparar o ambiente
- Sem Dockerfile nem arquivo Docker Compose
- Tem um modelo de pull request
- Sem guia de contribuição
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de apache/servicecomb-java-chassis
-
bug
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 65/100
apache/servicecomb-java-chassis#5106 ·
-
question
Dificuldade 5/5 Mais de uma semana Facilidade para iniciantes 35/100
apache/servicecomb-java-chassis#5153 · 1 comentário ·
-
[QUESTION] - 请发布3.x的最新版本Abertaquestion
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 25/100
apache/servicecomb-java-chassis#5146 ·
-
[FEATURE] - When will ServiceComb support Spring Boot 4.x, Spring Framework 7.x, and Jackson 3.x?Abertaenhancement
Dificuldade 5/5 Mais de uma semana Facilidade para iniciantes 25/100
apache/servicecomb-java-chassis#5145 ·
-
[BUG] - The latest instance information cannot be obtained when cache instances is empty.Talvez livre de novo @chengyouling assumiu há 149 dias e não há nenhum pull request aberto. Aberta2.x bug
apache/servicecomb-java-chassis#5141 · 1 responsável ·
Todas as issues de apache/servicecomb-java-chassis
Issues semelhantes
-
bug
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 62/100
MCModderAnchor/TACZ#758 ·
-
agent-java community triage
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 72/100
elastic/apm-agent-java#4594 ·
Mantenedores costumam responder em até 1 dia
-
area/plugin good first issue
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 85/100
kestra-io/plugin-soda#137 ·
-
area/plugin good first issue
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 82/100
kestra-io/plugin-aws#816 ·
Mantenedores costumam responder em até 2 dias
-
area/plugin good first issue
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 88/100
kestra-io/plugin-kestra#200 ·
Mantenedores costumam responder em até 1 dia