第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何在 Go 中實(shí)現(xiàn) HTTP 轉(zhuǎn)發(fā)代理

如何在 Go 中實(shí)現(xiàn) HTTP 轉(zhuǎn)發(fā)代理

Go
UYOU 2022-08-24 18:41:40
我想實(shí)現(xiàn)一個(gè)HTTP請(qǐng)求和響應(yīng)系統(tǒng),用于client ------> A ----------> B --------> (request) HTTPserver client <------ A <---------- B <-------- (response) HTTPserver客戶端使用任何 HTTP 方法(POST、PUT 等)向 A 發(fā)送 HTTP 請(qǐng)求然后A讀取請(qǐng)求正文對(duì)其進(jìn)行加密,然后將其轉(zhuǎn)發(fā)到B 3 B,然后解密讀取HTTP請(qǐng)求正文B然后用收到的解密體作為有效載荷準(zhǔn)備一個(gè)HTTP請(qǐng)求并發(fā)送到HTTP服務(wù)器。5 然后,HTTP 服務(wù)器響應(yīng) B。然后 B 對(duì)來自 HTTP 服務(wù)器的響應(yīng)進(jìn)行加密,然后轉(zhuǎn)發(fā)到 A。A 還解密來自 B 的響應(yīng),然后將響應(yīng)發(fā)送回客戶端。我根據(jù)前面的建議實(shí)現(xiàn)了以下目標(biāo)。ProxyA:const (  ServerB = "<address of B>"  Port = "<proxy A port>")func main() {  // start server  http.HandleFunc("/", proxyPass)  log.Fatal(http.ListenAndServe(":" + Port, nil))}func proxyPass(res http.ResponseWriter, req  *http.Request) {  // read request body from clientbodybytes, _ := ioutil.ReadAll(req.Body)defer req.Body.Close()// encrypt req.Bodyobject, _ := enc.Encrypt(bodybytes)// serialize objectserialized, _ := object.CompactSerialize()// prepare forwarding messagemsg := message{reformatedData: serialized}// encode message msgbytes, _ := json.Marshal(&msg)req.ContentLength = int64(len(msgbytes))req.Body = ioutil.NopCloser(bytes.NewBuffer(msgbytes))// How do I read the response data from proxy server B and then send// response to the client....   url, _ := url.Parse(ServerB)  proxy := httputil.NewSingleHostReverseProxy(url)  proxy.ServeHTTP(res, req)}For proxy B:const (  Server = "<address of server>"  Port = "<proxy B port>")func main() {  // start server  http.HandleFunc("/", proxyPass)  log.Fatal(http.ListenAndServe(":" + Port, nil))}func proxyPass(res http.ResponseWriter, req  *http.Request) {  var msg message  HTTPServerurl := http://xxxxx  // read request body  bodybytes, _ := ioutil.ReadAll(req.Body)    req.ContentLength = int64(len(bodybytes))  req.Body = ioutil.NopCloser(bytes.NewBuffer(bodybytes))我的問題是如何將代理 B 中的代理ServHTTP“res”中的“respmsgbytes”寫回代理A?如何從代理服務(wù)器 B 讀取響應(yīng)數(shù)據(jù),然后將響應(yīng)發(fā)送到客戶端?有什么幫助嗎?我留下了錯(cuò)誤檢查以使代碼簡短。
查看完整描述

1 回答

?
至尊寶的傳說

TA貢獻(xiàn)1789條經(jīng)驗(yàn) 獲得超10個(gè)贊

你可以使用 httputil

你可以做類似下面的事情。

對(duì)于代理 A:


const (

  ServerB = "<address of B>"

  Port = "<proxy A port>"

)


func main() {

  // start server

  http.HandleFunc("/", proxyPass)

  log.Fatal(http.ListenAndServe(":" + Port, nil))

}


func proxyPass(res http.ResponseWriter, req  *http.Request) {

  // Encrypt Request here

  // ...


  url, _ := url.Parse(ServerB)

  proxy := httputil.NewSingleHostReverseProxy(url)

  proxy.ServeHTTP(res, req)

對(duì)于代理 B:


const (

  Server = "<address of server>"

  Port = "<proxy B port>"

)


func main() {

  // start server

  http.HandleFunc("/", proxyPass)

  log.Fatal(http.ListenAndServe(":" + Port, nil))

}


func proxyPass(res http.ResponseWriter, req  *http.Request) {

  // Decrypt Request here

  // ...


  url, _ := url.Parse(Server)

  proxy := httputil.NewSingleHostReverseProxy(url)

  proxy.ServeHTTP(res, req)

編輯:

要處理每個(gè)代理的請(qǐng)求正文,您可以查看此內(nèi)容?;蛘撸艺J(rèn)為基于當(dāng)前要求構(gòu)建新要求應(yīng)該沒有壞處,如下所示:


func proxyPass(res http.ResponseWriter, req  *http.Request) {

    body, _ := ioutil.ReadAll(req.Body)

    data := string(body)


    // process data here


    req, _ = http.NewRequest(req.Method, req.URL.String(), strings.NewReader(data))

    

    u, _ := url.Parse(Server)

    proxy := httputil.NewSingleHostReverseProxy(u)

    proxy.ServeHTTP(res, req)

}

這可以在兩個(gè)代理上完成。


編輯:

代理響應(yīng)可以使用 ReverseProxy.ModifyResponse 進(jìn)行更新。

你可以這樣使用它:


func proxyPass(res http.ResponseWriter, req *http.Request) {

    ....

    

    proxy := httputil.NewSingleHostReverseProxy(url)

    

    proxy.ModifyResponse = func(response *http.Response) error {

        // Read and update the response here


        // The response here is response from server (proxy B if this is at proxy A)

        // It is a pointer, so can be modified to update in place

        // It will not be called if Proxy B is unreachable

    }


    proxy.ServeHTTP(res, req)

}


查看完整回答
反對(duì) 回復(fù) 2022-08-24
  • 1 回答
  • 0 關(guān)注
  • 243 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)