51 lines
858 B
Go
51 lines
858 B
Go
package proxy
|
|
|
|
import (
|
|
"bytes"
|
|
"strings"
|
|
)
|
|
|
|
const maxPreviewBytes = 1024 * 64 // 64 kb (maybe we want 256kb)
|
|
|
|
type bodyPreview struct {
|
|
enabled bool
|
|
truncated bool
|
|
buf bytes.Buffer
|
|
}
|
|
|
|
func newBodyPreview(contentType string) *bodyPreview {
|
|
return &bodyPreview{enabled: canDisplayContent(contentType)}
|
|
}
|
|
|
|
func (p *bodyPreview) Write(data []byte) {
|
|
if p == nil || !p.enabled || len(data) == 0 {
|
|
return
|
|
}
|
|
|
|
remaining := maxPreviewBytes - p.buf.Len()
|
|
if remaining <= 0 {
|
|
p.truncated = true
|
|
return
|
|
}
|
|
|
|
if len(data) > remaining {
|
|
data = data[:remaining]
|
|
p.truncated = true
|
|
}
|
|
|
|
_, _ = p.buf.Write(data)
|
|
}
|
|
|
|
func (p *bodyPreview) Preview() []byte {
|
|
if p == nil || !p.enabled || p.buf.Len() == 0 {
|
|
return []byte{}
|
|
}
|
|
|
|
text := strings.ReplaceAll(p.buf.String(), "\n", "\\n")
|
|
if p.truncated {
|
|
text += "..."
|
|
}
|
|
|
|
return []byte(text)
|
|
}
|