הוספת Outline SDK לקוד ב-Go

במדריך הזה מוסבר איך מגדירים את סביבת Go ומשתמשים ב-Outline SDK בקוד Go.

נפתח אפליקציה לדוגמה בשם splitfetch שמציגה תכונה של ה-SDK. האפליקציה מאחזרת דף אינטרנט, אבל במקום לשלוח את הבקשה בחבילת רשת אחת, היא משתמשת ב-Outline SDK כדי לפצל את מקור הנתונים ההתחלתי של ה-TCP לשתי חבילות נפרדות. הפעולה הזו עשויה לעזור לעקוף סוגים מסוימים של התערבות ברשת.

תוכלו להריץ את האפליקציה ב-Linux,‏ Mac ו-Windows. למידע על שילוב עם אפליקציות לנייד, אפשר לעיין במאמר הוספה של Outline SDK לאפליקציה לנייד.

שלב 1: מגדירים את Go

קודם כול, תצטרכו את שפת התכנות Go. אם כבר התקנתם את Go (גרסה 1.21 ואילך), תוכלו לדלג לשלב הבא.

כדי להתקין את הספרייה, אפשר לפעול לפי המדריך הרשמי. לחלופין, אם אתם משתמשים במנהל חבילות:

Linux

פועלים לפי השלבים שמפורטים במאמר Go Wiki: 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 .

בסיום תהליך ה-build, תוכלו להפיץ את האפליקציה ולהריץ אותה. לדוגמה:

./splitfetch https://getoutline.org