in cdslogviewer/app/controllers/LogsController.scala [78:106]
def streamLog(route:String, logname:String, fromLine:Long) = IsAdmin { uid=> request=>
val base = config.get[String]("cds.logbase")
val path = Paths.get(base, route, logname)
if(!path.toString.startsWith(base)) {
BadRequest(GenericErrorResponse("bad_request","That is not a valid log").asJson)
} else if(!path.toFile.exists()) {
NotFound(GenericErrorResponse("not_found","The given log file does not exist").asJson)
} else {
try {
val view = Files.getFileAttributeView(path, classOf[PosixFileAttributeView])
val modTime = ZonedDateTime.ofInstant(view.readAttributes().lastModifiedTime().toInstant, tz)
val stream = FileIO.fromPath(path)
.via(Framing.delimiter(ByteString("\n"), 32768, true))
.drop(fromLine)
.map(_ ++ ByteString("\n"))
//setting Content-Length to the length of the file does not make sense, since we may have skipped an unknown
//number of characters if fromLine != 0
Result(
header = ResponseHeader(200, Map("X-Logfile-Modified"->modTime.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME))),
body = HttpEntity.Streamed(stream, None, Some("text/plain"))
)
} catch {
case err:Throwable=>
logger.error(s"Could not stream log '$logname' from '$route': ${err.getMessage}", err)
InternalServerError(GenericErrorResponse("error", err.getMessage).asJson)
}
}
}