GRPC client error: connection closed before server preface received
Describe the bug
When using a GRPC client to call a brpc server with redis protocol enabled, the client will failed with code = Unavailable desc = connection closed before server preface received.
Introduced by #3024 , the Redis protocol check is too loose, and it parses the GRPC protocol as the Redis protocol.
To Reproduce
This is the code to reproduce the the issue.
#include <brpc/server.h>
class RedisService : public brpc::RedisService {
};
int main(int argc, char* argv[]) {
google::ParseCommandLineFlags(&argc, &argv, true);
brpc::Server server;
brpc::ServerOptions options;
RedisService redis_service;
options.redis_service = &redis_service;
if (server.Start(7447, &options) != 0) {
LOG(ERROR) << "Failed to start dummy server";
return 1;
}
server.RunUntilAskedToQuit();
return 0;
}
Expected behavior
The GRPC client failed with `code = Unimplemented desc = [10.234.44.157:4003][E1002]Fail to find method on /service.method"
Versions OS: ubuntu 20.04 kernel: 5.15.0 Compiler: clang-12 brpc: 1.14.1 protobuf: 27.3
Additional context/screenshots
有人关注这个issue吗?对于开启了brpc(grpc)和redis双协议的服务是一个比较致命的bug
@wwbmmm
@thweetkomputer
What does the grpc client send to brpc server?
maybe can restrict brpc inline protocol only accept letters.
The redis inline protocol needs to clearly specify which message headers are acceptable, because many protocols also start with plaintext letters.
If the Redis inline protocol cannot clearly identify the protocol, we can treat the Redis inline protocol as a new protocol and put it at the end of ProtocolType, so that it will not affect the existing protocol.