首頁 > 後端開發 > Golang > 如何在 Go 中解析文字檔案中的 HTTP 請求和回應?

如何在 Go 中解析文字檔案中的 HTTP 請求和回應?

Patricia Arquette
發布: 2025-01-04 07:00:35
原創
316 人瀏覽過

How to Parse HTTP Requests and Responses from Text Files in Go?

在Go 中解析來自文字檔案的HTTP 請求和回應

使用儲存在文字檔案中的HTTP 管道流時,解析請求和響應對於進一步加工至關重要。在本文中,我們將探討如何使用 http.ReadRequest 和 http.ReadResponse 函數在 Go 中有效地實現此目的。

問題

給定一個文字文件,其中包含一系列 HTTP 請求和回應,目標是將這些元件解析為資料結構,特別是 Connection的切片

解決方案

利用上述函數提供了一種簡單的方法來解析文本文件中的請求和回應:

import (
    "bufio"
    "bytes"
    "fmt"
    "io"
    "io/ioutil"
    "log"
    "net/http"
    "net/http/httputil"
    "os"
)

type Connection struct {
    Request  *http.Request
    Response *http.Response
}

func ReadHTTPFromFile(r io.Reader) ([]Connection, error) {
    buf := bufio.NewReader(r)
    stream := make([]Connection, 0)

    for {
        req, err := http.ReadRequest(buf)
        if err == io.EOF {
            break
        }
        if err != nil {
            return stream, err
        }

        resp, err := http.ReadResponse(buf, req)
        if err != nil {
            return stream, err
        }

        // Save response body
        b := new(bytes.Buffer)
        io.Copy(b, resp.Body)
        resp.Body.Close()
        resp.Body = ioutil.NopCloser(b)

        stream = append(stream, Connection{Request: req, Response: resp})
    }
    return stream, nil
}
登入後複製

使用方法

要使用此功能,只需閱讀輸入文字即可將檔案寫入閱讀器並呼叫 ReadHTTPFromFile。此函數將傳回 Connection 實例的切片,其中每個連線代表一個請求及其關聯的回應。

f, err := os.Open("/tmp/test.http")
if err != nil {
    log.Fatal(err)
}
defer f.Close()
stream, err := ReadHTTPFromFile(f)
if err != nil {
    log.Fatalln(err)
}
登入後複製

附加說明

  • http.ReadRequest並且 http.ReadResponse 可以在同一個緩衝讀取器上重複調用,直到到達檔案結尾。
  • 確保相容性使用您的輸入文件,驗證它是否包含具有準確值的 Content-Length 標頭。
  • 如果您的輸入檔案包含截斷的回應(例如提供的範例中),您可以考慮使用 httputil.DumpResponse 來確保更準確的回應回應內容的綜合表示。

以上是如何在 Go 中解析文字檔案中的 HTTP 請求和回應?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板