Skip to content

Commit 13c3a88

Browse files
authored
[ws client]: host_header should include host:port (#348)
https://datatracker.ietf.org/doc/html/rfc2616#section-14.23
1 parent 99cb814 commit 13c3a88

File tree

1 file changed

+14
-10
lines changed

1 file changed

+14
-10
lines changed

ws-client/src/transport.rs

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -209,8 +209,7 @@ impl<'a> WsTransportClientBuilder<'a> {
209209
match tls_connector {
210210
None => TlsOrPlain::Plain(socket),
211211
Some(connector) => {
212-
let dns_name: &str =
213-
webpki::DnsNameRef::try_from_ascii_str(self.target.host.as_str())?.into();
212+
let dns_name: &str = webpki::DnsNameRef::try_from_ascii_str(&self.target.host)?.into();
214213
let tls_stream = connector.connect(dns_name, socket).await?;
215214
TlsOrPlain::Tls(tls_stream)
216215
}
@@ -221,7 +220,7 @@ impl<'a> WsTransportClientBuilder<'a> {
221220
};
222221

223222
let mut client =
224-
WsRawClient::new(BufReader::new(BufWriter::new(tcp_stream)), &self.target.host, &self.target.path);
223+
WsRawClient::new(BufReader::new(BufWriter::new(tcp_stream)), &self.target.host_header, &self.target.path);
225224
if let Some(origin) = self.origin_header.as_ref() {
226225
client.set_origin(origin);
227226
}
@@ -274,6 +273,8 @@ pub struct Target {
274273
sockaddrs: Vec<SocketAddr>,
275274
/// The host name (domain or IP address).
276275
host: String,
276+
/// The Host request header specifies the host and port number of the server to which the request is being sent.
277+
host_header: String,
277278
/// WebSocket stream mode, see [`Mode`] for further documentation.
278279
mode: Mode,
279280
/// The HTTP host resource path.
@@ -292,32 +293,35 @@ impl Target {
292293
};
293294
let host =
294295
url.host_str().map(ToOwned::to_owned).ok_or_else(|| WsHandshakeError::Url("No host in URL".into()))?;
296+
let port = url.port_or_known_default().ok_or_else(|| WsHandshakeError::Url("No port number in URL".into()))?;
297+
let host_header = format!("{}:{}", host, port);
295298
// NOTE: `Url::socket_addrs` is using the default port if it's missing (ws:// - 80, wss:// - 443)
296299
let sockaddrs = url.socket_addrs(|| None).map_err(WsHandshakeError::ResolutionFailed)?;
297-
Ok(Self { sockaddrs, host, mode, path: url.path().to_owned() })
300+
Ok(Self { sockaddrs, host, host_header, mode, path: url.path().to_owned() })
298301
}
299302
}
300303

301304
#[cfg(test)]
302305
mod tests {
303306
use super::{Mode, Target, WsHandshakeError};
304307

305-
fn assert_ws_target(target: Target, host: &str, mode: Mode, path: &str) {
308+
fn assert_ws_target(target: Target, host: &str, host_header: &str, mode: Mode, path: &str) {
306309
assert_eq!(&target.host, host);
310+
assert_eq!(&target.host_header, host_header);
307311
assert_eq!(target.mode, mode);
308312
assert_eq!(&target.path, path);
309313
}
310314

311315
#[test]
312316
fn ws_works() {
313317
let target = Target::parse("ws://127.0.0.1:9933").unwrap();
314-
assert_ws_target(target, "127.0.0.1", Mode::Plain, "/");
318+
assert_ws_target(target, "127.0.0.1", "127.0.0.1:9933", Mode::Plain, "/");
315319
}
316320

317321
#[test]
318322
fn wss_works() {
319323
let target = Target::parse("wss://kusama-rpc.polkadot.io:443").unwrap();
320-
assert_ws_target(target, "kusama-rpc.polkadot.io", Mode::Tls, "/");
324+
assert_ws_target(target, "kusama-rpc.polkadot.io", "kusama-rpc.polkadot.io:443", Mode::Tls, "/");
321325
}
322326

323327
#[test]
@@ -337,12 +341,12 @@ mod tests {
337341
#[test]
338342
fn default_port_works() {
339343
let target = Target::parse("ws://127.0.0.1").unwrap();
340-
assert_ws_target(target, "127.0.0.1", Mode::Plain, "/");
344+
assert_ws_target(target, "127.0.0.1", "127.0.0.1:80", Mode::Plain, "/");
341345
}
342346

343347
#[test]
344348
fn url_with_path_works() {
345-
let target = Target::parse("ws://127.0.0.1/my-special-path").unwrap();
346-
assert_ws_target(target, "127.0.0.1", Mode::Plain, "/my-special-path");
349+
let target = Target::parse("wss://127.0.0.1/my-special-path").unwrap();
350+
assert_ws_target(target, "127.0.0.1", "127.0.0.1:443", Mode::Tls, "/my-special-path");
347351
}
348352
}

0 commit comments

Comments
 (0)