in app/services/FileMove/ImprovedLargeFileCopier.scala [332:381]
def headSourceFile(region:Regions, credentialsProvider: Option[AwsCredentialsProvider], sourceBucket: String, sourceKey:String, sourceVersion:Option[String])
(implicit poolClientFlow:HostConnectionPool[Any]) = {
val req = createRequest(HttpMethods.HEAD, region, sourceBucket, sourceKey, sourceVersion)(ImprovedLargeFileCopier.NoRequestCustomisation)
Source
.single(req)
.mapAsync(1)(reqparts=>doRequestSigning(reqparts._1, region, credentialsProvider).map(req=>(req, reqparts._2)))
.map(reqparts=>{
logger.info(s"Request to send has ${reqparts._1.headers.length} headers. Signed request headers:")
reqparts._1.headers.foreach(hdr=>logger.info(s"\t${hdr.name()}: ${hdr.value()}"))
reqparts
})
.via(poolClientFlow)
.runWith(Sink.head)
.map({
case (Success(result), _) =>
(result.status: @switch) match {
case StatusCodes.OK =>
logger.info(s"HEAD success on $sourceBucket/$sourceKey@${sourceVersion.getOrElse("LATEST")}")
result.headers.foreach(hdr => {
logger.debug(s"\t${hdr.name()} => ${hdr.value()}")
})
result.discardEntityBytes()
Some(ImprovedLargeFileCopier.HeadInfo(sourceBucket, sourceKey, sourceVersion,
result.headers, result.entity.contentType, result.entity.contentLengthOption)
)
case StatusCodes.NotFound=>
result.discardEntityBytes()
logger.warn(s"No file found for $sourceBucket/$sourceKey@${sourceVersion.getOrElse("LATEST")}")
None
case StatusCodes.Forbidden=>
val contentFut = result
.entity
.dataBytes
.runWith(Sink.fold(ByteString.empty)(_ ++ _))
//only for debugging!!
val content = Await.result(contentFut, 10.seconds)
logger.error(s"Access was forbidden to $sourceBucket/$sourceKey@${sourceVersion.getOrElse("LATEST")}: '${content.utf8String}'")
throw new RuntimeException("Access forbidden")
case _=>
result.discardEntityBytes()
logger.error(s"Unexpected response from S3 in HEAD operation: ${result.status.value}")
throw new RuntimeException(s"Unexpected response from S3: ${result.status.value}")
}
case (Failure(err), _) =>
logger.error(s"Could not retrieve metadata for s3://$sourceBucket/$sourceKey@${sourceVersion.getOrElse("LATEST")}:" +
s" ${err.getMessage}", err)
throw err //fail the future
})
}