findify / s3mock

Embedded S3 server for easy mocking
MIT License
388 stars 107 forks source link

Getting 500 from putObject request #113

Open apple-corps opened 6 years ago

apple-corps commented 6 years ago

using V2 software.amazon.awssdk.services.s3.S3Client

client.putObject(PutObjectRequest.builder().bucket(bucketName).key(key)
      .build(),
      requestBody)
com.amazonaws.services.s3.model.ObjectMetadata (Service: S3Client; Status Code: 500; Request ID: null)
software.amazon.awssdk.services.s3.model.S3Exception: com.amazonaws.services.s3.model.ObjectMetadata (Service: S3Client; Status Code: 500; Request ID: null)
    at software.amazon.awssdk.core.http.pipeline.stages.HandleResponseStage.handleErrorResponse(HandleResponseStage.java:114)
    at software.amazon.awssdk.core.http.pipeline.stages.HandleResponseStage.handleResponse(HandleResponseStage.java:72)
    at software.amazon.awssdk.core.http.pipeline.stages.HandleResponseStage.execute(HandleResponseStage.java:57)
    at software.amazon.awssdk.core.http.pipeline.stages.HandleResponseStage.execute(HandleResponseStage.java:40)
    at software.amazon.awssdk.core.http.pipeline.RequestPipelineBuilder$ComposingRequestPipelineStage.execute(RequestPipelineBuilder.java:239)
    at software.amazon.awssdk.core.http.pipeline.stages.TimerExceptionHandlingStage.execute(TimerExceptionHandlingStage.java:40)
    at software.amazon.awssdk.core.http.pipeline.stages.TimerExceptionHandlingStage.execute(TimerExceptionHandlingStage.java:30)
    at software.amazon.awssdk.core.http.pipeline.stages.RetryableStage$RetryExecutor.doExecute(RetryableStage.java:139)
    at software.amazon.awssdk.core.http.pipeline.stages.RetryableStage$RetryExecutor.execute(RetryableStage.java:105)
    at software.amazon.awssdk.core.http.pipeline.stages.RetryableStage.execute(RetryableStage.java:66)
    at software.amazon.awssdk.core.http.pipeline.stages.RetryableStage.execute(RetryableStage.java:47)
    at software.amazon.awssdk.core.http.pipeline.RequestPipelineBuilder$ComposingRequestPipelineStage.execute(RequestPipelineBuilder.java:239)
    at software.amazon.awssdk.core.http.StreamManagingStage.execute(StreamManagingStage.java:56)
    at software.amazon.awssdk.core.http.StreamManagingStage.execute(StreamManagingStage.java:42)
    at software.amazon.awssdk.core.http.pipeline.stages.ClientExecutionTimedStage.executeWithTimer(ClientExecutionTimedStage.java:71)
    at software.amazon.awssdk.core.http.pipeline.stages.ClientExecutionTimedStage.execute(ClientExecutionTimedStage.java:55)
    at software.amazon.awssdk.core.http.pipeline.stages.ClientExecutionTimedStage.execute(ClientExecutionTimedStage.java:39)
    at software.amazon.awssdk.core.http.pipeline.RequestPipelineBuilder$ComposingRequestPipelineStage.execute(RequestPipelineBuilder.java:239)
    at software.amazon.awssdk.core.http.pipeline.RequestPipelineBuilder$ComposingRequestPipelineStage.execute(RequestPipelineBuilder.java:239)
    at software.amazon.awssdk.core.http.pipeline.stages.ExecutionFailureExceptionReportingStage.execute(ExecutionFailureExceptionReportingStage.java:35)
    at software.amazon.awssdk.core.http.pipeline.stages.ExecutionFailureExceptionReportingStage.execute(ExecutionFailureExceptionReportingStage.java:24)
    at software.amazon.awssdk.core.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:281)
    at software.amazon.awssdk.core.client.SyncClientHandlerImpl.doInvoke(SyncClientHandlerImpl.java:149)
    at software.amazon.awssdk.core.client.SyncClientHandlerImpl.invoke(SyncClientHandlerImpl.java:131)
    at software.amazon.awssdk.core.client.SyncClientHandlerImpl.execute(SyncClientHandlerImpl.java:100)
    at software.amazon.awssdk.core.client.SyncClientHandlerImpl.execute(SyncClientHandlerImpl.java:76)
    at software.amazon.awssdk.core.client.SdkClientHandler.execute(SdkClientHandler.java:45)
    at software.amazon.awssdk.services.s3.DefaultS3Client.putObject(DefaultS3Client.java:2715)
apple-corps commented 6 years ago

However it does look like the object is put to the storage directory...

apple-corps commented 6 years ago
import software.amazon.awssdk.core.sync.{RequestBody, ResponseInputStream, StreamingResponseHandler}
import software.amazon.awssdk.services.s3.{S3Client, model}
import software.amazon.awssdk.services.s3.model._

  def putObject(client: S3Client,bucketName: String, key: String, requestBody: RequestBody, contentLength: Long): PutObjectResponse = {
    client.putObject(getPutObjectRequest(bucketName,key, contentLength),
      requestBody)
  }

  def getPutObjectRequest(bucketName: String, key: String, contentLength: Long, contentType: String = "binary/octet-stream", contentEncoding : String = "gzip") = {
    PutObjectRequest.builder().bucket(bucketName).key(key).contentLength(contentLength).contentType(contentType).contentEncoding(contentEncoding).metadata(Map[String,String](("key","value")).asJava).build()
  }
megarajtm commented 5 years ago

I am also using V2 software.amazon.awssdk.services.s3.S3Client and facing a similar issue. However it works with V1 version of amazon Client. [ERROR] [04/11/2019 22:38:31.607] [s3mock-akka.actor.default-dispatcher-6] [akka.actor.ActorSystemImpl(s3mock)] Error during processing of request: 'Entity stream truncation'. Completing with 500 Internal Server Error response. To change default exception handling behavior, provide a custom ExceptionHandler. akka.http.scaladsl.model.EntityStreamException: Entity stream truncation at akka.http.impl.engine.parsing.HttpMessageParser$$anonfun$1.applyOrElse(HttpMessageParser.scala:321) at akka.http.impl.engine.parsing.HttpMessageParser$$anonfun$1.applyOrElse(HttpMessageParser.scala:319) at akka.stream.impl.fusing.Collect$$anon$2.$anonfun$wrappedPf$1(Ops.scala:218) at akka.stream.impl.fusing.SupervisedGraphStageLogic.withSupervision(Ops.scala:179) at akka.stream.impl.fusing.Collect$$anon$2.onPush(Ops.scala:220) at akka.stream.impl.fusing.GraphInterpreter.processPush(GraphInterpreter.scala:519) at akka.stream.impl.fusing.GraphInterpreter.execute(GraphInterpreter.scala:411) at akka.stream.impl.fusing.GraphInterpreterShell.runBatch(ActorGraphInterpreter.scala:585) at akka.stream.impl.fusing.GraphInterpreterShell$AsyncInput.execute(ActorGraphInterpreter.scala:469) at akka.stream.impl.fusing.GraphInterpreterShell.processEvent(ActorGraphInterpreter.scala:560) at akka.stream.impl.fusing.ActorGraphInterpreter.akka$stream$impl$fusing$ActorGraphInterpreter$$processEvent(ActorGraphInterpreter.scala:742) at akka.stream.impl.fusing.ActorGraphInterpreter$$anonfun$receive$1.applyOrElse(ActorGraphInterpreter.scala:757) at akka.actor.Actor.aroundReceive(Actor.scala:517) at akka.actor.Actor.aroundReceive$(Actor.scala:515) at akka.stream.impl.fusing.ActorGraphInterpreter.aroundReceive(ActorGraphInterpreter.scala:667) at akka.actor.ActorCell.receiveMessage(ActorCell.scala:590) at akka.actor.ActorCell.invoke(ActorCell.scala:559) at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:257) at akka.dispatch.Mailbox.run(Mailbox.scala:224) at akka.dispatch.Mailbox.exec(Mailbox.scala:234) at akka.dispatch.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) at akka.dispatch.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339) at akka.dispatch.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) at akka.dispatch.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)

theodiefenthal commented 5 years ago

I also receive this 500 error, but when just trying to get an non existant object (Expect NoSuchKeyException). Interesting though: If I debug in the code step by step through it, everything works fine and as expected. I tried this out with Java 11 and also with Java 8.

moutyque commented 2 years ago

I faced the same issue when I use S3Mock in 2 different test suites. The solution I found is to use two different buckets.

priyeshkaratha commented 10 months ago

I am not facing this issue when I am using S3AsyncClient (software.amazon.awssdk.services.s3.S3AsyncClient)