افزودن Outline SDK به کد Go

این راهنما شما را در فرایند راه‌اندازی کردن Go environment و استفاده کردن از Outline SDK به زبان Go code کمک می‌کند.

ما برنامه نمونه‌ای به‌نام splitfetch خواهیم ساخت که ویژگی «کیت توسعه نرم‌افزار» را نمایش می‌دهد. این برنامه صفحه وب را واکشی می‌کند ولی به‌جای اینکه درخواست را در یک بسته شبکه‌ای ارسال کند، از Outline SDK استفاده می‌کند تا جاری‌سازی TCP اولیه را به دو بسته جداگانه تقسیم کند. این کار ممکن است کمک کند تا برخی‌از فرم‌های مداخله شبکه را دور بزنید.

می‌توانید برنامه را در Linux،‏ Mac، و Windows اجرا کنید. برای ادغام کردن با برنامه‌های تلفن همراه، افزودن Outline SDK به برنامه تلفن همراهتان را ببینید.

مرحله ۱: راه‌اندازی Go

ابتدا به زبان برنامه‌نویسی Go نیاز دارید. اگر قبلاً Go (نسخه ۱.۲۱ یا جدیدتر) را نصب کرده‌اید، می‌توانید این مرحله را رد کنید.

برای نصب کردن، می‌توانید راهنمای رسمی را دنبال کنید یا اگر از «مدیر بسته» استفاده می‌کنید:

Linux

مراحل را در Go Wiki:‏ Ubuntu دنبال کنید.

Mac

brew install go

Windows

winget install --id=GoLang.Go  -e

پس‌از نصب کردن Go، برای درستی‌سنجی کردن نصب می‌توانید دستور زیر را در پایانه اجرا کنید:

go version

مرحله ۲: ساختن برنامه splitfetch

بیایید پروژه splitfetch را راه‌اندازی کنیم. ابتدا فهرست راهنمای پروژه را بسازید و به Go module مقدار اولیه بدهید:

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

مرحله ۳: استفاده کردن از 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

مرحله ۴: اجرا کردن برنامه

با قرار دادن کد در محل، اکنون می‌توانید برنامه splitfetch را اجرا کنید.

از درون فهرست راهنمای splitfetch، دستور زیر را در پایانه‌تان اجرا کنید و نشانی وبی را با به‌عنوان متغیر مستقل عبور دهید:

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