Upgrade to url v2.0 (#583)
This commit is contained in:
		
				
					committed by
					
						 Sean McArthur
						Sean McArthur
					
				
			
			
				
	
			
			
			
						parent
						
							cf8944a0f0
						
					
				
				
					commit
					f60456c8e3
				
			| @@ -27,15 +27,16 @@ flate2 = { version = "^1.0.7", default-features = false, features = ["rust_backe | |||||||
| log = "0.4" | log = "0.4" | ||||||
| mime = "0.3.7" | mime = "0.3.7" | ||||||
| mime_guess = "2.0" | mime_guess = "2.0" | ||||||
|  | percent-encoding = "2.1" | ||||||
| serde = "1.0" | serde = "1.0" | ||||||
| serde_json = "1.0" | serde_json = "1.0" | ||||||
| serde_urlencoded = "0.5" | serde_urlencoded = "0.6.1" | ||||||
| tokio = { version = "0.1.7", default-features = false, features = ["rt-full", "tcp"] } | tokio = { version = "0.1.7", default-features = false, features = ["rt-full", "tcp"] } | ||||||
| tokio-executor = "0.1.4" # a minimum version so trust-dns-resolver compiles | tokio-executor = "0.1.4" # a minimum version so trust-dns-resolver compiles | ||||||
| tokio-io = "0.1" | tokio-io = "0.1" | ||||||
| tokio-threadpool = "0.1.8" # a minimum version so tokio compiles | tokio-threadpool = "0.1.8" # a minimum version so tokio compiles | ||||||
| tokio-timer = "0.2.6" # a minimum version so trust-dns-resolver compiles | tokio-timer = "0.2.6" # a minimum version so trust-dns-resolver compiles | ||||||
| url = "1.2" | url = "2.1" | ||||||
| uuid = { version = "0.7", features = ["v4"] } | uuid = { version = "0.7", features = ["v4"] } | ||||||
|  |  | ||||||
| # Optional deps... | # Optional deps... | ||||||
| @@ -49,7 +50,7 @@ socks = { version = "0.3.2", optional = true } | |||||||
| tokio-rustls = { version = "0.10", optional = true } | tokio-rustls = { version = "0.10", optional = true } | ||||||
| trust-dns-resolver = { version = "0.11", optional = true } | trust-dns-resolver = { version = "0.11", optional = true } | ||||||
| webpki-roots = { version = "0.17", optional = true } | webpki-roots = { version = "0.17", optional = true } | ||||||
| cookie_store = "0.7.0" | cookie_store = "0.9.0" | ||||||
| cookie = "0.12.0" | cookie = "0.12.0" | ||||||
| time = "0.1.42" | time = "0.1.42" | ||||||
|  |  | ||||||
|   | |||||||
| @@ -4,7 +4,7 @@ use std::fmt; | |||||||
|  |  | ||||||
| use http::HeaderMap; | use http::HeaderMap; | ||||||
| use mime_guess::Mime; | use mime_guess::Mime; | ||||||
| use url::percent_encoding::{self, EncodeSet, PATH_SEGMENT_ENCODE_SET}; | use percent_encoding::{self, AsciiSet, NON_ALPHANUMERIC}; | ||||||
| use uuid::Uuid; | use uuid::Uuid; | ||||||
|  |  | ||||||
| use futures::Stream; | use futures::Stream; | ||||||
| @@ -386,33 +386,33 @@ impl PartMetadata { | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| #[derive(Debug, Clone)] | /// https://url.spec.whatwg.org/#fragment-percent-encode-set | ||||||
| pub(crate) struct AttrCharEncodeSet; | const FRAGMENT_ENCODE_SET: &AsciiSet = &percent_encoding::CONTROLS | ||||||
|  |     .add(b' ') | ||||||
|  |     .add(b'"') | ||||||
|  |     .add(b'<') | ||||||
|  |     .add(b'>') | ||||||
|  |     .add(b'`'); | ||||||
|  |  | ||||||
| impl EncodeSet for AttrCharEncodeSet { | /// https://url.spec.whatwg.org/#path-percent-encode-set | ||||||
|     fn contains(&self, ch: u8) -> bool { | const PATH_ENCODE_SET: &AsciiSet = &FRAGMENT_ENCODE_SET.add(b'#').add(b'?').add(b'{').add(b'}'); | ||||||
|         match ch as char { |  | ||||||
|             '!' => false, | const PATH_SEGMENT_ENCODE_SET: &AsciiSet = &PATH_ENCODE_SET.add(b'/').add(b'%'); | ||||||
|             '#' => false, |  | ||||||
|             '$' => false, | /// https://tools.ietf.org/html/rfc8187#section-3.2.1 | ||||||
|             '&' => false, | const ATTR_CHAR_ENCODE_SET: &AsciiSet = &NON_ALPHANUMERIC | ||||||
|             '+' => false, |     .remove(b'!') | ||||||
|             '-' => false, |     .remove(b'#') | ||||||
|             '.' => false, |     .remove(b'$') | ||||||
|             '^' => false, |     .remove(b'&') | ||||||
|             '_' => false, |     .remove(b'+') | ||||||
|             '`' => false, |     .remove(b'-') | ||||||
|             '|' => false, |     .remove(b'.') | ||||||
|             '~' => false, |     .remove(b'^') | ||||||
|             _ => { |     .remove(b'_') | ||||||
|                 let is_alpha_numeric = ch >= 0x41 && ch <= 0x5a |     .remove(b'`') | ||||||
|                     || ch >= 0x61 && ch <= 0x7a |     .remove(b'|') | ||||||
|                     || ch >= 0x30 && ch <= 0x39; |     .remove(b'~'); | ||||||
|                 !is_alpha_numeric |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| pub(crate) enum PercentEncoding { | pub(crate) enum PercentEncoding { | ||||||
|     PathSegment, |     PathSegment, | ||||||
| @@ -463,7 +463,7 @@ impl PercentEncoding { | |||||||
|                 percent_encoding::utf8_percent_encode(value, PATH_SEGMENT_ENCODE_SET).to_string() |                 percent_encoding::utf8_percent_encode(value, PATH_SEGMENT_ENCODE_SET).to_string() | ||||||
|             } |             } | ||||||
|             PercentEncoding::AttrChar => { |             PercentEncoding::AttrChar => { | ||||||
|                 percent_encoding::utf8_percent_encode(value, AttrCharEncodeSet).to_string() |                 percent_encoding::utf8_percent_encode(value, ATTR_CHAR_ENCODE_SET).to_string() | ||||||
|             } |             } | ||||||
|             PercentEncoding::NoOp => value.to_string(), |             PercentEncoding::NoOp => value.to_string(), | ||||||
|         }; |         }; | ||||||
|   | |||||||
| @@ -4,7 +4,7 @@ use std::io::{self, Cursor, Read}; | |||||||
|  |  | ||||||
| use bytes::Bytes; | use bytes::Bytes; | ||||||
| use futures::{try_ready, Future}; | use futures::{try_ready, Future}; | ||||||
| use hyper::{self}; | use hyper; | ||||||
|  |  | ||||||
| use crate::async_impl; | use crate::async_impl; | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										16
									
								
								src/proxy.rs
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								src/proxy.rs
									
									
									
									
									
								
							| @@ -1,16 +1,16 @@ | |||||||
| use std::fmt; | use std::fmt; | ||||||
| #[cfg(feature = "socks")] | #[cfg(feature = "socks")] | ||||||
| use std::net::{SocketAddr, ToSocketAddrs}; | use std::net::SocketAddr; | ||||||
| use std::sync::Arc; | use std::sync::Arc; | ||||||
|  |  | ||||||
| use crate::{IntoUrl, Url}; | use crate::{IntoUrl, Url}; | ||||||
| use http::{header::HeaderValue, Uri}; | use http::{header::HeaderValue, Uri}; | ||||||
| use hyper::client::connect::Destination; | use hyper::client::connect::Destination; | ||||||
|  | use percent_encoding::percent_decode; | ||||||
| use std::collections::HashMap; | use std::collections::HashMap; | ||||||
| use std::env; | use std::env; | ||||||
| #[cfg(target_os = "windows")] | #[cfg(target_os = "windows")] | ||||||
| use std::error::Error; | use std::error::Error; | ||||||
| use url::percent_encoding::percent_decode; |  | ||||||
| #[cfg(target_os = "windows")] | #[cfg(target_os = "windows")] | ||||||
| use winreg::enums::HKEY_CURRENT_USER; | use winreg::enums::HKEY_CURRENT_USER; | ||||||
| #[cfg(target_os = "windows")] | #[cfg(target_os = "windows")] | ||||||
| @@ -326,12 +326,14 @@ impl ProxyScheme { | |||||||
|         // Resolve URL to a host and port |         // Resolve URL to a host and port | ||||||
|         #[cfg(feature = "socks")] |         #[cfg(feature = "socks")] | ||||||
|         let to_addr = || { |         let to_addr = || { | ||||||
|             let host_and_port = try_!(url.with_default_port(|url| match url.scheme() { |             let addrs = try_!(url.socket_addrs(|| match url.scheme() { | ||||||
|                 "socks5" | "socks5h" => Ok(1080), |                 "socks5" | "socks5h" => Some(1080), | ||||||
|                 _ => Err(()), |                 _ => None, | ||||||
|             })); |             })); | ||||||
|             let mut addr = try_!(host_and_port.to_socket_addrs()); |             addrs | ||||||
|             addr.next().ok_or_else(crate::error::unknown_proxy_scheme) |                 .into_iter() | ||||||
|  |                 .next() | ||||||
|  |                 .ok_or_else(crate::error::unknown_proxy_scheme) | ||||||
|         }; |         }; | ||||||
|  |  | ||||||
|         let mut scheme = match url.scheme() { |         let mut scheme = match url.scheme() { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user