Adicionar o SDK Outline ao seu código Go

Este guia orienta todo o processo de configuração do ambiente Go e uso do SDK Outline no seu código Go.

Vamos criar um aplicativo de exemplo, chamado splitfetch, que demonstra o recurso do SDK. Esse aplicativo busca uma página da Web, mas em vez de enviar a solicitação em um único pacote de rede, ele usa o SDK Outline para dividir o stream inicial do TCP em dois pacotes separados. Isso pode ajudar a ignorar algumas formas de intervenção na rede.

O aplicativo poderá ser executado no Linux, Mac e Windows. Para integração com dispositivos móveis, confira Adicionar o SDK Outline ao seu app para dispositivos móveis.

Etapa 1: configurar o Go

Primeiro você vai precisar da Linguagem de programação Go (em inglês). Se você já tem o Go (versão 1.21 ou mais recente) instalado, pule para a próxima etapa.

Para a instalação, você pode seguir o guia oficial (em inglês); ou, se você usa o gerenciador de pacotes:

Linux

Siga as etapas em Wiki Go: Ubuntu (em inglês).

Mac

brew install go

Windows

winget install --id=GoLang.Go  -e

Quando o Go estiver instalado, você poderá confirmar que a instalação foi bem-sucedida executando o comando a seguir em um terminal:

go version

Etapa 2: criar o aplicativo splitfetch

Vamos configurar o projeto splitfetch. Primeiro crie o diretório do projeto e inicialize um módulo Go:

mkdir splitfetch
cd splitfetch
go mod init example/splitfetch

A seguir, adicione as dependências do SDK Outline e crie o arquivo main.go:

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

Etapa 3: usar o SDK Outline no aplicativo

Abra o arquivo main.go no seu editor de código favorito e cole o código a seguir. Esse código contém toda a lógica do nosso aplicativo 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))
}

Depois de salvar o código, execute o comando a seguir no seu terminal para se certificar que o arquivo go.mod seja atualizado corretamente.

go mod tidy

Etapa 4: executar o aplicativo

Com o código pronto, você pode executar o aplicativo splitfetch.

De dentro do diretório splitfetch, execute o comando a seguir no seu terminal, passando um URL como um argumento:

go run . https://getoutline.org

Isso compila e executa o aplicativo, exibindo o conteúdo HTML da página da web.

Se quiser criar e distribuir um programa independente que possa ser executado sem go, use o comando go build:

Linux e Mac

go build -o splitfetch .

Windows

go build -o splitfetch.exe .

Quando o build estiver pronto, você poderá distribuir e executar seu aplicativo. Por exemplo:

./splitfetch https://getoutline.org