| @@ -135,7 +135,9 @@ aiohttp usage | |||||
| import asyncio | import asyncio | ||||
| import aiohttp | import aiohttp | ||||
| import aiosocks | import aiosocks | ||||
| from aiosocks.connector import SocksConnector, proxy_connector | |||||
| from aiosocks.connector import ( | |||||
| SocksConnector, proxy_connector, HttpProxyAddr, HttpProxyAuth | |||||
| ) | |||||
| async def load_github_main(): | async def load_github_main(): | ||||
| @@ -154,8 +156,8 @@ aiohttp usage | |||||
| remote_resolve=True, verify_ssl=False) | remote_resolve=True, verify_ssl=False) | ||||
| # return SocksConnector | # return SocksConnector | ||||
| conn = proxy_connector(aiosocks.HttpProxyAddr('http://proxy'), | |||||
| aiosocks.HttpProxyAuth('login', 'pwd')) | |||||
| conn = proxy_connector(HttpProxyAddr('http://proxy'), | |||||
| HttpProxyAuth('login', 'pwd')) | |||||
| # return aiohttp.ProxyConnector (http proxy connector) | # return aiohttp.ProxyConnector (http proxy connector) | ||||
| try: | try: | ||||
| @@ -4,19 +4,17 @@ from .errors import ( | |||||
| SocksConnectionError, InvalidServerReply, InvalidServerVersion | SocksConnectionError, InvalidServerReply, InvalidServerVersion | ||||
| ) | ) | ||||
| from .helpers import ( | from .helpers import ( | ||||
| SocksAddr, Socks4Addr, Socks5Addr, Socks4Auth, | |||||
| Socks5Auth, HttpProxyAddr, HttpProxyAuth | |||||
| SocksAddr, Socks4Addr, Socks5Addr, Socks4Auth, Socks5Auth | |||||
| ) | ) | ||||
| from .protocols import Socks4Protocol, Socks5Protocol, DEFAULT_LIMIT | from .protocols import Socks4Protocol, Socks5Protocol, DEFAULT_LIMIT | ||||
| __version__ = '0.1.5' | __version__ = '0.1.5' | ||||
| __all__ = ('Socks4Protocol', 'Socks5Protocol', 'Socks4Auth', | __all__ = ('Socks4Protocol', 'Socks5Protocol', 'Socks4Auth', | ||||
| 'Socks5Auth', 'Socks4Addr', 'Socks5Addr', 'HttpProxyAddr', | |||||
| 'HttpProxyAuth', 'SocksError', 'NoAcceptableAuthMethods', | |||||
| 'LoginAuthenticationFailed', 'SocksConnectionError', | |||||
| 'InvalidServerVersion', 'InvalidServerReply', | |||||
| 'create_connection', 'open_connection') | |||||
| 'Socks5Auth', 'Socks4Addr', 'Socks5Addr', 'SocksError', | |||||
| 'NoAcceptableAuthMethods', 'LoginAuthenticationFailed', | |||||
| 'SocksConnectionError', 'InvalidServerVersion', | |||||
| 'InvalidServerReply', 'create_connection', 'open_connection') | |||||
| @asyncio.coroutine | @asyncio.coroutine | ||||
| @@ -1,11 +1,24 @@ | |||||
| try: | |||||
| import aiohttp | |||||
| from aiohttp.errors import ProxyConnectionError | |||||
| from aiohttp.helpers import BasicAuth as HttpProxyAuth | |||||
| except ImportError: | |||||
| raise ImportError('aiosocks.SocksConnector require aiohttp library') | |||||
| import asyncio | import asyncio | ||||
| import aiohttp | |||||
| from aiohttp.errors import ProxyConnectionError | |||||
| from collections import namedtuple | |||||
| from .errors import SocksError, SocksConnectionError | from .errors import SocksError, SocksConnectionError | ||||
| from .helpers import HttpProxyAddr, SocksAddr | |||||
| from .helpers import SocksAddr | |||||
| from . import create_connection | from . import create_connection | ||||
| __all__ = ('SocksConnector',) | |||||
| __all__ = ('SocksConnector', 'HttpProxyAddr', 'HttpProxyAuth') | |||||
| class HttpProxyAddr(namedtuple('HttpProxyAddr', ['url'])): | |||||
| def __new__(cls, url): | |||||
| if url is None: | |||||
| raise ValueError('None is not allowed as url value') | |||||
| return super().__new__(cls, url) | |||||
| class SocksConnector(aiohttp.TCPConnector): | class SocksConnector(aiohttp.TCPConnector): | ||||
| @@ -1,8 +1,6 @@ | |||||
| from collections import namedtuple | from collections import namedtuple | ||||
| from aiohttp.helpers import BasicAuth as HttpProxyAuth | |||||
| __all__ = ('Socks4Auth', 'Socks5Auth', 'Socks4Addr', 'Socks5Addr', 'SocksAddr', | |||||
| 'HttpProxyAddr', 'HttpProxyAuth') | |||||
| __all__ = ('Socks4Auth', 'Socks5Auth', 'Socks4Addr', 'Socks5Addr', 'SocksAddr') | |||||
| class Socks4Auth(namedtuple('Socks4Auth', ['login', 'encoding'])): | class Socks4Auth(namedtuple('Socks4Auth', ['login', 'encoding'])): | ||||
| @@ -43,10 +41,3 @@ class Socks4Addr(SocksAddr): | |||||
| class Socks5Addr(SocksAddr): | class Socks5Addr(SocksAddr): | ||||
| pass | pass | ||||
| class HttpProxyAddr(namedtuple('HttpProxyAddr', ['url'])): | |||||
| def __new__(cls, url): | |||||
| if url is None: | |||||
| raise ValueError('None is not allowed as url value') | |||||
| return super().__new__(cls, url) | |||||
| @@ -2,10 +2,9 @@ import unittest | |||||
| import asyncio | import asyncio | ||||
| import aiosocks | import aiosocks | ||||
| import aiohttp | import aiohttp | ||||
| import pytest | |||||
| from unittest import mock | from unittest import mock | ||||
| from aiohttp.client_reqrep import ClientRequest | from aiohttp.client_reqrep import ClientRequest | ||||
| from aiosocks.connector import SocksConnector, proxy_connector | |||||
| from aiosocks.connector import SocksConnector, proxy_connector, HttpProxyAddr | |||||
| from .helpers import fake_coroutine | from .helpers import fake_coroutine | ||||
| @@ -133,18 +132,24 @@ class TestSocksConnector(unittest.TestCase): | |||||
| with self.assertRaises(aiosocks.SocksError): | with self.assertRaises(aiosocks.SocksError): | ||||
| self.loop.run_until_complete(connector.connect(req)) | self.loop.run_until_complete(connector.connect(req)) | ||||
| def test_proxy_connector(self): | |||||
| socks4_addr = aiosocks.Socks4Addr('h') | |||||
| socks5_addr = aiosocks.Socks5Addr('h') | |||||
| http_addr = HttpProxyAddr('http://proxy') | |||||
| def test_proxy_connector(): | |||||
| socks4_addr = aiosocks.Socks4Addr('h') | |||||
| socks5_addr = aiosocks.Socks5Addr('h') | |||||
| http_addr = aiosocks.HttpProxyAddr('http://proxy') | |||||
| self.assertIsInstance(proxy_connector(socks4_addr, loop=self.loop), | |||||
| SocksConnector) | |||||
| self.assertIsInstance(proxy_connector(socks5_addr, loop=self.loop), | |||||
| SocksConnector) | |||||
| self.assertIsInstance(proxy_connector(http_addr, loop=self.loop), | |||||
| aiohttp.ProxyConnector) | |||||
| loop = asyncio.new_event_loop() | |||||
| with self.assertRaises(ValueError): | |||||
| proxy_connector(None) | |||||
| assert isinstance(proxy_connector(socks4_addr, loop=loop), SocksConnector) | |||||
| assert isinstance(proxy_connector(socks5_addr, loop=loop), SocksConnector) | |||||
| assert isinstance(proxy_connector(http_addr, loop=loop), | |||||
| aiohttp.ProxyConnector) | |||||
| def test_http_proxy_addr(self): | |||||
| addr = HttpProxyAddr('http://proxy') | |||||
| self.assertEqual(addr.url, 'http://proxy') | |||||
| with pytest.raises(ValueError): | |||||
| proxy_connector(None) | |||||
| with self.assertRaises(ValueError): | |||||
| HttpProxyAddr(None) | |||||
| @@ -83,11 +83,3 @@ def test_socks5_addr4(): | |||||
| addr = aiosocks.Socks5Addr('localhost', None) | addr = aiosocks.Socks5Addr('localhost', None) | ||||
| assert addr.host == 'localhost' | assert addr.host == 'localhost' | ||||
| assert addr.port == 1080 | assert addr.port == 1080 | ||||
| def test_http_proxy_addr(): | |||||
| addr = aiosocks.HttpProxyAddr('http://proxy') | |||||
| assert addr.url == 'http://proxy' | |||||
| with pytest.raises(ValueError): | |||||
| aiosocks.HttpProxyAddr(None) | |||||