Ajouter le SDK Outline à votre code Go

Ce guide vous explique comment configurer votre environnement Go et utiliser le SDK Outline dans votre code Go.

Nous allons créer un exemple d'application nommée splitfetch, qui présente une fonctionnalité du SDK. Cette application récupère une page Web, mais au lieu d'envoyer la requête en un seul paquet réseau, elle se sert du SDK Outline pour diviser le flux TCP initial en deux paquets distincts. Cela peut permettre de contourner certaines formes d'interventions sur le réseau.

Vous pouvez exécuter l'application sur Linux, Mac et Windows. Pour intégrer le SDK à des applications mobiles, consultez la page Ajouter le SDK Outline à votre application mobile.

Étape 1 : Configurer Go

Tout d'abord, vous avez besoin du langage de programmation Go. Si vous avez déjà installé Go (version 1.21 ou ultérieure), vous pouvez passer à l'étape suivante.

Pour installer Go, vous pouvez suivre le guide officiel ou procéder comme suit si vous utilisez un gestionnaire de paquets :

Linux

Suivez les étapes figurant sur Go Wiki: Ubuntu.

Mac

brew install go

Windows

winget install --id=GoLang.Go  -e

Une fois l'installation terminée, vous pouvez vérifier que Go est bien installé en exécutant la commande suivante dans un terminal :

go version

Étape 2 : Créer l'application splitfetch

Pour configurer le projet splitfetch, commencez par créer le répertoire du projet et initialiser un module Go :

mkdir splitfetch
cd splitfetch
go mod init example/splitfetch

Ensuite, ajoutez le SDK Outline et créez votre fichier main.go :

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

Étape 3 : Utiliser le SDK Outline dans l'application

Ouvrez le fichier main.go dans l'éditeur de code de votre choix et collez-y le code ci-dessous. Ce code contient toute la logique pour notre application 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))
}

Une fois le code enregistré, exécutez la commande suivante dans votre terminal pour vous assurer que le fichier go.mod a bien été mis à jour.

go mod tidy

Étape 4 : Exécuter l'application

Maintenant que le code est prêt, vous pouvez exécuter l'application splitfetch.

Depuis le répertoire splitfetch, exécutez la commande suivante dans votre terminal, en utilisant une URL comme argument :

go run . https://getoutline.org

Cette commande compile et exécute l'application, en affichant le contenu HTML de la page Web.

Si vous souhaitez créer et partager un programme autonome exécutable sans go, utilisez la commande go build :

Linux et Mac

go build -o splitfetch .

Windows

go build -o splitfetch.exe .

Une fois la compilation terminée, vous pouvez partager et exécuter votre application. Par exemple :

./splitfetch https://getoutline.org