לתת ל-context של Go לבטל את הקמת חיבור SOCKS
השתמשו בממשק ContextDialer המיוצא לנתיב SOCKS ב-Go והבחינו בין ביטול חיבור לבין מועדים בתעבורת היישום המאוחרת.
func dialViaSOCKS(ctx context.Context, destination string) (net.Conn, error) {
dialer, err := proxy.SOCKS5(
"tcp",
"127.0.0.1:1080",
nil,
&net.Dialer{Timeout: 5 * time.Second},
)
if err != nil {
return nil, err
}
contextDialer, ok := dialer.(proxy.ContextDialer)
if !ok {
return nil, errors.New("SOCKS dialer lacks context support")
}
return contextDialer.DialContext(ctx, "tcp", destination)
}בתוך חבילת רשת קיימת של Go, השתמשו בייבוא context, errors, net, time ו-x/net/proxy. הארגומנט nil אינו בוחר פרטי SOCKS. עבור יעד ציבורי בנתיב פרוקסי ציבורי מותר, רשימת פרוקסי SOCKS5 מציעה מועמדים לנקודת הקצה של ה-dialer.
ההצהרה המיוצאת proxy.ContextDialer גורמת למימושים לא נתמכים להיכשל במפורש. בדקו את התלות שנפרסה במקום לנקוב בשם טיפוס dialer פנימי או להפעיל goroutine חוסם שהקורא אינו יכול לנהל.
ה-context שולט בהקמת החיבור. לאחר שהוחזר net.Conn, החילו מועדי קריאה/כתיבה מתאימים או מועדי בקשה ברמה גבוהה יותר. פסק הזמן של חיבור ה-dialer הבסיסי והתקציב הכולל של היישום הם גבולות שונים.
לשילוב תעבורת HTTP, שמרו על התנהגות ה-TLS וה-HTTP הרגילה שלו. זרם ה-SOCKS שמודע ל-context שמוחזר הוא המסירה לתעבורה, לא תגובה ולא מדיניות חיים לכל הבתים המאוחרים.