Oscar Godson
Oscar Godson

Reputation: 32766

CORS blocking requests in Kotlin lambda but not in identically setup Node lambda

I have a lambda, written in Kotlin with Serverless and CORS just is not working. I feel like I've tried everything. I deployed a Node Lambda with identical sls.sh command and yaml files. The function looks like this

hello:
  handler: handler.hello
  events:
    - http:
        path: hello
        method: post
        cors: true

My responses look like this in both Node and Kotlin:

{
  "statusCode": 200,
  "headers": {
    "Access-Control-Allow-Origin": "*"
  },
  "body": "{\"id\": \"f9f76590-xxxx-xxxx-xxxx-9c8e99238f40\"}"
}

In the Node case this all works great. I make a fetch call like this and it works (omitted the Promise resolutions for brevity):

  var makeRequest = function (data) {
    fetch('https://{lambda URL}/hello', {
      'headers': {
        'content-type': 'application/json'
      },
      'body': JSON.stringify({ data }),
      'method': 'POST'
      })
  }

In the Kotlin case I get this CORS error back

Access to fetch at 'https://{lambda URL}/hello' from origin 'http://127.0.0.1:8080' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.

I try to "enable CORS" in the API Gateway panel but I get that it's already enabled:

enter image description here

And hit submit I get the error (invalid response status code)

enter image description here

When I hover over the error icon it says "Invalid Response status code specified".

Under Gateway Responses, under every sub item (Default 4XX, Default 5XXX, etc) there are response headers set. This is the same across my Node and Kotlin lambdas.

I'm completely out of ideas at this point.

The only potentially odd thing is I am noticing that in my Node request I see access-control-allow-origin: * in response headers in the browser network panel but in the Kotlin one I don't see it.

Upvotes: 2

Views: 378

Answers (2)

Oscar Godson
Oscar Godson

Reputation: 32766

I discovered my CORS issue was because of server errors. If your server has an error and the API Gateway can't get a response then you get a CORS error because the Gateway itself doesn't have the CORS headers.

While the fix is easy (just handle that server error) it was hard to uncover. I wish this was documented better somewhere so hopefully this is found for others :)

For my case specifically, and why it didn't show up in Node but showed up in Kotlin, was because of types. the browser was sending a type Node automatically corrected the type (number to string) but Kotlin was expecting the type and threw a type error.

Upvotes: 0

Assael Azran
Assael Azran

Reputation: 2993

From this:

enter image description here

I can see that you haven't created Integration Response in your post method.

Try these configurations:

enter image description here

Upvotes: 1

Related Questions