亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Golang 讀取 HTTPS 響應體

Golang 讀取 HTTPS 響應體

Go
慕哥6287543 2022-07-11 15:42:58
我正在編寫一些中間件,即使目標使用 TLS 加密,我也需要能夠記錄響應正文內容。我有一個處理程序鏈,在其中我將響應主體存儲在中間緩沖區中,以便我可以多次讀取它。這是基于 icza 提供的優秀示例(Golang 讀取請求正文)。在我的處理程序函數中,我正在這樣做....    body, err := ioutil.ReadAll(resp.Body)    if err != nil {        log.Fatal(err)    }    // Print the response body to stdout    fmt.Printf("Dest HTTP response body: %s\n", body)    bRdr := bytes.NewReader(body)    n, err := io.Copy(w, bRdr) // Copy the entire response body into our outgoing response我發現,當連接到不使用 TLS 的目的地時,我得到可讀的輸出,但是當使用 TLS 連接到目的地時,似乎響應正文仍然是加密的,盡管復制到對發起者的最終響應會導致接收有效響應正文內容的發起者。這是使用加密路徑讀取響應正文的預期行為嗎?我可以解密這些數據以使其可讀嗎?我已經閱讀了 http、tls 和加密包文檔,但沒有找到任何線索。
查看完整描述

2 回答

?
慕桂英546537

TA貢獻1848條經驗 獲得超10個贊

我不確定我是否理解問題,但這是我調用 https google 鏈接并打印輸出。


package main


import (

    "fmt"

    "io/ioutil"

    "log"

    "net/http"


    "golang.org/x/net/http2"

)


func main() {

    client := &http.Client{Transport: transport2()}


    res, err := client.Get("https://www.google.com")

    if err != nil {

        log.Fatal(err)

    }


    body, err := ioutil.ReadAll(res.Body)

    if err != nil {

        log.Fatal(err)

    }


    res.Body.Close()


    fmt.Printf("Code: %d\n", res.StatusCode)

    fmt.Printf("Body: %s\n", body)

}


func transport2() *http2.Transport {

    return &http2.Transport{

        DisableCompression: true,

        AllowHTTP:          false,

    }

}


查看完整回答
反對 回復 2022-07-11
?
MMTTMM

TA貢獻1869條經驗 獲得超4個贊

謝謝大家的意見。Travis 似乎已經確定了我遇到的問題。我正在閱讀的響應正文似乎是 gzip 編碼的(響應包含“Content-Encoding:gzip”)。為了驗證是否是這種情況,我必須在轉發之前顯式刪除原始請求中的“Accept-Encoding: gzip”標頭,并將傳輸配置為設置“DisableCompression:true”。一旦我進行了這兩項更改,我就會看到沒有“Content-Encoding”標題的響應,并且我閱讀的正文是人類可讀的。



查看完整回答
反對 回復 2022-07-11
  • 2 回答
  • 0 關注
  • 172 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號