def streamLog()

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