in thrifty-runtime/src/commonMain/kotlin/com/microsoft/thrifty/service/ClientBase.kt [99:147]
fun invokeRequest(call: MethodCall<*>): Any? {
val isOneWay = call.callTypeId == TMessageType.ONEWAY
val sid = seqId.incrementAndGet()
protocol.writeMessageBegin(call.name, call.callTypeId, sid)
call.send(protocol)
protocol.writeMessageEnd()
protocol.flush()
if (isOneWay) {
// No response will be received
return Unit
}
val metadata = protocol.readMessageBegin()
if (metadata.seqId != sid) {
throw ThriftException(
ThriftException.Kind.BAD_SEQUENCE_ID,
"Unrecognized sequence ID")
}
if (metadata.type == TMessageType.EXCEPTION) {
val e = read(protocol)
protocol.readMessageEnd()
throw ServerException(e)
} else if (metadata.type != TMessageType.REPLY) {
throw ThriftException(
ThriftException.Kind.INVALID_MESSAGE_TYPE,
"Invalid message type: " + metadata.type)
}
if (metadata.seqId != seqId.get()) {
throw ThriftException(
ThriftException.Kind.BAD_SEQUENCE_ID,
"Out-of-order response")
}
if (metadata.name != call.name) {
throw ThriftException(
ThriftException.Kind.WRONG_METHOD_NAME,
"Unexpected method name in reply; expected " + call.name
+ " but received " + metadata.name)
}
return try {
val result = call.receive(protocol, metadata)
protocol.readMessageEnd()
result
} catch (e: Exception) {
if (e is Struct) {
// Business as usual
protocol.readMessageEnd()
}
throw e
}
}