Как добавить Outline SDK в код Go

Это руководство поможет вам настроить среду Go и использовать Outline SDK в коде Go.

Чтобы показать принцип работы функции SDK, мы создадим приложение под названием splitfetch в качестве примера. Это приложение получает веб-страницу, но отправляет запрос не одним сетевым пакетом, а использует Outline SDK, чтобы разделить начальный TCP-поток на два отдельных пакета. Такой подход помогает обойти некоторые формы сетевых ограничений.

Приложение можно запустить на устройствах с Linux, macOS или Windows. Вы также можете интегрировать Outline SDK в мобильные приложения.

Шаг 1. Установите Go

Сначала необходимо установить язык программирования Go. Если у вас уже установлен язык Go 1.21 или более поздней версии, перейдите к следующему шагу.

Чтобы установить Go, следуйте инструкциям в официальном руководстве или воспользуйтесь менеджером пакетов:

Linux

Следуйте инструкциям на странице Go Wiki: Ubuntu.

macOS

brew install go

Windows

winget install --id=GoLang.Go  -e

После установки Go вы можете проверить, что все работает корректно, выполнив в терминале следующую команду:

go version

Шаг 2. Создайте приложение splitfetch

Сначала настройте проект splitfetch. Создайте каталог проекта и инициализируйте модуль Go:

mkdir splitfetch
cd splitfetch
go mod init example/splitfetch

Затем добавьте в код зависимость Outline SDK и создайте файл main.go:

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

Шаг 3. Используйте Outline SDK в приложении

Откройте файл main.go в предпочитаемом редакторе кода и вставьте в него указанный код. Этот код содержит всю логику приложения 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))
}

Чтобы убедиться, что файл go.mod был обновлен корректно, после сохранения кода выполните в терминале указанную ниже команду.

go mod tidy

Шаг 4. Запустите приложение

Добавив код, вы можете запустить приложение splitfetch.

Перейдите в каталог splitfetch и выполните в терминале следующую команду, передав URL в качестве аргумента:

go run . https://getoutline.org

Эта команда компилирует и запускает приложение, показывая HTML-код веб-страницы.

Если вы хотите создать и распространить отдельную исполняемую программу, которую можно запускать без go, используйте команду go build:

Linux и macOS

go build -o splitfetch .

Windows

go build -o splitfetch.exe .

После завершения сборки вы можете распространять и запускать свое приложение. Например:

./splitfetch https://getoutline.org