Skip to content

Lamba Proxy does not populate response headers correctly #1330

@sdelamo

Description

@sdelamo

In an Application with the netty runtime the following test passes:

package com.example

import io.micronaut.context.annotation.Property
import io.micronaut.context.annotation.Requires
import io.micronaut.http.HttpRequest
import io.micronaut.http.HttpResponse
import io.micronaut.http.HttpStatus
import io.micronaut.http.MediaType
import io.micronaut.http.annotation.Controller
import io.micronaut.http.annotation.Get
import io.micronaut.http.annotation.Status
import io.micronaut.http.client.HttpClient
import io.micronaut.http.client.annotation.Client
import io.micronaut.test.extensions.spock.annotation.MicronautTest
import jakarta.inject.Inject
import spock.lang.Specification

@Property(name = 'spec.name', value = 'ContentTypeSpec')
@MicronautTest
class ContentTypeSpec extends Specification {

    @Inject
    @Client("/")
    HttpClient httpClient

    void "verify controllers return json by default"() {
        given:
        HttpRequest<?> request = HttpRequest._GET_('/json/bydefault').accept(MediaType.APPLICATION_JSON)

        when:
        HttpResponse<String> response = httpClient.toBlocking().exchange(request, String)

        then:
        HttpStatus._OK_ == response.status()
        response.body.get() == '{"msg":"Hello world"}'
        response.headers
        "application/json" == response.headers.get("Content-Type")
    }

    @Controller('/json')
    @Requires(property = 'spec.name', value = 'ContentTypeSpec')
    static class BodyController {

        @Get("/bydefault")
        @Status(HttpStatus.OK)
        Map<String, Object> index() {
            [msg: "Hello world"]
        }
    }
}

However, an Application with lambda runtime the following tests fails:

package com.example

import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder
import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext
import com.amazonaws.serverless.proxy.model.AwsProxyRequest
import com.amazonaws.serverless.proxy.model.AwsProxyResponse
import com.amazonaws.services.lambda.runtime.Context
import io.micronaut.function.aws.proxy.MicronautLambdaHandler
import io.micronaut.http.HttpHeaders
import io.micronaut.http.HttpMethod
import io.micronaut.http.HttpStatus
import io.micronaut.http.MediaType
import io.micronaut.http.annotation.Controller
import io.micronaut.http.annotation.Get
import io.micronaut.http.annotation.Status
import spock.lang.AutoCleanup
import spock.lang.Shared
import spock.lang.Specification

class ContentTypeWithoutMicronautTestSpec extends Specification {
    @Shared
    @AutoCleanup
    MicronautLambdaHandler handler = new MicronautLambdaHandler()

    @Shared
    Context lambdaContext = new MockLambdaContext()

    void "verify controllers return json by default"() {
        given:
        AwsProxyRequest request = new AwsProxyRequestBuilder("/json/isthedefault", HttpMethod.GET.toString())
                .header(HttpHeaders.ACCEPT,  MediaType.APPLICATION_JSON)
                .build()

        when:
        AwsProxyResponse response = handler.handleRequest(request, lambdaContext)

        then:
        HttpStatus._OK_.code == response.statusCode
        response.body == '{"msg":"Hello world"}'
        response.headers
        "application/json" == response.headers.get("Content-Type")
    }

    @Controller('/json')
    static class JsonIsTheDefaultController {

        @Get("/isthedefault")
        @Status(HttpStatus._OK_)
        Map<String, Object> index() {
            [msg: "Hello world"]
        }
    }
}

With headers being null in the response.

Metadata

Metadata

Assignees

No one assigned

    Labels

    type: bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions