mirror of
https://github.com/OffchainLabs/prysm.git
synced 2026-01-08 23:18:15 -05:00
bugfix: ssz post-requests should check content type not accept (#13482)
* updating post requests that accept ssz to check content type instead of accept header * radek's review comments to make things more clear
This commit is contained in:
@@ -22,5 +22,6 @@ go_test(
|
||||
deps = [
|
||||
"//api:go_default_library",
|
||||
"//testing/assert:go_default_library",
|
||||
"//testing/require:go_default_library",
|
||||
],
|
||||
)
|
||||
|
||||
@@ -12,8 +12,8 @@ import (
|
||||
// match a number with optional decimals
|
||||
var priorityRegex = regexp.MustCompile(`q=(\d+(?:\.\d+)?)`)
|
||||
|
||||
// SszRequested takes a http request and checks to see if it should be requesting a ssz response.
|
||||
func SszRequested(req *http.Request) bool {
|
||||
// RespondWithSsz takes a http request and checks to see if it should be requesting a ssz response.
|
||||
func RespondWithSsz(req *http.Request) bool {
|
||||
accept := req.Header.Values("Accept")
|
||||
if len(accept) == 0 {
|
||||
return false
|
||||
@@ -51,3 +51,8 @@ func SszRequested(req *http.Request) bool {
|
||||
|
||||
return currentType == api.OctetStreamMediaType
|
||||
}
|
||||
|
||||
// IsRequestSsz checks if the request object should be interpreted as ssz
|
||||
func IsRequestSsz(req *http.Request) bool {
|
||||
return req.Header.Get("Content-Type") == api.OctetStreamMediaType
|
||||
}
|
||||
|
||||
@@ -1,88 +1,123 @@
|
||||
package httputil
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"testing"
|
||||
|
||||
"github.com/prysmaticlabs/prysm/v4/api"
|
||||
"github.com/prysmaticlabs/prysm/v4/testing/assert"
|
||||
"github.com/prysmaticlabs/prysm/v4/testing/require"
|
||||
)
|
||||
|
||||
func TestSSZRequested(t *testing.T) {
|
||||
func TestRespondWithSsz(t *testing.T) {
|
||||
t.Run("ssz_requested", func(t *testing.T) {
|
||||
request := httptest.NewRequest("GET", "http://foo.example", nil)
|
||||
request := httptest.NewRequest(http.MethodGet, "http://foo.example", nil)
|
||||
request.Header["Accept"] = []string{api.OctetStreamMediaType}
|
||||
result := SszRequested(request)
|
||||
result := RespondWithSsz(request)
|
||||
assert.Equal(t, true, result)
|
||||
})
|
||||
|
||||
t.Run("ssz_content_type_first", func(t *testing.T) {
|
||||
request := httptest.NewRequest("GET", "http://foo.example", nil)
|
||||
request.Header["Accept"] = []string{fmt.Sprintf("%s,%s", api.OctetStreamMediaType, api.JsonMediaType)}
|
||||
result := SszRequested(request)
|
||||
result := RespondWithSsz(request)
|
||||
assert.Equal(t, true, result)
|
||||
})
|
||||
|
||||
t.Run("ssz_content_type_preferred_1", func(t *testing.T) {
|
||||
request := httptest.NewRequest("GET", "http://foo.example", nil)
|
||||
request := httptest.NewRequest(http.MethodGet, "http://foo.example", nil)
|
||||
request.Header["Accept"] = []string{fmt.Sprintf("%s;q=0.9,%s", api.JsonMediaType, api.OctetStreamMediaType)}
|
||||
result := SszRequested(request)
|
||||
result := RespondWithSsz(request)
|
||||
assert.Equal(t, true, result)
|
||||
})
|
||||
|
||||
t.Run("ssz_content_type_preferred_2", func(t *testing.T) {
|
||||
request := httptest.NewRequest("GET", "http://foo.example", nil)
|
||||
request := httptest.NewRequest(http.MethodGet, "http://foo.example", nil)
|
||||
request.Header["Accept"] = []string{fmt.Sprintf("%s;q=0.95,%s;q=0.9", api.OctetStreamMediaType, api.JsonMediaType)}
|
||||
result := SszRequested(request)
|
||||
result := RespondWithSsz(request)
|
||||
assert.Equal(t, true, result)
|
||||
})
|
||||
|
||||
t.Run("other_content_type_preferred", func(t *testing.T) {
|
||||
request := httptest.NewRequest("GET", "http://foo.example", nil)
|
||||
request.Header["Accept"] = []string{fmt.Sprintf("%s,%s;q=0.9", api.JsonMediaType, api.OctetStreamMediaType)}
|
||||
result := SszRequested(request)
|
||||
result := RespondWithSsz(request)
|
||||
assert.Equal(t, false, result)
|
||||
})
|
||||
|
||||
t.Run("other_params", func(t *testing.T) {
|
||||
request := httptest.NewRequest("GET", "http://foo.example", nil)
|
||||
request := httptest.NewRequest(http.MethodGet, "http://foo.example", nil)
|
||||
request.Header["Accept"] = []string{fmt.Sprintf("%s,%s;q=0.9,otherparam=xyz", api.JsonMediaType, api.OctetStreamMediaType)}
|
||||
result := SszRequested(request)
|
||||
result := RespondWithSsz(request)
|
||||
assert.Equal(t, false, result)
|
||||
})
|
||||
|
||||
t.Run("no_header", func(t *testing.T) {
|
||||
request := httptest.NewRequest("GET", "http://foo.example", nil)
|
||||
result := SszRequested(request)
|
||||
request := httptest.NewRequest(http.MethodGet, "http://foo.example", nil)
|
||||
result := RespondWithSsz(request)
|
||||
assert.Equal(t, false, result)
|
||||
})
|
||||
|
||||
t.Run("empty_header", func(t *testing.T) {
|
||||
request := httptest.NewRequest("GET", "http://foo.example", nil)
|
||||
request := httptest.NewRequest(http.MethodGet, "http://foo.example", nil)
|
||||
request.Header["Accept"] = []string{}
|
||||
result := SszRequested(request)
|
||||
result := RespondWithSsz(request)
|
||||
assert.Equal(t, false, result)
|
||||
})
|
||||
|
||||
t.Run("empty_header_value", func(t *testing.T) {
|
||||
request := httptest.NewRequest("GET", "http://foo.example", nil)
|
||||
request := httptest.NewRequest(http.MethodGet, "http://foo.example", nil)
|
||||
request.Header["Accept"] = []string{""}
|
||||
result := SszRequested(request)
|
||||
result := RespondWithSsz(request)
|
||||
assert.Equal(t, false, result)
|
||||
})
|
||||
|
||||
t.Run("other_content_type", func(t *testing.T) {
|
||||
request := httptest.NewRequest("GET", "http://foo.example", nil)
|
||||
request := httptest.NewRequest(http.MethodGet, "http://foo.example", nil)
|
||||
request.Header["Accept"] = []string{"application/other"}
|
||||
result := SszRequested(request)
|
||||
result := RespondWithSsz(request)
|
||||
assert.Equal(t, false, result)
|
||||
})
|
||||
|
||||
t.Run("garbage", func(t *testing.T) {
|
||||
request := httptest.NewRequest("GET", "http://foo.example", nil)
|
||||
request := httptest.NewRequest(http.MethodGet, "http://foo.example", nil)
|
||||
request.Header["Accept"] = []string{"This is Sparta!!!"}
|
||||
result := SszRequested(request)
|
||||
result := RespondWithSsz(request)
|
||||
assert.Equal(t, false, result)
|
||||
})
|
||||
}
|
||||
|
||||
func TestIsRequestSsz(t *testing.T) {
|
||||
t.Run("ssz Post happy path", func(t *testing.T) {
|
||||
var body bytes.Buffer
|
||||
_, err := body.WriteString("something")
|
||||
require.NoError(t, err)
|
||||
request := httptest.NewRequest(http.MethodPost, "http://foo.example", &body)
|
||||
request.Header["Content-Type"] = []string{api.OctetStreamMediaType}
|
||||
result := IsRequestSsz(request)
|
||||
assert.Equal(t, true, result)
|
||||
})
|
||||
|
||||
t.Run("ssz Post missing header", func(t *testing.T) {
|
||||
request := httptest.NewRequest(http.MethodPost, "http://foo.example", nil)
|
||||
result := IsRequestSsz(request)
|
||||
assert.Equal(t, false, result)
|
||||
})
|
||||
|
||||
t.Run("ssz Post wrong content type", func(t *testing.T) {
|
||||
request := httptest.NewRequest(http.MethodPost, "http://foo.example", nil)
|
||||
request.Header["Content-Type"] = []string{"application/other"}
|
||||
result := IsRequestSsz(request)
|
||||
assert.Equal(t, false, result)
|
||||
})
|
||||
|
||||
t.Run("ssz Post json content type", func(t *testing.T) {
|
||||
request := httptest.NewRequest(http.MethodPost, "http://foo.example", nil)
|
||||
request.Header["Content-Type"] = []string{api.JsonMediaType}
|
||||
result := IsRequestSsz(request)
|
||||
assert.Equal(t, false, result)
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user