diff --git a/pkg/cloudevents/transport/http/transport.go b/pkg/cloudevents/transport/http/transport.go index 4b9500c10..e741a3cb7 100644 --- a/pkg/cloudevents/transport/http/transport.go +++ b/pkg/cloudevents/transport/http/transport.go @@ -546,13 +546,11 @@ func (t *Transport) ServeHTTP(w http.ResponseWriter, req *http.Request) { Body: body, }) if err != nil { - isErr := true + isFatal := true if txerr, ok := err.(*transport.ErrTransportMessageConversion); ok { - if !txerr.IsFatal() { - isErr = false - } + isFatal = txerr.IsFatal() } - if isErr { + if isFatal || event == nil { logger.Errorw("failed to convert http message to event", zap.Error(err)) w.WriteHeader(http.StatusBadRequest) _, _ = w.Write([]byte(fmt.Sprintf(`{"error":%q}`, err.Error()))) diff --git a/pkg/cloudevents/transport/http/transport_test.go b/pkg/cloudevents/transport/http/transport_test.go index fcdc610ca..df1be45a9 100644 --- a/pkg/cloudevents/transport/http/transport_test.go +++ b/pkg/cloudevents/transport/http/transport_test.go @@ -7,6 +7,7 @@ import ( "io/ioutil" "net" "net/http" + "net/http/httptest" "strings" "sync/atomic" "testing" @@ -220,3 +221,44 @@ func (h *namedHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { _, _ = w.Write([]byte(h.name)) h.next.ServeHTTP(w, r) } + +func TestServeHTTPSpecVersion(t *testing.T) { + tests := []struct { + specVersion string + expectedStatus int + }{ + { + // Missing specVersion -> HTTP 400 + specVersion: "", + expectedStatus: http.StatusBadRequest, + }, + { + // Valid request + specVersion: "0.3", + expectedStatus: http.StatusNoContent, + }, + { + // Future specVersion -> HTTP 400 + specVersion: "999999.99", + expectedStatus: http.StatusBadRequest, + }, + } + + for _, test := range tests { + t.Run(test.specVersion, func(t *testing.T) { + transport := &cehttp.Transport{} + req := httptest.NewRequest("GET", "/", nil) + req.Header.Set("ce-specversion", test.specVersion) + w := httptest.NewRecorder() + + transport.ServeHTTP(w, req) + + actualStatus := w.Result().StatusCode + if actualStatus != test.expectedStatus { + t.Errorf("actual status (%d) != expected status (%d)", actualStatus, test.expectedStatus) + t.Errorf("response body: %s", w.Body.String()) + } + }) + } + +}