Go 言語で HTTP トンネルを使用するコード例

以下は、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 ) } }

おすすめ

転載: blog.csdn.net/weixin_73725158/article/details/130860698