private static HttpConnectionKey GetConnectionKey(HttpRequestMessage request, Uri proxyUri, bool isProxyConnect) { Uri uri = request.RequestUri; if (isProxyConnect) { Debug.Assert(uri == proxyUri); return(new HttpConnectionKey(HttpConnectionKind.ProxyConnect, uri.IdnHost, uri.Port, null, proxyUri)); } string sslHostName = null; if (HttpUtilities.IsSupportedSecureScheme(uri.Scheme)) { string hostHeader = request.Headers.Host; if (hostHeader != null) { sslHostName = ParseHostNameFromHeader(hostHeader); } else { // No explicit Host header. Use host from uri. sslHostName = uri.IdnHost; } } if (proxyUri != null) { Debug.Assert(HttpUtilities.IsSupportedNonSecureScheme(proxyUri.Scheme)); if (sslHostName == null) { if (HttpUtilities.IsNonSecureWebSocketScheme(uri.Scheme)) { // Non-secure websocket connection through proxy to the destination. return(new HttpConnectionKey(HttpConnectionKind.ProxyTunnel, uri.IdnHost, uri.Port, null, proxyUri)); } else { // Standard HTTP proxy usage for non-secure requests // The destination host and port are ignored here, since these connections // will be shared across any requests that use the proxy. return(new HttpConnectionKey(HttpConnectionKind.Proxy, null, 0, null, proxyUri)); } } else { // Tunnel SSL connection through proxy to the destination. return(new HttpConnectionKey(HttpConnectionKind.SslProxyTunnel, uri.IdnHost, uri.Port, sslHostName, proxyUri)); } } else if (sslHostName != null) { return(new HttpConnectionKey(HttpConnectionKind.Https, uri.IdnHost, uri.Port, sslHostName, null)); } else { return(new HttpConnectionKey(HttpConnectionKind.Http, uri.IdnHost, uri.Port, null, null)); } }
private static HttpConnectionKey GetConnectionKey(HttpRequestMessage request, Uri proxyUri, bool isProxyConnect) { Uri uri = request.RequestUri; // If the hostname is an IPv6 address, uri.IdnHost will return the address without enclosing []. // In this case, use uri.Host instead, which will correctly enclose with []. // Note we don't need punycode encoding if it's an IP address, so using uri.Host is fine. bool isIPv6Address = uri.HostNameType == UriHostNameType.IPv6; if (isProxyConnect) { Debug.Assert(uri == proxyUri); return(new HttpConnectionKey(HttpConnectionKind.ProxyConnect, isIPv6Address ? uri.Host : uri.IdnHost, uri.Port, null, proxyUri)); } string sslHostName = null; if (HttpUtilities.IsSupportedSecureScheme(uri.Scheme)) { string hostHeader = request.Headers.Host; if (hostHeader != null) { sslHostName = ParseHostNameFromHeader(hostHeader); } else { // No explicit Host header. Use host from uri. sslHostName = uri.IdnHost; } } if (proxyUri != null) { Debug.Assert(HttpUtilities.IsSupportedNonSecureScheme(proxyUri.Scheme)); if (sslHostName == null) { if (HttpUtilities.IsNonSecureWebSocketScheme(uri.Scheme)) { // Non-secure websocket connection through proxy to the destination. return(new HttpConnectionKey(HttpConnectionKind.ProxyTunnel, isIPv6Address ? uri.Host : uri.IdnHost, uri.Port, null, proxyUri)); } else { // Standard HTTP proxy usage for non-secure requests // The destination host and port are ignored here, since these connections // will be shared across any requests that use the proxy. return(new HttpConnectionKey(HttpConnectionKind.Proxy, null, 0, null, proxyUri)); } } else { // Tunnel SSL connection through proxy to the destination. return(new HttpConnectionKey(HttpConnectionKind.SslProxyTunnel, isIPv6Address ? uri.Host : uri.IdnHost, uri.Port, sslHostName, proxyUri)); } } else if (sslHostName != null) { return(new HttpConnectionKey(HttpConnectionKind.Https, isIPv6Address ? uri.Host : uri.IdnHost, uri.Port, sslHostName, null)); } else { return(new HttpConnectionKey(HttpConnectionKind.Http, isIPv6Address ? uri.Host : uri.IdnHost, uri.Port, null, null)); } }