Go 코드에 Outline SDK 추가하기

이 가이드에서는 Go 환경을 설정하고 Go 코드에서 Outline SDK를 사용하는 프로세스를 안내합니다.

SDK 기능을 보여주는 예시 애플리케이션(splitfetch)을 빌드하겠습니다. 이 애플리케이션은 웹페이지를 가져오지만, 요청을 단일 네트워크 패킷으로 전송하는 대신 Outline SDK를 사용하여 초기 TCP 스트림을 두 개의 개별 패킷으로 분할합니다. 이를 통해 일부 형태의 네트워크 개입을 우회할 수 있습니다.

Linux, Mac, Windows에서 애플리케이션을 실행할 수 있습니다. 모바일 앱과 통합하려면 모바일 앱에 Outline SDK 추가하기를 확인하세요.

1단계: Go 설정하기

먼저 Go 프로그래밍 언어가 필요합니다. 이미 Go(버전 1.21 이상)가 설치되어 있다면, 다음 단계로 건너뛸 수 있습니다.

설치하려면 공식 가이드를 참고하세요. 또는 패키지 관리자를 사용하는 경우 다음 안내를 따르세요.

Linux

Go 위키: Ubuntu의 단계를 따릅니다.

Mac

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 및 Mac

go build -o splitfetch .

Windows

go build -o splitfetch.exe .

빌드가 완료되면 애플리케이션을 배포하고 실행할 수 있습니다. 예를 들면 다음과 같습니다.

./splitfetch https://getoutline.org