ApiGateway HTTP Response Content-Type Mapping

Essentially, I have an endpoint that needs to return text/html content when the Accept header is set to text/html and application/json in a similar fashion.

What I have works… for the most part, except I cannot figure out how to change the Content-Type header to correspond to the Accept header in the request.

Here is a simplified example of what the .yml looks like:

functions:
  foo:
    handler: src/handler.fooHandler
    events:
      - http:
          path: foo
          method: get
          integration: lambda
          response: 
            headers:
              Content-Type: "'text/html'"
            statusCodes:
             200:
               pattern: ''
               template: 
                 application/json: '$input.json("$")'
                 text/html: ${file(velocity_templates/responseHTMLTemplate.vm)}

A little bit of context: moving some very ancient cgi-bin Python to APIGateway via SLS (even less important, we’ve rewritten it in TypeScript, et cetera). We intend for it to operate as a drop in before we migrate the user interface to a proper SPA. As such, the drop in needs to generate HTML hydrated with JSON that’s output from the handler. But to enable migration, we would like the same endpoint to just return the JSON for future use…

This does work. By enumerating the templates separately (under template) and using the correct function for the application/json, we do indeed get json back when the header Accept: application/json is present.

But the Content-Type in the response never changes. This is fine, for now, but ideally the Content-Type would match the payload.

I’ve poured over the docs and cannot figure out how to get this working. If I remove the Content-Type it no longer renders the HTML in the browser.

Is there some way of achieving this or do I have to tell the API consumers to ignore the Content-Type on the response and chock it up to a “quirk” of ApiGateway?