Aggiungi Outline SDK al tuo codice Go

Questa guida illustra il processo per configurare il tuo ambiente Go e usare Outline SDK nel codice Go.

Creeremo un'applicazione di esempio denominata splitfetch che illustra una funzionalità dell'SDK. Questa applicazione recupera una pagina web, ma invece di inviare la richiesta in un unico pacchetto di rete utilizza Outline SDK per suddividere il flusso TCP iniziale in due pacchetti separati. Questo può essere utile per aggirare alcuni tipi di interferenze di rete.

Potrai eseguire l'applicazione in Linux, Mac e Windows. Per l'integrazione con le app mobile, vedi Aggiungere Outline SDK alla tua app mobile.

Passaggio 1: configura Go

Per prima cosa avrai bisogno del linguaggio di programmazione Go. Se hai già installato Go (versione 1.21 o successiva), puoi andare al passaggio successivo.

Per l'installazione puoi seguire la guida ufficiale oppure, se usi un gestore di pacchetti:

Linux

Segui la procedura nella pagina del Wiki di Go per Ubuntu.

Mac

brew install go

Windows

winget install --id=GoLang.Go  -e

Al termine, puoi verificare che Go sia stato installato correttamente eseguendo il comando seguente in un terminale:

go version

Passaggio 2: crea l'applicazione splitfetch

È il momento di preparare il progetto splitfetch. Per prima cosa, crea la directory di progetto e inizializza un modulo Go:

mkdir splitfetch
cd splitfetch
go mod init example/splitfetch

Successivamente, aggiungi la dipendenza Outline SDK e crea il tuo file main.go:

go get github.com/Jigsaw-Code/outline-sdk@latest
touch main.go

Passaggio 3: usa Outline SDK nell'applicazione

Apri il file main.go nel tuo editor di codice preferito e incolla il codice seguente nel file. Questo codice contiene tutta la logica per l'applicazione splitfetch.

package main

import (
    "context"
    "fmt"
    "io"
    "log"
    "net"
    "net/http"
    "os"

    "github.com/Jigsaw-Code/outline-sdk/transport"
    "github.com/Jigsaw-Code/outline-sdk/transport/split"
)

// The number of bytes to send in the first packet.
const splitPacketSize = 3

func main() {
    // 1. Get the URL from the command-line arguments.
    if len(os.Args) < 2 {
        log.Fatalf("Usage: %s <URL>", os.Args[0])
    }
    url := os.Args[1]

    // 2. Create a split dialer from the Outline SDK.
    // This dialer wraps a standard TCP dialer to add the splitting behavior.
    dialer, err := split.NewStreamDialer(&transport.TCPDialer{}, split.NewFixedSplitIterator(splitPacketSize))
    if err != nil {
        log.Fatalf("Failed to create split dialer: %v", err)
    }

    // 3. Configure an HTTP client to use our custom split dialer for TCP connections.
    httpClient := &http.Client{
        Transport: &http.Transport{
            DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) {
                return dialer.DialStream(ctx, addr)
            },
        },
    }

    // 4. Use the custom client to make the HTTP GET request.
    resp, err := httpClient.Get(url)
    if err != nil {
        log.Fatalf("HTTP request failed: %v", err)
    }
    defer resp.Body.Close()

    body, err := io.ReadAll(resp.Body)
    if err != nil {
        log.Fatalf("Failed to read response body: %v", err)
    }
    fmt.Println(string(body))
}

Dopo aver salvato il codice, esegui il comando seguente nel terminale per assicurarti che il file go.mod sia aggiornato correttamente.

go mod tidy

Passaggio 4: esegui l'applicazione

Ora che il codice è pronto, puoi eseguire l'applicazione splitfetch.

Dalla directory splitfetch esegui il comando seguente nel tuo terminale, passando un URL come argomento:

go run . https://getoutline.org

L'applicazione viene compilata ed eseguita, visualizzando il contenuto HTML della pagina web.

Se vuoi creare e distribuire un programma autonomo eseguibile senza go, usa il comando go build:

Linux e Mac

go build -o splitfetch .

Windows

go build -o splitfetch.exe .

Al termine della creazione, puoi distribuire ed eseguire la tua applicazione. Ad esempio:

./splitfetch https://getoutline.org