Skip to content

Holism RTL: "contentType" in binding for a service filter is required yet ignored.  #22

@phil-kahrl

Description

@phil-kahrl

Build info:

"appgen": "@encapsule/holistic v0.0.47 alexandrite Jvp9FcdjQNuiXkE2zcUjJA 4854c0117a5fa5e257006b334d52368e1997cfc0 2020-11-01T16:38:28.000Z",

Suppose I have a service filter that serves content of type "application/json" as shown below:

let factoryResponse = httpServiceFilterFactory.create({
    id: "TxTaBMnjRAGUkRuf7rwUlg",
    name: "Demo JSON service filter",
    description: "A sample of a service filter that returns JSON as content.",
    constraints: {
         request: {
            content: { encoding: "utf8", type: "text/plain" },
            query_spec: { ____opaque: true },
            request_spec: { ____opaque: true },
            options_spec: { ____opaque: true }
        },
        response: {
            content: { encoding: "utf8", type: "application/json" },
            error_context_spec: { ____opaque: true },
            result_spec: { ____opaque: true }
        }
    },
    handlers: {
        request_handler: (request_) => {
            request_.response_filters.result.request({
                streams: request_.streams,
                integrations: request_.integrations,
                request_descriptor: request_.request_descriptor,
                response_descriptor: {
                    http: { code: 200 },
                    content: { encoding: "utf8", type: "application/json" },
                    data: {foo: "bar"}
                }
            });
            return {result: undefined};
        }
    }
});

if (factoryResponse.error) throw new Error(factoryResponse.error);
const demoJSONServiceFilter = factoryResponse.result;

The value of what will be the "content-type" header in the response is clearly "application/json"

When binding that service filter to a route in the config.services object used when constructing the holism server, I am also required to specify the "contentType"

{
    authentication: { required: false },
    filter: demoAsyncServiceFilter,
    request_bindings: { method: "GET", uris: [ "/demoasync" ] },
    response_properties: { contentEncoding: "utf8", contentType: "application/json" },
}

So I have now specified the "content-type" in 2 places, so which value is actually used?

If I change the "contentType" in the binding to something else e.g. "text/html" then the value I actually see when making the request remains "application/json", so clearly the value in the binding is not being used. If I remove, the contentType from "response_properties" then an exception from a filter error for the missing contentType member is thrown and server start fails.

The conclusion is that the "contentType" in the binding is not actually used for the "content-type" header in the response, yet I am still required to provide it.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions