Два последовательных вызова вызывают ошибку - Получено RST_STREAM с кодом ошибки 2 - PullRequest
0 голосов
/ 31 октября 2019

Я использую библиотеку 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.

Что я делаю неправильно?

...