Hacktoberfest 2026: as issues que os mantenedores marcaram para outubro, abertas e boas para iniciantes. Ver issues do Hacktoberfest

[BUG] - Issue Title cse 2.8.20版本 org.apache.servicecomb.foundation.vertx.stream.BufferInputStream流 int read()方法读取单字节,如果读取到流末尾会抛异常IndexOutOfBoundsException

Aberta
#4,778 2 comentários 0 reações 0 responsáveis Ver no GitHub

Ninguém assumiu esta issue ainda.

Avaliação

Dificuldade
2/5
Tempo estimado
1-3 horas
Facilidade para iniciantes
45/100
Tipo de issue
Bug
Clareza
Claramente especificada
Status de atividade
Estagnada
Stack de tecnologia
java
Domínio
backend

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

bug
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

Image

示例代码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 见红色流程。

Image

Expected Behavior

org.apache.servicecomb.foundation.vertx.stream.BufferInputStream流 实现 java.io.InputStream
没字节的时候 应该返回-1,接口定义如下
Image

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

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Mais de apache/servicecomb-java-chassis

Todas as issues de apache/servicecomb-java-chassis

Issues semelhantes

Mais issues de Java

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.