Metadata-Version: 2.1
Name: gera2ld.socks
Version: 0.4.3
Summary: SOCKS client and server based on asyncio
Home-page: https://github.com/gera2ld/pysocks
License: MIT
Author: Gerald
Author-email: gera2ld@163.com
Requires-Python: >=3.7,<4.0
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Requires-Dist: async_dns (>=1.1.3,<2.0.0)
Requires-Dist: gera2ld-pyserve (>=0.3.0,<0.4.0)
Project-URL: Repository, https://github.com/gera2ld/pysocks
Description-Content-Type: text/markdown

# gera2ld.socks

[![PyPI](https://img.shields.io/pypi/v/gera2ld.socks.svg)](https://pypi.org/project/gera2ld.socks/)

This is a SOCKS server and client package built with `asyncio` (requires Python 3.5+).

## Installation

``` sh
$ pip3 install gera2ld.socks
```

## Usage

* SOCKS server

  shell command:
  ``` sh
  # Start a server
  $ python3 -m gera2ld.socks.server -b 127.0.0.1:1080
  ```

  or python script:
  ``` python
  from gera2ld.pyserve import run_forever
  from gera2ld.socks.server import Config, SOCKSServer

  config = Config('127.0.0.1:1080')
  run_forever(SOCKSServer(config).start_server())
  ```

* SOCKS client

  ``` python
  import asyncio
  from gera2ld.socks.client import create_client

  client = create_client('socks5://127.0.0.1:1080')
  loop = asyncio.get_event_loop()
  loop.run_until_complete(client.handle_connect(('www.google.com', 80)))
  client.writer.write(b'...')
  print(loop.run_until_complete(client.reader.read()))
  ```

* SOCKS handler for `urllib`

  ``` python
  from urllib import request
  from gera2ld.socks.client.handler import SOCKSProxyHandler

  handler = SOCKSProxyHandler('socks5://127.0.0.1:1080')

  opener = request.build_opener(handler)
  r = opener.open('https://www.example.com')
  print(r.read().decode())
  ```

* SOCKS client for UDP

  ``` python
  import asyncio
  from gera2ld.socks.client import create_client

  async def main():
      client = create_client('socks5://127.0.0.1:1080')
      udp = await client.handle_udp()
      udp.write_data(b'\xc9\xa7\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x03www\x06google\x03com\x00\x00\xff\x00\x01', ('114.114.114.114', 53))
      print(await udp.results.get())

  loop = asyncio.get_event_loop()
  loop.run_until_complete(main())
  ```

