이 가이드에서는 Go 환경을 설정하고 Go 코드에서 Outline SDK를 사용하는 프로세스를 안내합니다.
SDK 기능을 보여주는 예시 애플리케이션(splitfetch
)을 빌드하겠습니다. 이 애플리케이션은 웹페이지를 가져오지만, 요청을 단일 네트워크 패킷으로 전송하는 대신 Outline SDK를 사용하여 초기 TCP 스트림을 두 개의 개별 패킷으로 분할합니다. 이를 통해 일부 형태의 네트워크 개입을 우회할 수 있습니다.
Linux, Mac, Windows에서 애플리케이션을 실행할 수 있습니다. 모바일 앱과 통합하려면 모바일 앱에 Outline SDK 추가하기를 확인하세요.
1단계: Go 설정하기
먼저 Go 프로그래밍 언어가 필요합니다. 이미 Go(버전 1.21 이상)가 설치되어 있다면, 다음 단계로 건너뛸 수 있습니다.
설치하려면 공식 가이드를 참고하세요. 또는 패키지 관리자를 사용하는 경우 다음 안내를 따르세요.
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