SOCKS Proxy Client and Server

The :std/net/socks package provides functionality for using and running SOCKS proxies.

To use bindings from this module

(import :std/net/socks)

SOCKS Client

You can create a SOCKS client using socks-proxy. The returned object is an instance of the SOCKS interface, which you can use to connect to another host or bind to accept an incoming connection.

SOCKS

(interface SOCKS
  (protocol)
  (proxy-address)
  (connect (address :~ address?))
  (bind (address :~ (maybe address?) := #f)))

This is the SOCKS client interface. The following methods create and operate on instances of the interface.

socks-connect

(socks-connect proxy-address [protocol = 'SOCKS4]) -> lambda (address) -> StreamSocket

Creates a connector function for establishing connextions through the proxy at proxy-address.

socks-proxy

(socks-proxy proxy-address (protocol SOCKS4)) -> SOCKS
  address := inet address
  protocol := symbol; one of SOCKS4, SOCKS4a, SOCKS5.

Connect to a SOCKS proxy, using the specified protocol. Returns an instance of the SOCKS interface.

SOCKS-protocol

(SOCKS-protocol socks)
  socks := instance of SOCKS

Returns the protocol used by a SOCKS instance, as a symbol

SOCKS-proxy-address

(SOCKS-protocol socks)
  socks := instance of SOCKS

Returns the address of the proxy behind a SOCKS instance.

SOCKS-connect

(SOCKS-connect socks address) -> StreamSocket
  socks := instance of SOCKS
  address := inet address

Connects to address through the proxy behind the SOCKS instance. Returns a StreamSocket instance.

SOCKS-bind

(SOCKS-connect socks (maybe-address #f) -> ServerSocket
  socks := instance of SOCKS
  address := inet address or #f

Binds a listener in the proxy behind the SOCKS instance for accepting an incoming connection. Returns an instance of ServerSocket.

Example

Here is how to use a SOCKS proxy listening at your-proxy-server-address for http connections:

(parameterize ((http-connect (socks-connect your-proxy-server-address)))
  (http-get "https://www.google.com"))