Hacktoberfest 2026 : les issues que les mainteneurs ont marquées pour octobre, ouvertes et accessibles aux débutants. Parcourir les issues Hacktoberfest

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

Ouverte
#4,778 2 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Évaluation

Difficulté
2/5
Temps estimé
1-3 heures
Accessibilité débutants
45/100
Type d'issue
Bug
Clarté
Clairement spécifiée
Activité
À l'abandon
Stack technique
java
Domaine
backend

Piste de recherche

Commencez avec org.apache.servicecomb.foundation.vertx.stream.BufferInputStream et reproduisez le problème à l’aide de l’exemple CseBufferInputStream.main. Vérifiez le comportement de int read() lorsque le ByteBuf encapsulé atteint sa fin, puis vérifiez que gzipRead avec des données gzip valides se termine également sans IndexOutOfBoundsException et que la fin du flux renvoie -1.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Description

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

Langage dominant
Java
Étoiles
1.9k
Forks
813
Merge moyen
8 j 23 h
PR mergées (30 j)
1

Guide de contribution

Aucun guide de contribution indexé pour ce dépôt

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de apache/servicecomb-java-chassis

Toutes les issues de apache/servicecomb-java-chassis

Issues similaires

Plus d'issues Java

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.