| 12 | ) |
| 13 | |
| 14 | func prettifyHTTP(p []byte) []byte { |
| 15 | |
| 16 | tEnc := bytes.Equal(proto.Header(p, []byte("Transfer-Encoding")), []byte("chunked")) |
| 17 | cEnc := bytes.Equal(proto.Header(p, []byte("Content-Encoding")), []byte("gzip")) |
| 18 | |
| 19 | if !(tEnc || cEnc) { |
| 20 | return p |
| 21 | } |
| 22 | |
| 23 | headersPos := proto.MIMEHeadersEndPos(p) |
| 24 | |
| 25 | if headersPos < 5 || headersPos > len(p) { |
| 26 | return p |
| 27 | } |
| 28 | |
| 29 | headers := p[:headersPos] |
| 30 | content := p[headersPos:] |
| 31 | |
| 32 | if tEnc { |
| 33 | buf := bytes.NewReader(content) |
| 34 | r := httputil.NewChunkedReader(buf) |
| 35 | content, _ = ioutil.ReadAll(r) |
| 36 | |
| 37 | headers = proto.DeleteHeader(headers, []byte("Transfer-Encoding")) |
| 38 | |
| 39 | newLen := strconv.Itoa(len(content)) |
| 40 | headers = proto.SetHeader(headers, []byte("Content-Length"), []byte(newLen)) |
| 41 | } |
| 42 | |
| 43 | if cEnc { |
| 44 | buf := bytes.NewReader(content) |
| 45 | g, err := gzip.NewReader(buf) |
| 46 | |
| 47 | if err != nil { |
| 48 | Debug(1, "[Prettifier] GZIP encoding error:", err) |
| 49 | return []byte{} |
| 50 | } |
| 51 | |
| 52 | content, err = ioutil.ReadAll(g) |
| 53 | if err != nil { |
| 54 | Debug(1, fmt.Sprintf("[HTTP-PRETTIFIER] %q", err)) |
| 55 | return p |
| 56 | } |
| 57 | |
| 58 | headers = proto.DeleteHeader(headers, []byte("Content-Encoding")) |
| 59 | |
| 60 | newLen := strconv.Itoa(len(content)) |
| 61 | headers = proto.SetHeader(headers, []byte("Content-Length"), []byte(newLen)) |
| 62 | } |
| 63 | |
| 64 | newPayload := append(headers, content...) |
| 65 | |
| 66 | return newPayload |
| 67 | } |