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)
}
}