Skip to content

Commit

Permalink
fix: revert to old put/get handler behavior, and fix tests
Browse files Browse the repository at this point in the history
  • Loading branch information
samlaf committed Sep 19, 2024
1 parent 828242a commit 431b052
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 24 deletions.
22 changes: 15 additions & 7 deletions server/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -146,19 +146,23 @@ func (svr *Server) Health(w http.ResponseWriter, _ *http.Request) error {
return nil
}

// HandleGet handles the GET request for commitments.
// Note: even when an error is returned, the commitment meta is still returned,
// because it is needed for metrics (see the WithMetrics middleware).
// TODO: we should change this behavior and instead use a custom error that contains the commitment meta.
func (svr *Server) HandleGet(w http.ResponseWriter, r *http.Request) (commitments.CommitmentMeta, error) {
meta, err := ReadCommitmentMeta(r)
if err != nil {
err = fmt.Errorf("invalid commitment mode: %w", err)
svr.WriteBadRequest(w, err)
return commitments.CommitmentMeta{}, err
return meta, err
}
key := path.Base(r.URL.Path)
comm, err := commitments.StringToDecodedCommitment(key, meta.Mode)
if err != nil {
err = fmt.Errorf("failed to decode commitment from key %v (commitment mode %v): %w", key, meta.Mode, err)
svr.WriteBadRequest(w, err)
return commitments.CommitmentMeta{}, err
return meta, err
}

input, err := svr.router.Get(r.Context(), comm, meta.Mode)
Expand All @@ -169,26 +173,30 @@ func (svr *Server) HandleGet(w http.ResponseWriter, r *http.Request) (commitment
} else {
svr.WriteInternalError(w, err)
}
return commitments.CommitmentMeta{}, err
return meta, err
}

svr.WriteResponse(w, input)
return meta, nil
}

// HandlePut handles the PUT request for commitments.
// Note: even when an error is returned, the commitment meta is still returned,
// because it is needed for metrics (see the WithMetrics middleware).
// TODO: we should change this behavior and instead use a custom error that contains the commitment meta.
func (svr *Server) HandlePut(w http.ResponseWriter, r *http.Request) (commitments.CommitmentMeta, error) {
meta, err := ReadCommitmentMeta(r)
if err != nil {
err = fmt.Errorf("invalid commitment mode: %w", err)
svr.WriteBadRequest(w, err)
return commitments.CommitmentMeta{}, err
return meta, err
}

input, err := io.ReadAll(r.Body)
if err != nil {
err = fmt.Errorf("failed to read request body: %w", err)
svr.WriteBadRequest(w, err)
return commitments.CommitmentMeta{}, err
return meta, err
}

key := path.Base(r.URL.Path)
Expand All @@ -199,7 +207,7 @@ func (svr *Server) HandlePut(w http.ResponseWriter, r *http.Request) (commitment
if err != nil {
err = fmt.Errorf("failed to decode commitment from key %v (commitment mode %v): %w", key, meta.Mode, err)
svr.WriteBadRequest(w, err)
return commitments.CommitmentMeta{}, err
return meta, err
}
}

Expand All @@ -214,7 +222,7 @@ func (svr *Server) HandlePut(w http.ResponseWriter, r *http.Request) (commitment
if err != nil {
err = fmt.Errorf("failed to encode commitment %v (commitment mode %v): %w", commitment, meta.Mode, err)
svr.WriteInternalError(w, err)
return commitments.CommitmentMeta{}, err
return meta, err
}

svr.log.Info(fmt.Sprintf("write commitment: %x\n", comm))
Expand Down
47 changes: 30 additions & 17 deletions server/server_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ func TestGetHandler(t *testing.T) {
expectedCode: http.StatusInternalServerError,
expectedBody: "",
expectError: true,
expectedCommitmentMeta: commitments.CommitmentMeta{},
expectedCommitmentMeta: commitments.CommitmentMeta{Mode: commitments.OptimismGeneric, CertVersion: 0},
},
{
name: "Success - OP Keccak256",
Expand All @@ -107,7 +107,7 @@ func TestGetHandler(t *testing.T) {
expectedCode: http.StatusInternalServerError,
expectedBody: "",
expectError: true,
expectedCommitmentMeta: commitments.CommitmentMeta{},
expectedCommitmentMeta: commitments.CommitmentMeta{Mode: commitments.OptimismAltDA, CertVersion: 0},
},
{
name: "Success - OP Alt-DA",
Expand All @@ -129,13 +129,6 @@ func TestGetHandler(t *testing.T) {
req := httptest.NewRequest(http.MethodGet, tt.url, nil)
rec := httptest.NewRecorder()

t.Run("CheckMiddlewaresNoPanic", func(_ *testing.T) {
// we also run the request through the middlewares, to make sure no panic occurs
// could happen if there's a problem with the metrics. For eg, in the past we saw
// panic: inconsistent label cardinality: expected 3 label values but got 1 in []string{"GET"}
handler := WithLogging(WithMetrics(server.HandleGet, server.m), server.log)
handler(rec, req)
})
meta, err := server.HandleGet(rec, req)
if tt.expectError {
require.Error(t, err)
Expand All @@ -146,6 +139,20 @@ func TestGetHandler(t *testing.T) {
require.Equal(t, tt.expectedCode, rec.Code)
require.Equal(t, tt.expectedCommitmentMeta, meta)
require.Equal(t, tt.expectedBody, rec.Body.String())

})
}
for _, tt := range tests {
t.Run(tt.name+"/CheckMiddlewaresNoPanic", func(_ *testing.T) {
tt.mockBehavior()

req := httptest.NewRequest(http.MethodGet, tt.url, nil)
rec := httptest.NewRecorder()
// we also run the request through the middlewares, to make sure no panic occurs
// could happen if there's a problem with the metrics. For eg, in the past we saw
// panic: inconsistent label cardinality: expected 3 label values but got 1 in []string{"GET"}
handler := WithLogging(WithMetrics(server.HandleGet, server.m), server.log)
handler(rec, req)
})
}
}
Expand Down Expand Up @@ -261,14 +268,6 @@ func TestPutHandler(t *testing.T) {
req := httptest.NewRequest(http.MethodPut, tt.url, bytes.NewReader(tt.body))
rec := httptest.NewRecorder()

t.Run("CheckMiddlewaresNoPanic", func(_ *testing.T) {
// we also run the request through the middlewares, to make sure no panic occurs
// could happen if there's a problem with the metrics. For eg, in the past we saw
// panic: inconsistent label cardinality: expected 3 label values but got 1 in []string{"GET"}
handler := WithLogging(WithMetrics(server.HandleGet, server.m), server.log)
handler(rec, req)
})

meta, err := server.HandlePut(rec, req)
if tt.expectError {
require.Error(t, err)
Expand All @@ -282,4 +281,18 @@ func TestPutHandler(t *testing.T) {
require.Equal(t, tt.expectedCommitmentMeta, meta)
})
}

for _, tt := range tests {
t.Run(tt.name+"/CheckMiddlewaresNoPanic", func(_ *testing.T) {
tt.mockBehavior()

req := httptest.NewRequest(http.MethodGet, tt.url, nil)
rec := httptest.NewRecorder()
// we also run the request through the middlewares, to make sure no panic occurs
// could happen if there's a problem with the metrics. For eg, in the past we saw
// panic: inconsistent label cardinality: expected 3 label values but got 1 in []string{"GET"}
handler := WithLogging(WithMetrics(server.HandlePut, server.m), server.log)
handler(rec, req)
})
}
}

0 comments on commit 431b052

Please sign in to comment.