in app/controllers/Application.scala [204:232]
private def getSourceFuture(locator:OMLocator, objectEntryFut:Future[Either[Result, ObjectMatrixEntry]], rangesOrFailureFut:Future[Seq[RangeHeader]], uid:String) = {
Future.sequence(Seq(objectEntryFut,rangesOrFailureFut)).map(results=>{
val ranges = results(1).asInstanceOf[Seq[RangeHeader]]
results.head.asInstanceOf[Either[Result,ObjectMatrixEntry]] match {
case Right(omEntry)=>
withUserInfo(locator) { userInfo =>
val responseSize = if (ranges.nonEmpty) {
Some(ranges.foldLeft(0L)((acc, range) => acc + (range.end.getOrElse(omEntry.fileAttribues.get.size) - range.start.getOrElse(0L))))
} else {
omEntry.fileAttribues.map(_.size)
}
//log that we are starting a streamout
val auditFile = AuditFile(omEntry.oid, locator.filePath)
auditActor ! actors.Audit.LogEvent(AuditEvent.STREAMOUT, uid, Some(auditFile), ranges)
getStreamingSource(ranges, userInfo, omEntry, auditFile, uid) match {
case Success(partialGraph) =>
Right((Source.fromGraph(partialGraph), responseSize, headersForEntry(omEntry, ranges, responseSize), getMaybeMimetype(omEntry), ranges.nonEmpty))
case Failure(err) => //if we did not get a source, log that
auditActor ! actors.Audit.LogEvent(AuditEvent.OMERROR, uid, Some(auditFile), ranges, notes = Some(err.getMessage))
logger.error(s"Could not set up streaming source: ", err)
Left(InternalServerError(s"Could not set up streaming source, see logs for more details"))
}
}
case Left(err)=> Left(err)
}})
}