maciejtreder / serverless-apigw-binary

Serverless plugin for binary files support in AWS Gateway
MIT License
160 stars 33 forks source link

How to prevent application/json being transformed into base64 #47

Open benoj opened 5 years ago

benoj commented 5 years ago

I have a serverless app which uploads files to s3 (via POST request) and serves them (via GET request)

In order to upload an image the POST endpoint takes a body like { "base64": "..." }. However with this configuration the entire body is coming through as a base64 encoded string. How can I prevent the request body with application/json being transformed?

See serverless.yml below:

service: image-service

custom:
  envName: ${opt:stage, self:provider.stage}
  domains:
    prod: api.<mydomain>
    dev: dev-api.<mydomain>
  customDomain:
    basePath: images
    domainName: ${self:custom.domains.${self:custom.envName}}
    certificateName: "*.<mydomain>"
  apigwBinary:
    types:
      - '*/*'

provider:
  name: aws
  runtime: nodejs8.10
  region: eu-west-1
  memorySize: 1536

  role: ImageRenderingRole

  environment:
    ENV_NAME: ${self:custom.envName}
    APP_NAME: image-service
    BUCKET: <mybucket>

plugins:
  - serverless-offline
  - serverless-domain-manager
  - serverless-apigw-binary
  - serverless-apigwy-binary

functions:
 uploadImage:
   handler: handler.uploadImage
   events:
     - http:
      path: /
      method: POST

  getImage:
    handler: handler.getImage
    events:
      - http:
          path: 'images/{idAndFormat}'
          method: get
          contentHandling: CONVERT_TO_BINARY
          parameters:
              paths:
                idAndFormat: true

This is a clone of (https://stackoverflow.com/questions/52479994/serverless-api-gateway-transforming-request-into-base64) but no response as of yet...

brian-fivetalent commented 5 years ago

I also have this same question. After adding this plugin all of my incoming responses are being transformed to base64 even if I set the content type to application/json. I only want to use base64 for one endpoint and I don't think the right answer is to just decode everything.

brian-fivetalent commented 5 years ago

That was just a lack of understanding on my part. this will convert any Content-Type that matches whats provided here to binary. If you don't want application/json converted to binary, don't list it there.

  apigwBinary:
    types:
      - '*/*'
PavelYaroshchyk commented 4 years ago

@brian-fivetalent did setting a specific type work for you in the end? I'm having the same problem even if i use: ` apigwBinary: types:

fsvaren commented 4 years ago

Same here, no matter what I list everything gets the CONVERT_TO_BINARY. Kind of annoying since I don't want my error messages to be mp3s :-)

joneldiablo commented 3 years ago

fcking serverlesss of st I can't download f*cking file!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

pomSense commented 3 years ago

Same issue, and doing below does NOT resolve:

  apigwBinary:
    types:
      - 'image/png' # or any other format
pomSense commented 3 years ago

After some fiddling around, I was able to resolve this issue. Here are my findings:

Here is how my serverless.yml is setup with the plugin:

...

plugins:
  - serverless-webpack
  - serverless-deployment-bucket
  - serverless-apigateway-service-proxy
  - serverless-apigw-binary
  - serverless-offline

custom:
  apigwBinary:
    types: 
    # Only add Content-Types here that you want to convert as Binary. 
    # Note, this will happen for ALL end-points. 
    # Don't add */* or else it will convert all paths and functons' requests to binary.
      - 'multipart/form-data'

functions:
  myFunction:
    handler: src/infra/http/index.myFunction
    events:
      - http:
          path: myPath
          method: post
          cors: true
          request:
            parameters:
              paths:
                myPathParam: true

I am only using serverless-apigw-binary and not serverless-apigwy-binary

Hope this helps!