Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add propagate_extensions middleware #424

Closed
wants to merge 8 commits into from
Closed

Add propagate_extensions middleware #424

wants to merge 8 commits into from

Conversation

bassmanitram
Copy link

@bassmanitram bassmanitram commented Oct 17, 2023

(See issue 423)

This middleware is intended to be used as a way of sharing state between "pre service" layers/filters etc and those that run "post service", particularly when the service itself is unaware of that state.

This is in fact, almost a verbatim copy of propagate_header, replacing the Header semantics with those required by http::Extensions.

For ease of implementation it removes the state from the request before the inner service is invoked, and inserts the state into the response when the response is ready.

It does not concern itself with the initial insert of the state into the request since that is covered by an existing middleware, and may also be achieved by other means in one of the "pre service" components.

Because Extensions are managed by type, both the layer and the underlying service have to be generic over the type of the user's state object - and that type has to be cloneable as well as Send and Sync. In order to keep the compiler happy, both the service and the layer have a phantom data field. I am not 100% sure that this is necessary, but it does seem to be one of the few safe code instances where it probably is.

Motivation

Solution

This middleware is intended to be used as a way of sharing state
between "pre service" layers/filters etc and those that run
"post service", particularly when the service itself is unaware
of that state.

This is in fact, almost a verbatim copy of propagate_header, replacing
the Header semantics with those required by http::Extensions.

For ease of implementation it _removes_ the state from the request
before the inner service is invoked, and inserts the state into
the response when the response is ready.

It does not concern itself with the initial insert of the state into
the request since that is covered by an existing middleware, and may
also be achieved by other means in one of the "pre service" components.

Because Extensions are managed by _type_, both the layer and the
underlying service have to be generic over the type of the user's
state object - and that type has to be cloneable as well as Send and
Sync. In order to keep the compiler happy, both the service and the
layer have a phantom data field. I am not 100% sure that this is
necessary, but it does seem to be one of the few safe code instances
where it probably is.
@bassmanitram bassmanitram marked this pull request as ready for review October 20, 2023 16:22
@bassmanitram
Copy link
Author

bassmanitram commented Oct 23, 2023

Bad branching practices makes two independent middlewares that I am working one interdependent.

Recreated as PR #425

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant