mayao11
mayao11
Gateway测试用例中,客户端发送的字符串为"HelloHe...",而收到的是一段Base64编码的字符串,内容完全不同。 经查,原因在GateWayCase.cs中 SocketData函数中 ` List buffList = new List(); buffList.Add(Encoding.ASCII.GetBytes(data.buffer)); message.Buffers = buffList;` 改为 ` List buffList = new List(); buffList.Add(Convert.FromBase64String(data.buffer)); message.Buffers = buffList;` 即可。 (本来想提PR,但网络代理有点问题速度太慢)
SprotoRPC.cs中的核心函数 Dispatch中,有如下判断: ` info.Response = null; if (this.package.HasSession) { long session = this.package.session; info.Response = delegate (SprotoTypeBase response) {` 这样写的后果是,如果客户端发包带有session,则info.Response被赋值;如果客户端发包不带session,则info.Response不被赋值。 当客户端调整逻辑时,或刻意发送错误的包时,会导致服务器逻辑中Response出现null 这个问题会变成一个很难防范的服务器漏洞——除非我们对所有的sinfo.Response都判断是否为空,否则就会出现空引用异常,非常危险。 即便服务器做了针对null的异常处理,也会导致逻辑在执行到一半时中止(执行到Response时中止),依然有很大风险。 我目前在自己的项目中设计为:无论package.session是否存在,都给Response附上一个值,就算出问题也是客户端收包出问题,不会有更多不良影响。请考虑。
以下两种情况parse异常 message PB_A { optional int32 a = 1 [default=-1]; } message PB_B { optional double f = 1 [default=0.0]; }