mirror of
https://github.com/buger/goreplay.git
synced 2024-04-21 12:32:02 +00:00
for easy readability check changes by their underlying commits! these benchmarks address the whole operation of the request cycle in goreplay. _**goos: linux goarch: amd64**_ **Using Compatible client:** ``` BenchmarkHTTPOutput-4 10417 118969 ns/op 12172 B/op 93 allocs/op BenchmarkHTTPOutputTLS-4 9136 132929 ns/op 12448 B/op 97 allocs/op ``` **Using non-compatible client** ``` BenchmarkHTTPOutput-4 859 1175040 ns/op 15598 B/op 46 allocs/op BenchmarkHTTPOutputTLS-4 880 1189643 ns/op 15544 B/op 52 allocs/op ``` Binary size reduced: **7%** from these benchmarks, we may trade allocations with performance and memory!
71 lines
1.5 KiB
Go
71 lines
1.5 KiB
Go
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"compress/gzip"
|
|
"fmt"
|
|
"io/ioutil"
|
|
"net/http/httputil"
|
|
"strconv"
|
|
|
|
"github.com/buger/goreplay/proto"
|
|
)
|
|
|
|
func prettifyHTTP(p []byte) []byte {
|
|
headSize := bytes.IndexByte(p, '\n') + 1
|
|
head := p[:headSize]
|
|
body := p[headSize:]
|
|
|
|
tEnc := bytes.Equal(proto.Header(body, []byte("Transfer-Encoding")), []byte("chunked"))
|
|
cEnc := bytes.Equal(proto.Header(body, []byte("Content-Encoding")), []byte("gzip"))
|
|
|
|
if !(tEnc || cEnc) {
|
|
return p
|
|
}
|
|
|
|
headersPos := proto.MIMEHeadersEndPos(body)
|
|
|
|
if headersPos < 5 || headersPos > len(body) {
|
|
return p
|
|
}
|
|
|
|
headers := body[:headersPos]
|
|
content := body[headersPos:]
|
|
|
|
if tEnc {
|
|
buf := bytes.NewReader(content)
|
|
r := httputil.NewChunkedReader(buf)
|
|
content, _ = ioutil.ReadAll(r)
|
|
|
|
headers = proto.DeleteHeader(headers, []byte("Transfer-Encoding"))
|
|
|
|
newLen := strconv.Itoa(len(content))
|
|
headers = proto.SetHeader(headers, []byte("Content-Length"), []byte(newLen))
|
|
}
|
|
|
|
if cEnc {
|
|
buf := bytes.NewReader(content)
|
|
g, err := gzip.NewReader(buf)
|
|
|
|
if err != nil {
|
|
Debug(1, "[Prettifier] GZIP encoding error:", err)
|
|
return []byte{}
|
|
}
|
|
|
|
content, err = ioutil.ReadAll(g)
|
|
if err != nil {
|
|
Debug(1, fmt.Sprintf("[HTTP-PRETTIFIER] %q", err))
|
|
return p
|
|
}
|
|
|
|
headers = proto.DeleteHeader(headers, []byte("Content-Encoding"))
|
|
|
|
newLen := strconv.Itoa(len(content))
|
|
headers = proto.SetHeader(headers, []byte("Content-Length"), []byte(newLen))
|
|
}
|
|
|
|
newPayload := append(append(head, headers...), content...)
|
|
|
|
return newPayload
|
|
}
|