| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- package httputil
- import (
- "bytes"
- "compress/gzip"
- "compress/zlib"
- "net/http"
- "strings"
- "testing"
- "github.com/klauspost/compress/zstd"
- )
- const samplePayload = `{"model":"gpt-5.5","input":"hi","stream":false}`
- func newRequestWithBody(t *testing.T, body []byte, encoding string) *http.Request {
- t.Helper()
- req, err := http.NewRequest(http.MethodPost, "/v1/responses", bytes.NewReader(body))
- if err != nil {
- t.Fatalf("NewRequest: %v", err)
- }
- if encoding != "" {
- req.Header.Set("Content-Encoding", encoding)
- }
- req.ContentLength = int64(len(body))
- return req
- }
- func TestReadRequestBodyWithPrealloc_PassesThroughIdentity(t *testing.T) {
- req := newRequestWithBody(t, []byte(samplePayload), "")
- got, err := ReadRequestBodyWithPrealloc(req)
- if err != nil {
- t.Fatalf("unexpected error: %v", err)
- }
- if string(got) != samplePayload {
- t.Fatalf("body mismatch: got %q", got)
- }
- }
- func TestReadRequestBodyWithPrealloc_DecodesZstd(t *testing.T) {
- enc, _ := zstd.NewWriter(nil)
- compressed := enc.EncodeAll([]byte(samplePayload), nil)
- _ = enc.Close()
- req := newRequestWithBody(t, compressed, "zstd")
- got, err := ReadRequestBodyWithPrealloc(req)
- if err != nil {
- t.Fatalf("unexpected error: %v", err)
- }
- if string(got) != samplePayload {
- t.Fatalf("body mismatch: got %q", got)
- }
- if req.Header.Get("Content-Encoding") != "" {
- t.Fatalf("Content-Encoding should be cleared after decoding")
- }
- if req.ContentLength != int64(len(samplePayload)) {
- t.Fatalf("ContentLength not updated: %d", req.ContentLength)
- }
- }
- func TestReadRequestBodyWithPrealloc_DecodesGzip(t *testing.T) {
- var buf bytes.Buffer
- gw := gzip.NewWriter(&buf)
- if _, err := gw.Write([]byte(samplePayload)); err != nil {
- t.Fatalf("gzip write: %v", err)
- }
- if err := gw.Close(); err != nil {
- t.Fatalf("gzip close: %v", err)
- }
- req := newRequestWithBody(t, buf.Bytes(), "gzip")
- got, err := ReadRequestBodyWithPrealloc(req)
- if err != nil {
- t.Fatalf("unexpected error: %v", err)
- }
- if string(got) != samplePayload {
- t.Fatalf("body mismatch: got %q", got)
- }
- }
- func TestReadRequestBodyWithPrealloc_DecodesDeflate(t *testing.T) {
- var buf bytes.Buffer
- zw := zlib.NewWriter(&buf)
- if _, err := zw.Write([]byte(samplePayload)); err != nil {
- t.Fatalf("zlib write: %v", err)
- }
- if err := zw.Close(); err != nil {
- t.Fatalf("zlib close: %v", err)
- }
- req := newRequestWithBody(t, buf.Bytes(), "deflate")
- got, err := ReadRequestBodyWithPrealloc(req)
- if err != nil {
- t.Fatalf("unexpected error: %v", err)
- }
- if string(got) != samplePayload {
- t.Fatalf("body mismatch: got %q", got)
- }
- }
- func TestReadRequestBodyWithPrealloc_RejectsUnsupportedEncoding(t *testing.T) {
- req := newRequestWithBody(t, []byte(samplePayload), "br")
- _, err := ReadRequestBodyWithPrealloc(req)
- if err == nil {
- t.Fatal("expected error for unsupported encoding, got nil")
- }
- if !strings.Contains(err.Error(), "br") {
- t.Fatalf("error should mention encoding, got %v", err)
- }
- }
- func TestReadRequestBodyWithPrealloc_RejectsCorruptZstd(t *testing.T) {
- req := newRequestWithBody(t, []byte("not actually zstd"), "zstd")
- _, err := ReadRequestBodyWithPrealloc(req)
- if err == nil {
- t.Fatal("expected error for corrupt zstd body, got nil")
- }
- }
- func TestReadRequestBodyWithPrealloc_NilBody(t *testing.T) {
- req, err := http.NewRequest(http.MethodPost, "/v1/responses", nil)
- if err != nil {
- t.Fatalf("NewRequest: %v", err)
- }
- got, err := ReadRequestBodyWithPrealloc(req)
- if err != nil {
- t.Fatalf("unexpected error: %v", err)
- }
- if got != nil {
- t.Fatalf("expected nil body, got %q", got)
- }
- }
- func TestReadRequestBodyWithPrealloc_RespectsIdentityEncoding(t *testing.T) {
- req := newRequestWithBody(t, []byte(samplePayload), "identity")
- got, err := ReadRequestBodyWithPrealloc(req)
- if err != nil {
- t.Fatalf("unexpected error: %v", err)
- }
- if string(got) != samplePayload {
- t.Fatalf("body mismatch: got %q", got)
- }
- }
|