NetBare-Android icon indicating copy to clipboard operation
NetBare-Android copied to clipboard

编码是gzip trunked的response body怎么解析

Open Ezreal147 opened this issue 6 years ago • 14 comments

Ezreal147 avatar Oct 07 '19 03:10 Ezreal147

Gzip的用GzipInputStream,chunked解析要用第三方库(可以github找ChunkedInputStream)或者自己写

MegatronKing avatar Oct 07 '19 03:10 MegatronKing

override fun onResponseInject(response: HttpResponse, body: HttpBody, callback: InjectorCallback) 我是直接解析这个body的,但是好像netbare获取的数据不完整,body的结尾不是chuncked编码格式的,结尾不是0和\r\n\r\n

Ezreal147 avatar Oct 07 '19 04:10 Ezreal147

image

在这里我可以打印出所有的包,但是到这里之后就只有一个chuncked, image

分离head和body用\r\n\r\n,好像会把最后一个chunked的结束标志给弄没了

Ezreal147 avatar Oct 07 '19 05:10 Ezreal147

如果body很大,一次回调可能不会给出完整的body,而是多次回调。

MegatronKing avatar Oct 07 '19 05:10 MegatronKing

如何进多次回调

Ezreal147 avatar Oct 07 '19 05:10 Ezreal147

如果body很大,一次回调可能不会给出完整的body,而是多次回调。

请问需要修改netbare-core里的源码吗

Anhanguerattt avatar Oct 07 '19 07:10 Anhanguerattt

不需要

MegatronKing avatar Oct 07 '19 07:10 MegatronKing

gzip chunked能注入吗?没办法单独解压一个包啊,还是等接收到所有包后再发?

Ezreal147 avatar Oct 07 '19 11:10 Ezreal147

我也遇到了和你一样的问题,后来我发现直接在onRequestInject()里面加一个"Accept-Encoding":"None" 头就行了。

    override fun onRequestInject(header: HttpRequestHeaderPart, callback: InjectorCallback) {
        val newHeader = header.newBuilder().replaceHeader("Accept-Encoding", "None").build()
        callback.onFinished(newHeader)
    }

这样出来的数据就是明文数据,然后处理一下chunked就好了。 希望能帮到你。

Stxr avatar Oct 08 '19 16:10 Stxr

非常感谢,我现在是接收到所有包合并后解压gzip,但是不知道要怎么把数据再返回给客户端。我看了httpcanary的处理gzip,chunked的方法好像是收到所有包后直接返回一个包含全部数据的包。 如果修改请求头的话,那我修改了返回数据,直接返回明文数据给客户端吗?

Ezreal147 avatar Oct 08 '19 16:10 Ezreal147

非常感谢,我现在是接收到所有包合并后解压gzip,但是不知道要怎么把数据再返回给客户端。我看了httpcanary的处理gzip,chunked的方法好像是收到所有包后直接返回一个包含全部数据的包。 如果修改请求头的话,那我修改了返回数据,直接返回明文数据给客户端吗?

可以的,如果直接返回明文,要记得response的header也要改一下"Accept-Encoding":"None"

Stxr avatar Oct 08 '19 17:10 Stxr

@Ezreal147 我也遇到了将所有chunked包合并后解压gzip,修改数据后重新gzip压缩返回给客户端,客户端展示不出的问题。你这边有解决方案了吗?而且很奇怪,同样的代码,https+gzip能展示;http+gzip+chunked也能展示;只有https+gzip+chunked不能展示

ipercy avatar Feb 12 '20 11:02 ipercy

已經在request的header中設置了 accept-encoding:"none" 了 服務端返回的數據已經是明文了 但是 爲什麽body 打印出來的不全 ,上面説的多次回調我要怎麽才能接到多次回調的body

wordgege avatar Jun 28 '20 05:06 wordgege

我也遇到了gzip解码的问题,直接转成字符串会乱码,也尝试过解码gzip的方法,但是由于可能会包不完整,所以解码会失败,合并包感觉太麻烦 所以我是直接去掉了请求头中的Accept-Encoding

@Override
    public void onRequestInject(@NonNull HttpRequestHeaderPart header, @NonNull InjectorCallback callback) throws IOException {
        // 当sniffRequest返回true时,会走到此方法。
        // 对请求头部进行注入,包括method、url、headers都可以修改
        LogHelper.log("注入请求头:");
        LogHelper.log(new String(header.toBuffer().array()));
        LogHelper.log("移除Accept-Encoding");
        header.headers().remove("Accept-Encoding");
        LogHelper.log(new String(header.toBuffer().array()));
        // 注入完成后将新的数据发出去
        callback.onFinished(header);
    }

zimo0o0omiz avatar Sep 09 '21 05:09 zimo0o0omiz