以编程方式重播原始HTTP请求



我在文本文件中有一些原始的POSTGET请求。例如:

GET /images HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Connection: close

我想从一个文本文件加载这个原始HTTP请求,并以编程方式重播它。我正在考虑逐行读取请求,并用req.Header.Set("name", "value")为每行设置一个标题。但是当我试图解析一个包含JSON主体的POST请求时,事情变得很奇怪。

有没有一种简单的方法可以做到这一点?

这似乎做到了:

package main
import (
"bufio"
"net/http"
"strings"
)
func readRequest(raw, scheme string) (*http.Request, error) {
r, err := http.ReadRequest(bufio.NewReader(strings.NewReader(raw)))
if err != nil { return nil, err }
r.RequestURI, r.URL.Scheme, r.URL.Host = "", scheme, r.Host
return r, nil
}
func main() {
raw := `GET /images HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Connection: close
`
req, err := readRequest(raw, "http")
if err != nil {
panic(err)
}
new(http.Client).Do(req)
}

https://golang.org/pkg/net/http#ReadRequest

最新更新