Я использую библиотеку Objective-C gRPC (версия 1.24.2) из кода Swift 5.0. Я запускаю код на iOS 12.2.
Сервер был написан на grpc-go v1.19.0
Мои прото:
syntax = "proto3";
package ...;
message Response {
ServiceStatus status = 1;
}
message ResultStatus {
Status status = 1;
}
enum Status {
OK = 0;
...
}
syntax = "proto3";
package ...;
message Feature {
string name = 1;
bool is_enabled = 2;
int64 valid_until = 3;
}
message QueryFeatures {
}
message ResultFeature {
common.ResultStatus status = 1;
repeated Feature features = 2;
reserved 3;
}
service FeatureTogglingService {
rpc GetFeatures(QueryFeatures) returns (ResultFeature);
}
syntax = "proto3";
package ...;
message CommandSendOnlineStatus {
}
service UserService {
rpc SendOnlineStatus(CommandSendOnlineStatus) returns (Response);
}
Что я сделал?
У меня есть класс, который соответствует протоколу GRPCProtoResponseHandler
, и у него есть метод foo
, который создаетдве службы и вызывает один метод из каждой службы:
class MyClass: NSObject, GRPCProtoResponseHandler {
var dispatchQueue: DispatchQueue {
return .main
}
func foo() {
let callOptions = GRPCMutableCallOptions()
callOptions.initialMetadata = ["authorization": "Bearer eyJhbGciO..."]
featureService = FeatureTogglingService(host: "example.com:443", callOptions: callOptions)
userService = UserService(host: "example.com:443", callOptions: callOptions)
let userCall = userService?.sendOnlineStatus(withMessage: userRequest, responseHandler: self, callOptions: nil)
let featureCall = featureService?.getFeaturesWithMessage(featureTogglingRequest, responseHandler: self, callOptions: nil)
featureCall?.start()
userCall?.start()
}
func didReceiveProtoMessage(_ message: GPBMessage?) {
}
func didClose(withTrailingMetadata trailingMetadata: [AnyHashable : Any]?, error: Error?) {
print("??? error: \(error)")
}
}
Я вызываю foo
метод.
Что я ожидал увидеть?
Я ожидал увидеть двевызов метода func didClose(withTrailingMetadata trailingMetadata: [AnyHashable : Any]?, error: Error?)
с error == nil
Что я видел вместо этого?
Я вижу два вызова метода func didClose(withTrailingMetadata trailingMetadata: [AnyHashable : Any]?, error: Error?)
, где error
содержит:
??? error: Optional(Error Domain=io.grpc Code=13 "{"created":"@1572546519.322425000","description":"Error received from peer ipv4:...:443","file":".../Pods/gRPC-Core/src/core/lib/surface/call.cc","file_line":1055,"grpc_message":"Received RST_STREAM with error code 2","grpc_status":13}" UserInfo={io.grpc.HeadersKey={
date = "Thu, 31 Oct 2019 18:28:39 GMT";
server = nginx;
}, io.grpc.TrailersKey={
}, NSDebugDescription={"created":"@1572546519.322425000","description":"Error received from peer ipv4:...:443","file":".../Pods/gRPC-Core/src/core/lib/surface/call.cc","file_line":1055,"grpc_message":"Received RST_STREAM with error code 2","grpc_status":13}, NSLocalizedDescription=Received RST_STREAM with error code 2})
??? error: Optional(Error Domain=io.grpc Code=13 "{"created":"@1572546519.322339000","description":"Error received from peer ipv4:...:443","file":".../Pods/gRPC-Core/src/core/lib/surface/call.cc","file_line":1055,"grpc_message":"Received RST_STREAM with error code 2","grpc_status":13}" UserInfo={io.grpc.HeadersKey={
date = "Thu, 31 Oct 2019 18:28:39 GMT";
server = nginx;
}, io.grpc.TrailersKey={
}, NSDebugDescription={"created":"@1572546519.322339000","description":"Error received from peer ipv4:...:443","file":".../Pods/gRPC-Core/src/core/lib/surface/call.cc","file_line":1055,"grpc_message":"Received RST_STREAM with error code 2","grpc_status":13}, NSLocalizedDescription=Received RST_STREAM with error code 2})
Но в журналах сервера я вижу, что каждый вызов прошел нормально, потому что статус ответа 200. Вот почему я думаю, что есть проблема на стороне клиента в библиотеке gRPC Objective-C.
Что я делаю неправильно?