Devtools PC端Remote Debug下chunked模式解析错误
发布于 3 年前 作者 jiehou 9777 次浏览 来自 问答

代码业务场景

基于chunked模式与后台通信,实现数据交换。

同一套代码,测试运行正常的运行场景:

1 在DevTool的开发环境下,运行正常。

2 在Remote Debug模式下,IOS端测试运行正常。

3 在体验版本下,IOS端运行正常

运行失败的场景:

1 在体验版下,PC端运行出错

2 在Remote Debug模式下,PC端运行出错

__错误信息: __

文字描述:servicewechat.com/wx…c939e3/0/index.js:3 Uncaught ReferenceError: global is not defined

由于无法直接看到index.js下的代码,所以无从定位问题,只能从现象看做推理了…

分析过程以及初步得到的信息:

在Debug模式下,抓取IOS的请求如下:

在PC端的Debug模式下抓取同一个请求如下:

其中两者的差异:

1 响应中缺少了Transfer-Encoding:chunked的设置。(经过分析,Http2本身就不会返回上述信息)

2 二者使用http协议分别为1.1 和2

初步推测的可能:

分析1: 表面原因: The provided value ‘stream’ is not a valid enum value of type XWebXMLHttpRequestResponseType.

基于上述推测,在http2模式下,content-type: text/event-stream的不支持导致了global is not defined的error

分析2: 在目前nginx中的关键配置如下:

server {
        listen       443 ssl http2;
        listen       [::]:443 ssl http2;
        proxy_buffering off;
        chunked_transfer_encoding on;
        location /wx/api/v1/ {
            proxy_http_version 1.1;
            proxy_pass http://127.0.0.1:8090/wx/api/v1/;
            proxy_set_header Host $proxy_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_ssl_session_reuse off;
            proxy_ssl_server_name on;
            proxy_ssl_name $proxy_host;
            proxy_ssl_protocols TLSv1
   }

其中开启了http2的支持,同时在proxy_http_version中指定了1.1版本。

按照设置,应该可以兼容http2的请求,并将结果顺利返回的。

分析3: 基于在IOS端,可以正常运行和访问的情况来推测,可以理解有以下两种可能性:

可能1: PC端默认使用http2,但是对于stream/chunked模式不支持,或支持的不完整,导致上述问题。

可能2: Nginx配置可能有问题,但是从已有资料来说,个人理解应该不是(如果说的不准确,欢迎大家拍砖)。

可能的解决方案:

方案1: 在PC端,与IOS端保持步调一致,使用http1.1,且支持完整(这里假定http1.1的stream模式之前就已经支持是完整的,只需做一下协议的降级即可,至少在mobile端是OK的)

方案2: 保持http2不变,修复上述问题(微信的responseType支持text和arraybuffer两种)

求助期望

希望帮忙看看这个问题,是否理解正确,且希望能够帮忙定位和解决一下。

回到顶部