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

feat(service): introduce hyper-specific Service #1490

Merged
merged 1 commit into from
Apr 18, 2018
Merged

Conversation

seanmonstar
Copy link
Member

This introduces the hyper::service module, which replaces
tokio-service.

Since the trait is specific to hyper, its associated
types have been adjusted. It didn't make sense to need to define
Service<Request=http::Request>, since we already know the context is
HTTP. Instead, the request and response bodies are associated types now,
and slightly stricter bounds have been placed on Error.

The helpers service_fn and service_fn_ok should be sufficient for
now to ease creating Services.

The NewService trait now allows service creation to also be
asynchronous.

These traits are similar to tower in nature, and possibly will be
replaced completely by it in the future. For now, hyper defining its own
allows the traits to have better context, and prevents breaking changes
in tower from affecting hyper.

Closes #1461

BREAKING CHANGE: The Service trait has changed: it has some changed
associated types, and call is now bound to &mut self.

The NewService trait has changed: it has some changed associated
types, and new_service now returns a Future.

Client no longer implements Service for now.

hyper::server::conn::Serve now returns Connecting instead of
Connections, since new_service can now return a Future. The
Connecting is a future wrapping the new service future, returning
a Connection afterwards. In many cases, Future::flatten can be
used.

This introduces the `hyper::service` module, which replaces
`tokio-service`.

Since the trait is specific to hyper, its associated
types have been adjusted. It didn't make sense to need to define
`Service<Request=http::Request>`, since we already know the context is
HTTP. Instead, the request and response bodies are associated types now,
and slightly stricter bounds have been placed on `Error`.

The helpers `service_fn` and `service_fn_ok` should be sufficient for
now to ease creating `Service`s.

The `NewService` trait now allows service creation to also be
asynchronous.

These traits are similar to `tower` in nature, and possibly will be
replaced completely by it in the future. For now, hyper defining its own
allows the traits to have better context, and prevents breaking changes
in `tower` from affecting hyper.

Closes #1461

BREAKING CHANGE: The `Service` trait has changed: it has some changed
  associated types, and `call` is now bound to `&mut self`.

  The `NewService` trait has changed: it has some changed associated
  types, and `new_service` now returns a `Future`.

  `Client` no longer implements `Service` for now.

  `hyper::server::conn::Serve` now returns `Connecting` instead of
  `Connection`s, since `new_service` can now return a `Future`. The
  `Connecting` is a future wrapping the new service future, returning
  a `Connection` afterwards. In many cases, `Future::flatten` can be
  used.
/// An asynchronous function from `Request` to `Response`.
pub trait Service {
/// The `Payload` body of the `http::Request`.
type ReqBody: Payload;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Doesn't Hyper control what type the request body is?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

True. I'd like to bring the implementation back for Client, which will need to define the ReqBody. I'm just unsure about how best to move forward to tower::Service, which has a poll_ready function (and may be changing soon)...

@seanmonstar seanmonstar merged commit d04ca7b into master Apr 18, 2018
@seanmonstar seanmonstar deleted the service2 branch April 18, 2018 21:11
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.

2 participants