Skip to content

Commit

Permalink
Merge pull request #11 from base-org/gzip
Browse files Browse the repository at this point in the history
Add gzip compression on responses
  • Loading branch information
danyalprout authored Feb 27, 2024
2 parents c2304a5 + d87e315 commit 539dd71
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 28 deletions.
8 changes: 6 additions & 2 deletions api/service/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,9 @@ func (e httpError) Error() string {
}

const (
sszAcceptType = "application/octet-stream"
serverTimeout = 60 * time.Second
jsonAcceptType = "application/json"
sszAcceptType = "application/octet-stream"
serverTimeout = 60 * time.Second
)

var (
Expand Down Expand Up @@ -97,6 +98,7 @@ func NewAPI(dataStoreClient storage.DataStoreReader, beaconClient client.BeaconB
r.Use(middleware.Timeout(serverTimeout))
r.Use(middleware.Recoverer)
r.Use(middleware.Heartbeat("/healthz"))
r.Use(middleware.Compress(5, jsonAcceptType, sszAcceptType))

recorder := opmetrics.NewPromHTTPRecorder(metrics.Registry(), m.MetricsNamespace)
r.Use(func(handler http.Handler) http.Handler {
Expand Down Expand Up @@ -187,6 +189,7 @@ func (a *API) blobSidecarHandler(w http.ResponseWriter, r *http.Request) {
responseType := r.Header.Get("Accept")

if responseType == sszAcceptType {
w.Header().Set("Content-Type", sszAcceptType)
res, err := blobSidecars.MarshalSSZ()
if err != nil {
a.logger.Error("unable to marshal blob sidecars to SSZ", "err", err)
Expand All @@ -202,6 +205,7 @@ func (a *API) blobSidecarHandler(w http.ResponseWriter, r *http.Request) {
return
}
} else {
w.Header().Set("Content-Type", jsonAcceptType)
err := json.NewEncoder(w).Encode(blobSidecars)
if err != nil {
a.logger.Error("unable to encode blob sidecars to JSON", "err", err)
Expand Down
75 changes: 49 additions & 26 deletions api/service/api_test.go
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package service

import (
"compress/gzip"
"context"
"encoding/json"
"fmt"
"io"
"net/http/httptest"
"os"
"testing"
Expand Down Expand Up @@ -228,38 +230,59 @@ func TestAPIService(t *testing.T) {

for _, test := range tests {
for _, rf := range responseFormat {
t.Run(fmt.Sprintf("%s-%s", test.name, rf), func(t *testing.T) {
request := httptest.NewRequest("GET", test.path, nil)
request.Header.Set("Accept", rf)
for _, compress := range []bool{true, false} {
testName := fmt.Sprintf("%s-%s", test.name, rf)
if compress {
testName = fmt.Sprintf("%s-%s", testName, "gzip")
}

response := httptest.NewRecorder()
t.Run(testName, func(t *testing.T) {
request := httptest.NewRequest("GET", test.path, nil)
request.Header.Set("Accept", rf)

a.router.ServeHTTP(response, request)
if compress {
request.Header.Set("Accept-Encoding", "gzip")
}

require.Equal(t, test.status, response.Code)
response := httptest.NewRecorder()

if test.status == 200 && test.expected != nil {
blobSidecars := storage.BlobSidecars{}
a.router.ServeHTTP(response, request)

var err error
if rf == "application/octet-stream" {
res := api.BlobSidecars{}
err = res.UnmarshalSSZ(response.Body.Bytes())
blobSidecars.Data = res.Sidecars
} else {
err = json.Unmarshal(response.Body.Bytes(), &blobSidecars)
}
require.Equal(t, test.status, response.Code)

require.NoError(t, err)
require.Equal(t, *test.expected, blobSidecars)
} else if test.status != 200 && rf == "application/json" && test.errMessage != "" {
var e httpError
err := json.Unmarshal(response.Body.Bytes(), &e)
require.NoError(t, err)
require.Equal(t, test.status, e.Code)
require.Equal(t, test.errMessage, e.Message)
}
})
if test.status == 200 && test.expected != nil {
var data []byte
if compress {
reader, err := gzip.NewReader(response.Body)
require.NoError(t, err)

data, err = io.ReadAll(reader)
require.NoError(t, err)
} else {
data = response.Body.Bytes()
}

blobSidecars := storage.BlobSidecars{}

if rf == "application/octet-stream" {
res := api.BlobSidecars{}
err = res.UnmarshalSSZ(data)
blobSidecars.Data = res.Sidecars
} else {
err = json.Unmarshal(data, &blobSidecars)
}

require.NoError(t, err)
require.Equal(t, *test.expected, blobSidecars)
} else if test.status != 200 && rf == "application/json" && test.errMessage != "" {
var e httpError
err := json.Unmarshal(response.Body.Bytes(), &e)
require.NoError(t, err)
require.Equal(t, test.status, e.Code)
require.Equal(t, test.errMessage, e.Message)
}
})
}
}
}
}
Expand Down

0 comments on commit 539dd71

Please sign in to comment.