diff --git a/README.md b/README.md index 20b6d32..5155537 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,106 @@ # go-meta-dialer + A dialer which will reach clearnet, onion, and I2P sites, and an HTTP Client which has specific TLS behavior for Onion and I2P domains. + +## Installation + +```bash +go get github.com/go-i2p/go-meta-dialer +``` + +## Features + +- Multi-network dialer supporting regular internet, Tor (.onion), and I2P (.i2p) connections +- Automatic routing based on destination address +- Optional anonymity mode to route all non-I2P connections through Tor +- HTTP client with special TLS handling for darknet services + +## Usage + +### Basic Dialer + +```go +package main + +import ( + "fmt" + "io/ioutil" + "net/http" + + metadialer "github.com/go-i2p/go-meta-dialer" +) + +func main() { + // IMPORTANT: Close the dialers when done to prevent SAM/Tor session leaks + defer metadialer.Garlic.Close() + defer metadialer.Onion.Close() + + // Use the dialer directly + conn, err := metadialer.Dial("tcp", "example.i2p:80") + if err != nil { + panic(err) + } + defer conn.Close() + + // Do something with the connection... +} +``` + +### HTTP Client + +```go +package main + +import ( + "fmt" + "io/ioutil" + + metadialer "github.com/go-i2p/go-meta-dialer" +) + +func main() { + // IMPORTANT: Close the dialers when done + defer metadialer.Garlic.Close() + defer metadialer.Onion.Close() + + // Create a new HTTP client + client := metadialer.NewMetaHTTPClient(nil) + + // Make requests to any network + resp, err := client.Get("https://example.com") // Normal website + // resp, err := client.Get("http://example.onion") // Tor onion service + // resp, err := client.Get("http://example.i2p") // I2P site + + if err != nil { + panic(err) + } + defer resp.Body.Close() + + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + panic(err) + } + + fmt.Println(string(body)) +} +``` + +### Make it the Default HTTP Client + +```go +// Set the MetaHTTPClient as the default for all HTTP requests +client := metadialer.NewMetaHTTPClient(nil) +http.DefaultClient = client.HTTPClient() +``` + +## Configuration + +- `metadialer.ANON = true`: (Default) Routes all non-I2P connections through Tor +- `metadialer.ANON = false`: Only routes .onion domains through Tor, direct connection for regular domains + +## Notes + +- TLS verification is skipped for .i2p and .onion domains but performs standard verification for all other domains +- The dialer automatically routes traffic to the appropriate network based on the TLD +- Requires a running SAM bridge (default: 127.0.0.1:7656) for I2P connections +- Requires a running Tor SOCKS proxy for .onion connections \ No newline at end of file