以下は、Go 言語で HTTP トンネリングを実装するためのサンプル コードです。
「行く」
パッケージメイン
輸入 (
「fmt」
「イオ」
"ネット"
「ネット/http」
)
func handleTunneling(w http.ResponseWriter, r *http.Request) {
destConn、err := net.Dial("tcp", r.Host )
エラーの場合 != nil {
http.Error(w, err.Error(), http.StatusServiceUnavailable)
戻る
}
w.WriteHeader(http.StatusOK)
ハイジャッカー、わかりました := w.(http.Hijacker)
大丈夫なら{
http.Error(w, "ハイジャックはサポートされていません", http.StatusInternalServerError)
戻る
}
clientConn、_、err := hijacker.Hijack()
エラーの場合 != nil {
http.Error(w, err.Error(), http.StatusServiceUnavailable)
戻る
}
go transfer(destConn, clientConn)
go transfer(clientConn, destConn)
}
func transfer(宛先 io.WriteCloser, ソース io.ReadCloser) {
宛先を延期する.Close()
ソースを延期する.Close()
io.Copy(コピー先, コピー元)
}
関数 main() {
http.HandleFunc("/", handleTunneling)
fmt.Println(":8080 でリッスンしています...")
err := http.ListenAndServe(":8080", nil)
エラーの場合 != nil {
fmt.Println(エラー)
}
}
「」
このサンプル コードでは、ポート 8080 でリッスンする HTTP サーバーを作成します。HTTP CONNECT リクエストを受信すると、ターゲット ホストへの TCP 接続を確立し、クライアント接続とターゲット接続の間でデータを転送します。
package main import ( "net/url""net/http""bytes""fmt""io/ioutil" ) const ProxyServer = " http://ip.hahado.cn:39010 " type ProxyAuth struct { ライセンス文字列 SecretKey string } func (p ProxyAuth) ProxyClient() http.Client { proxyURL, _ := URL。Parse ("http://" + p.License + ":" + p.SecretKey + "@" + ProxyServer) return http.Client{Transport: &http.Transport{Proxy:http.ProxyURL(proxyURL)}} } func main() { targetURI := " http://ip.hahaod.cn/ip " //targetURI := " http://ip.hahaod.cn/switch-ip "//targetURI := " http:// ip.hahaod.cn/current-ip " client := ProxyAuth{License: "ユーザー名", SecretKey: "パスワード"}.ProxyClient() request, _ := http.NewRequest("GET", targetURI, bytes.NewBuffer([] byte(``))) / /切换IP (HTTPのみサポート) request.Header。Set ("Proxy-Switch-Ip", "yes") 応答、 エラー := クライアント。Do (リクエスト) iferr != nil {パニック("接続に失敗しました: " + err . Error ()) } else { bodyByte, err := ioutil.ReadAll(response.Body) iferr != nil { fmt.Println("读取本文時出错", err ) return } response.Body. 近い() body := string(bodyByte) fmt.Println("レスポンスステータス:", response.Status) fmt.Println("レスポンスヘッダ:", response.Header) fmt.Println("レスポンスボディ:\n", body ) } }