Home >Backend Development >Golang >How to Parse HTTP Requests and Responses from Text Files in Go?

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

Patricia Arquette
Patricia ArquetteOriginal
2025-01-04 07:00:35316browse

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

Parsing HTTP Requests and Responses from Text Files in Go

When working with HTTP pipelined streams stored in text files, parsing the requests and responses is crucial for further processing. In this article, we'll explore how to effectively achieve this in Go using the http.ReadRequest and http.ReadResponse functions.

Problem

Given a text file containing a sequence of HTTP requests and responses, the goal is to parse these components into a data structure, specifically a slice of Connection instances.

Solution

Leveraging the aforementioned functions provides a straightforward approach to parsing both requests and responses from the text file:

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
}

Usage

To use this function, simply read the input text file into a reader and call ReadHTTPFromFile. The function will return a slice of Connection instances, where each connection represents a request and its associated response.

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)
}

Additional Notes

  • http.ReadRequest and http.ReadResponse can be repeatedly called on the same buffered reader until it reaches the end-of-file.
  • To ensure compatibility with your input file, verify that it includes the Content-Length header with accurate values.
  • If your input file contains truncated responses, such as in the example provided, you might consider using httputil.DumpResponse to ensure a more comprehensive representation of the response contents.

The above is the detailed content of How to Parse HTTP Requests and Responses from Text Files in Go?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn