void onResponse()

in cpp-channel/cpp/HsChannel.h [96:141]


  void onResponse(
      apache::thrift::ClientReceiveState&& state) noexcept override {
    SCOPE_EXIT {
      delete this;
    };
    requestSentHelper();
    if (!recv_result_) {
      return;
    }

    if (state.isException()) {
      auto ex = state.exception().what();
      size_t len = ex.length();
      auto buf = std::unique_ptr<uint8_t, decltype(free)*>{
          reinterpret_cast<uint8_t*>(malloc(len * sizeof(uint8_t))), free};
      // If you get a memory leak here, see Note [onResponse leak].
      std::memcpy(buf.get(), ex.data(), len);

      recv_result_->status = RECV_ERROR;
      recv_result_->buffer = buf.release();
      recv_result_->len = len;
      hs_try_putmvar(cap_, recv_mvar_);
    } else {
      auto ioBuf = apache::thrift::LegacySerializedResponse(
                       state.protocolId(),
                       0,
                       state.messageType(),
                       methodName_,
                       state.extractSerializedResponse())
                       .buffer;
      size_t len = ioBuf->computeChainDataLength();
      auto msg = std::unique_ptr<uint8_t, decltype(free)*>{
          reinterpret_cast<uint8_t*>(malloc(len * sizeof(uint8_t))), free};

      auto pos = msg.get();
      for (auto r : *ioBuf) {
        std::memcpy(pos, r.data(), r.size());
        pos += r.size();
      }

      recv_result_->status = RECV_SUCCESS;
      recv_result_->buffer = msg.release();
      recv_result_->len = len;
      hs_try_putmvar(cap_, recv_mvar_);
    }
  }