protected[core] def processRunResponseContent()

in common/scala/src/main/scala/org/apache/openwhisk/core/entity/ActivationResult.scala [199:257]


  protected[core] def processRunResponseContent(response: Either[ContainerConnectionError, ContainerResponse],
                                                logger: Logging): ActivationResponse = {
    response match {
      case Right(res @ ContainerResponse(_, str, truncated)) =>
        truncated match {
          case None =>
            val sizeOpt = Option(str).map(_.length)
            Try { str.parseJson } match {
              case scala.util.Success(result @ JsObject(fields)) =>
                // If the response is a JSON object container an error field, accept it as the response error.
                val errorOpt = fields.get(ERROR_FIELD)

                if (res.okStatus) {
                  errorOpt map { error =>
                    applicationError(error, sizeOpt)
                  } getOrElse {
                    // The happy path.
                    success(Some(result), sizeOpt)
                  }
                } else {
                  // Any non-200 code is treated as a container failure. We still need to check whether
                  // there was a useful error message in there.
                  val errorContent = errorOpt getOrElse invalidRunResponse(str).toJson
                  developerError(errorContent, sizeOpt)
                }

              case scala.util.Success(result @ JsArray(_)) =>
                if (res.okStatus) {
                  success(Some(result), sizeOpt)
                } else {
                  // Any non-200 code is treated as a container failure. We still need to check whether
                  // there was a useful error message in there.
                  val errorContent = invalidRunResponse(str).toJson
                  //developerErrorWithLog(errorContent, sizeOpt, None)
                  developerError(errorContent, sizeOpt)
                }

              case scala.util.Success(notAnObj) =>
                // This should affect only blackbox containers, since our own containers should already test for that.
                developerError(invalidRunResponse(str), sizeOpt)

              case scala.util.Failure(t) =>
                // This should affect only blackbox containers, since our own containers should already test for that.
                logger.warn(this, s"response did not json parse: '$str' led to $t")
                developerError(invalidRunResponse(str), sizeOpt)
            }

          case Some((length, maxlength)) =>
            applicationError(JsString(truncatedResponse(str, length, maxlength)), Some(length.toBytes.toInt))
        }

      case Left(_: MemoryExhausted) =>
        developerError(memoryExhausted)

      case Left(e) =>
        // This indicates a terminal failure in the container (it exited prematurely).
        developerError(abnormalRun)
    }
  }