Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

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

Abierto
#4,778 2 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
2/5
Tiempo estimado
1-3 horas
Aptitud para principiantes
45/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Estancado
Stack tecnológico
java
Área
backend

Línea de trabajo

Comience con org.apache.servicecomb.foundation.vertx.stream.BufferInputStream y reproduzca el problema utilizando el ejemplo CseBufferInputStream.main. Compruebe el comportamiento de int read() cuando el ByteBuf envuelto llega a su final y, después, verifique que gzipRead con datos gzip válidos también se complete sin IndexOutOfBoundsException y que el final del flujo devuelva -1.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

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

Lenguaje dominante
Java
Estrellas
1.9k
Forks
813
Merge medio
8 d 23 h
PR fusionados (30 d)
1

Guía de contribución

No hay ninguna guía de contribución indexada para este repositorio

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de apache/servicecomb-java-chassis

Todos los issues de apache/servicecomb-java-chassis

Issues similares

Más issues de Java

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.