public static byte[] GetAddressBytes(this SocksAddress address)
        {
            switch (address.HostNameType)
            {
            case EndPointType.IPv4:
                return(GetBytesForIPv4(address.Host));

            case EndPointType.IPv6:
                return(GetBytesForIPv6(address.Host));
            }
            throw new NotSupportedException();
        }
Exemple #2
0
        private async Task <SocksAddress> ResolveHostName(SocksAddress address)
        {
            if (address.HostNameType != EndPointType.HostName)
            {
                return(address);
            }

            var supportLevel = (AddressCompatibility & AddressCompatibility.SupportsIPv6) == AddressCompatibility.SupportsIPv6
                ? SocksUtilities.IPv4SupportLevel.NoPreference
                : SocksUtilities.IPv4SupportLevel.RequiresIPv4;

            // Try resolve host name
            var resolvedHost = await SocksUtilities.ResolveHost(address.Host, supportLevel);

            if (string.IsNullOrEmpty(resolvedHost))
            {
                return(null);
            }
            return(new SocksAddress(resolvedHost, address.Port));
        }
 public static byte[] GetPortBytes(this SocksAddress address)
 {
     return(GetPortBytes(address.Port));
 }
Exemple #4
0
        protected async Task <HttpResponseMessage> InternalSendAsync(HttpRequestMessage request, HttpMethod requestMethod, Uri requestUri, CancellationToken cancellationToken, bool forceRecreate)
        {
            var useSsl             = string.Equals(requestUri.Scheme, "https", StringComparison.OrdinalIgnoreCase);
            var destinationAddress = new SocksAddress(requestUri);

            switch (destinationAddress.HostNameType)
            {
            case EndPointType.IPv4:
                // All SOCKS implementations support IPv4
                break;

            case EndPointType.IPv6:
                if ((AddressCompatibility & AddressCompatibility.SupportsIPv6) != AddressCompatibility.SupportsIPv6)
                {
                    throw new NotSupportedException();
                }
                break;

            case EndPointType.HostName:
                if ((AddressCompatibility & AddressCompatibility.SupportsHost) != AddressCompatibility.SupportsHost)
                {
                    destinationAddress = await ResolveHostName(destinationAddress);

                    if (destinationAddress == null)
                    {
                        throw new NotSupportedException();
                    }
                }
                break;
            }

            if (ResolveHost && destinationAddress.HostNameType == EndPointType.HostName)
            {
                destinationAddress = await ResolveHostName(destinationAddress) ?? destinationAddress;
            }

            var client = CreateClient(request, destinationAddress, useSsl, cancellationToken, forceRecreate);

            try
            {
                client.Timeout          = Timeout;
                client.ReadWriteTimeout = ReadWriteTimeout;

                await client.Open(cancellationToken);

                var stream = client.GetStream();

                await ValidateHeader(request);

                // Send request
                await WriteRequestHeader(stream, request, requestMethod, requestUri, cancellationToken);
                await WriteContent(stream, request, cancellationToken);

                await stream.FlushAsync(cancellationToken);

                if (UseCookies && CookieContainer == null)
                {
                    CookieContainer = new CookieContainer();
                }

                // Parse response
                var response = new TcpResponseMessage(client, request, requestUri, this);
                await response.Parse(cancellationToken);

                OnResponseReceived(response);
                return(response);
            }
            catch
            {
                client.Dispose();
                throw;
            }
        }
Exemple #5
0
 protected abstract ITcpClient CreateClient(HttpRequestMessage request, SocksAddress destinationAddress, bool useSsl, CancellationToken cancellationToken, bool forceRecreate);