-
-
Notifications
You must be signed in to change notification settings - Fork 1.6k
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
Server Protocol Upgrades #1323
Comments
This is a great idea, but what about handling CONNECT method at the server side (like in a HTTP proxy server)? I think the upgrade function should only provide the underlying I/O object, and it is the user's responsibility to return a proper HTTP response. |
@lqf96 I would definitely like to also offer a way of handling However, it's not quite the same, as HTTP/2 defines As for handling the response yourself, the thing is that you need to return a |
Yes, that is indeed a problem. Maybe for HTTP/2 we need two kinds of upgrade, one for the TCP connection and another one for the H2 stream containing the HTTP request. The former one can be used to upgrade from HTTP/2 to something else, and the latter one can be used for CONNECT or (possibly) running WebSocket over H2 stream. |
HTTP/2 does not define a way to upgrade to another protocol. You cannot upgrade from HTTP/2 to websockets. |
Just want to note that the websocket crate already supported upgrading with old sync Hyper. It could do it because the old |
@seanmonstar it all sounds reasonable. I'm not sure I get the part about returning Chunk of buffered bytes at the end though. I'd expect any buffered bytes be "put back" and made available through reading from returned IO object. I.e. return implementation that first depletes buffered bytes, then proxies calls to actual underlying IO object. |
Add support for servers to receive requests that wish to upgrade to a different protocol, such as websockets. A proposed API follows:
Proposal
Response
pub fn upgrade(proto: header::Upgrade) -> (Response, server::Upgrade)
This sets the
StatusCode::SwitchingProtocols
, and theUpgrade
header provided. It returns theResponse
, in case other headers need to be added, and aserver::Upgrade
type, explained next.server::Upgrade
impl Future for server::Upgrade
Future
that resolves to the underlying IO object that is being upgraded.Usage
A theoretical websocket server would also exist, and a channel, the
ws_queue
, would be used to give the socket to the websocket server.Implementation
The
server::Upgrade
could wrap afutures::sync::oneshot::Receiver
. The purpose for wrapping one is to hide the implementation details.When upgrading protocols, the response is only supposed to send headers. A blank newline after a header block with a
101
response code is supposed to be for the already upgraded protocol. That means sending a body with an upgrade response is an error.If it is possible with some
Into
impls to allowResponse::upgrade
to return aResponse<()>
, that would probably be ideal. I imagine it might not be doable, in which case, it will need to be enforced at runtime. This will still work, as theserver::Upgrade
can be sent ahyper::Error
noting that a body was illegal.It would be nice if the type could be
server::Upgrade<T>
, whereT
is the specific IO type being used internally. However, that might not be possible either, as theService
may not have a way to know what type is being used (it might be possible for a user to have encoded the type in theirnew_service
, and thusService
, and be able to statically guarantee the type, though!). If not, then the return type will need to be aBox<AsyncRead + AsyncWrite>
.Any buffered bytes internally associated with the socket should be returned as well, as a
Chunk
.The text was updated successfully, but these errors were encountered: