All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.findify.s3mock.route.MetadataUtil.scala Maven / Gradle / Ivy

The newest version!
package io.findify.s3mock.route

import java.lang.Iterable
import java.util

import akka.http.javadsl.model.HttpHeader
import akka.http.scaladsl.model.HttpRequest
import com.amazonaws.AmazonClientException
import com.amazonaws.services.s3.Headers
import com.amazonaws.services.s3.internal.ServiceUtils
import com.amazonaws.services.s3.model.ObjectMetadata
import com.amazonaws.util.{DateUtils, StringUtils}
import com.typesafe.scalalogging.LazyLogging

import scala.collection.JavaConverters._

object MetadataUtil extends LazyLogging {

   def populateObjectMetadata(request: HttpRequest): ObjectMetadata = {
    val metadata = new ObjectMetadata()
    val ignoredHeaders: util.HashSet[String] = new util.HashSet[String]()
    ignoredHeaders.add(Headers.DATE)
    ignoredHeaders.add(Headers.SERVER)
    ignoredHeaders.add(Headers.REQUEST_ID)
    ignoredHeaders.add(Headers.EXTENDED_REQUEST_ID)
    ignoredHeaders.add(Headers.CLOUD_FRONT_ID)
    ignoredHeaders.add(Headers.CONNECTION)

    val headers: Iterable[HttpHeader] = request.getHeaders()
    for (header <- headers.asScala) {
      var key: String = header.name()
      if (StringUtils.beginsWithIgnoreCase(key, Headers.S3_USER_METADATA_PREFIX)) {
        key = key.substring(Headers.S3_USER_METADATA_PREFIX.length)
        metadata.addUserMetadata(key, header.value())
      }
      //      else if (ignoredHeaders.contains(key)) {
      // ignore...
      //      }
      else if (key.equalsIgnoreCase(Headers.LAST_MODIFIED)) try
        metadata.setHeader(key, ServiceUtils.parseRfc822Date(header.value()))

      catch {
        case pe: Exception => logger.warn("Unable to parse last modified date: " + header.value(), pe)
      }
      else if (key.equalsIgnoreCase(Headers.CONTENT_LENGTH)) try
        metadata.setHeader(key, java.lang.Long.parseLong(header.value()))

      catch {
        case nfe: NumberFormatException => throw new AmazonClientException("Unable to parse content length. Header 'Content-Length' has corrupted data" + nfe.getMessage, nfe)
      }
      else if (key.equalsIgnoreCase(Headers.ETAG)) metadata.setHeader(key, ServiceUtils.removeQuotes(header.value()))
      else if (key.equalsIgnoreCase(Headers.EXPIRES)) try
        metadata.setHttpExpiresDate(DateUtils.parseRFC822Date(header.value()))

      catch {
        case pe: Exception => logger.warn("Unable to parse http expiration date: " + header.value(), pe)
      }
      //      else if (key.equalsIgnoreCase(Headers.EXPIRATION)) new ObjectExpirationHeaderHandler[ObjectMetadata]().handle(metadata, response)
      //      else if (key.equalsIgnoreCase(Headers.RESTORE)) new ObjectRestoreHeaderHandler[ObjectRestoreResult]().handle(metadata, response)
      //      else if (key.equalsIgnoreCase(Headers.REQUESTER_CHARGED_HEADER)) new S3RequesterChargedHeaderHandler[S3RequesterChargedResult]().handle(metadata, response)
      else if (key.equalsIgnoreCase(Headers.S3_PARTS_COUNT)) try
        metadata.setHeader(key, header.value().toInt)

      catch {
        case nfe: NumberFormatException => throw new AmazonClientException("Unable to parse part count. Header x-amz-mp-parts-count has corrupted data" + nfe.getMessage, nfe)
      }
      else metadata.setHeader(key, header.value())
    }

    if(metadata.getContentType == null){
      metadata.setContentType(request.entity.getContentType.toString)
    }
    metadata
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy