Skip to content

Proxy Setup

Overview

Shoutrrr supports proxying HTTP requests for notification services, allowing you to route traffic through a proxy server. This can be configured using an environment variable or by customizing the HTTP client in code.

Usage

Environment Variable

Set the HTTP_PROXY environment variable to the proxy URL. This applies to all HTTP-based services used by Shoutrrr.

Set HTTP_PROXY Environment Variable
export HTTP_PROXY="socks5://localhost:1337"

Custom HTTP Client

Override the default HTTP client in your Go code to configure a proxy with specific transport settings.

Configure Custom HTTP Client with Proxy
import (
    "log"
    "net/http"
    "net/url"
    "time"
)

proxyURL, err := url.Parse("socks5://localhost:1337")
if err != nil {
    log.Fatalf("Error parsing proxy URL: %v", err)
}

http.DefaultClient.Transport = &http.Transport{
    Proxy: http.ProxyURL(proxyURL),
    DialContext: (&net.Dialer{
        Timeout:   30 * time.Second,
        KeepAlive: 30 * time.Second,
    }).DialContext,
    ForceAttemptHTTP2:     true,
    MaxIdleConns:          100,
    IdleConnTimeout:       90 * time.Second,
    TLSHandshakeTimeout:   10 * time.Second,
    ExpectContinueTimeout: 1 * time.Second,
}

Examples

Using Environment Variable for Proxy

Example

Set Proxy and Send Notification
export HTTP_PROXY="socks5://localhost:1337"
shoutrrr send --url "discord://abc123@123456789" --message "Hello via proxy!"
Expected Output
Notification sent

Using Custom HTTP Client in Go

Example

Send Notification with Proxy
package main

import (
    "log"
    "net/http"
    "net/url"
    "time"
    "github.com/circa10a/shoutrrr"
)

func main() {
    proxyURL, err := url.Parse("socks5://localhost:1337")
    if err != nil {
        log.Fatalf("Error parsing proxy URL: %v", err)
    }

    http.DefaultClient.Transport = &http.Transport{
        Proxy: http.ProxyURL(proxyURL),
        DialContext: (&net.Dialer{
            Timeout:   30 * time.Second,
            KeepAlive: 30 * time.Second,
        }).DialContext,
        ForceAttemptHTTP2:     true,
        MaxIdleConns:          100,
        IdleConnTimeout:       90 * time.Second,
        TLSHandshakeTimeout:   10 * time.Second,
        ExpectContinueTimeout: 1 * time.Second,
    }

    url := "discord://abc123@123456789"
    errs := shoutrrr.Send(url, "Hello via proxy!")
    if len(errs) > 0 {
        for _, err := range errs {
            log.Println("Error:", err)
        }
    }
}
Expected Output (Success)
(No output on success)
Expected Output (Error)
Error: failed to send message: unexpected response status code

Notes

  • Environment Variable: HTTP_PROXY supports protocols like http, https, or socks5. It affects all HTTP-based services globally.
  • Custom HTTP Client: Provides fine-grained control over proxy settings, suitable for Go applications requiring specific transport configurations.
  • Service Compatibility: Ensure the proxy supports the protocol used by the service (e.g., HTTPS for Discord, SMTP).
  • Timeouts: The custom client example includes a 30-second dial timeout and 10-second TLS handshake timeout, adjustable as needed.