Dodawanie pakietu Outline SDK do kodu Go

Ten przewodnik przeprowadzi Cię przez proces konfigurowania środowiska Go i korzystania z pakietu Outline SDK w kodzie Go.

Utworzymy przykładową aplikację o nazwie splitfetch, aby zaprezentować cechy i funkcje tego pakietu SDK. Aplikacja ta pobiera stronę internetową, ale zamiast wysyłać żądanie w pojedynczym pakiecie sieciowym, używa Outline SDK do podzielenia początkowego strumienia TCP na dwa osobne pakiety. Może to ułatwić obchodzenie niektórych rodzajów interwencji w sieci.

Aplikacja będzie działać na platformach Linux, Mac i Windows. Informacje na temat integracji z aplikacjami mobilnymi znajdziesz w temacie Dodawanie pakietu Outline SDK do aplikacji mobilnej.

Krok 1. Skonfiguruj Go

Przede wszystkim potrzebujesz języka programowania Go. Jeśli masz już zainstalowane środowisko Go w wersji 1.21 lub nowszej, możesz przejść do następnego kroku.

Instrukcje instalacji znajdziesz w oficjalnym przewodniku, a jeśli korzystasz z systemu zarządzania pakietami:

Linux

Postępuj zgodnie z instrukcjami podanymi na stronie Go Wiki: Ubuntu.

Mac

brew install go

Windows

winget install --id=GoLang.Go  -e

Po zainstalowaniu środowiska Go możesz sprawdzić, czy wszystko działa prawidłowo, uruchamiając w terminalu to polecenie:

go version

Krok 2. Utwórz aplikację splitfetch

Teraz skonfigurujemy projekt splitfetch. Najpierw utwórz katalog projektu i zainicjuj moduł Go:

mkdir splitfetch
cd splitfetch
go mod init example/splitfetch

Następnie pobierz pakiet Outline SDK i utwórz plik main.go:

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

Krok 3. Użyj pakietu Outline SDK w aplikacji

Otwórz plik main.go w ulubionym edytorze kodu i wklej do niego podany niżej kod. Ten kod zawiera całą logikę działania aplikacji 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))
}

Po zapisaniu kodu uruchom w terminalu podane niżej polecenie, aby się upewnić, że plik go.mod został prawidłowo zaktualizowany.

go mod tidy

Krok 4. Uruchom aplikację

Po dodaniu kodu możesz uruchomić aplikację splitfetch.

Z poziomu katalogu splitfetch uruchom w terminalu podane niżej polecenie, przekazując adres URL jako argument:

go run . https://getoutline.org

Aplikacja zostanie skompilowana i uruchomiona, a następnie wyświetli zawartość HTML strony internetowej.

Jeśli chcesz utworzyć i rozpowszechnić samodzielny program, który można uruchomić bez środowiska go, użyj polecenia go build:

Linux i Mac

go build -o splitfetch .

Windows

go build -o splitfetch.exe .

Po skompilowaniu aplikacji możesz ją rozpowszechnić i zacząć z niej korzystać. Przykład:

./splitfetch https://getoutline.org