http proxy: add necessary brackets for IPv6 proxy
This commit is contained in:
parent
8d6fb677c1
commit
e0ba5553be
|
@ -5,9 +5,9 @@ use std::collections::HashMap;
|
||||||
use std::pin::Pin;
|
use std::pin::Pin;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use hyper::{Uri, Body};
|
use hyper::Body;
|
||||||
use hyper::client::{Client, HttpConnector};
|
use hyper::client::{Client, HttpConnector};
|
||||||
use http::{Request, Response, HeaderValue};
|
use http::{Uri, uri::Authority, Request, Response, HeaderValue};
|
||||||
use openssl::ssl::{SslConnector, SslMethod};
|
use openssl::ssl::{SslConnector, SslMethod};
|
||||||
use futures::*;
|
use futures::*;
|
||||||
use tokio::{
|
use tokio::{
|
||||||
|
@ -28,6 +28,18 @@ use crate::tools::{
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Build a http::uri::Authority ("host:port"), use '[..]' around IPv6 addresses
|
||||||
|
fn build_authority(host: &str, port: u16) -> Result<Authority, Error> {
|
||||||
|
let bytes = host.as_bytes();
|
||||||
|
let len = bytes.len();
|
||||||
|
let authority = if len > 3 && bytes.contains(&b':') && bytes[0] != b'[' && bytes[len-1] != b']' {
|
||||||
|
format!("[{}]:{}", host, port).parse()?
|
||||||
|
} else {
|
||||||
|
format!("{}:{}", host, port).parse()?
|
||||||
|
};
|
||||||
|
Ok(authority)
|
||||||
|
}
|
||||||
|
|
||||||
/// HTTP Proxy Configuration
|
/// HTTP Proxy Configuration
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct ProxyConfig {
|
pub struct ProxyConfig {
|
||||||
|
@ -329,10 +341,14 @@ impl hyper::service::Service<Uri> for HttpsConnector {
|
||||||
|
|
||||||
let use_connect = is_https || proxy.force_connect;
|
let use_connect = is_https || proxy.force_connect;
|
||||||
|
|
||||||
let proxy_url = format!("{}:{}", proxy.host, proxy.port);
|
let proxy_authority = match build_authority(&proxy.host, proxy.port) {
|
||||||
|
Ok(authority) => authority,
|
||||||
|
Err(err) => return futures::future::err(err).boxed(),
|
||||||
|
};
|
||||||
|
|
||||||
let proxy_uri = match Uri::builder()
|
let proxy_uri = match Uri::builder()
|
||||||
.scheme("http")
|
.scheme("http")
|
||||||
.authority(proxy_url.as_str())
|
.authority(proxy_authority.as_str())
|
||||||
.path_and_query("/")
|
.path_and_query("/")
|
||||||
.build()
|
.build()
|
||||||
{
|
{
|
||||||
|
@ -348,7 +364,7 @@ impl hyper::service::Service<Uri> for HttpsConnector {
|
||||||
let mut tcp_stream = connector
|
let mut tcp_stream = connector
|
||||||
.call(proxy_uri)
|
.call(proxy_uri)
|
||||||
.await
|
.await
|
||||||
.map_err(|err| format_err!("error connecting to {} - {}", proxy_url, err))?;
|
.map_err(|err| format_err!("error connecting to {} - {}", proxy_authority, err))?;
|
||||||
|
|
||||||
let _ = set_tcp_keepalive(tcp_stream.as_raw_fd(), PROXMOX_BACKUP_TCP_KEEPALIVE_TIME);
|
let _ = set_tcp_keepalive(tcp_stream.as_raw_fd(), PROXMOX_BACKUP_TCP_KEEPALIVE_TIME);
|
||||||
|
|
||||||
|
@ -374,7 +390,7 @@ impl hyper::service::Service<Uri> for HttpsConnector {
|
||||||
let tcp_stream = connector
|
let tcp_stream = connector
|
||||||
.call(proxy_uri)
|
.call(proxy_uri)
|
||||||
.await
|
.await
|
||||||
.map_err(|err| format_err!("error connecting to {} - {}", proxy_url, err))?;
|
.map_err(|err| format_err!("error connecting to {} - {}", proxy_authority, err))?;
|
||||||
|
|
||||||
let _ = set_tcp_keepalive(tcp_stream.as_raw_fd(), PROXMOX_BACKUP_TCP_KEEPALIVE_TIME);
|
let _ = set_tcp_keepalive(tcp_stream.as_raw_fd(), PROXMOX_BACKUP_TCP_KEEPALIVE_TIME);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue