Fix early write
Because some clients fail receiving a response before the body is sent entirely. See https://github.com/openHPI/poseidon/issues/54
This commit is contained in:
@@ -8,6 +8,7 @@ import (
|
|||||||
"github.com/openHPI/poseidon/internal/config"
|
"github.com/openHPI/poseidon/internal/config"
|
||||||
"github.com/openHPI/poseidon/internal/runner"
|
"github.com/openHPI/poseidon/internal/runner"
|
||||||
"github.com/openHPI/poseidon/pkg/dto"
|
"github.com/openHPI/poseidon/pkg/dto"
|
||||||
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
)
|
)
|
||||||
@@ -131,6 +132,12 @@ func (r *RunnerController) findRunnerMiddleware(next http.Handler) http.Handler
|
|||||||
runnerID := mux.Vars(request)[RunnerIDKey]
|
runnerID := mux.Vars(request)[RunnerIDKey]
|
||||||
targetRunner, err := r.manager.Get(runnerID)
|
targetRunner, err := r.manager.Get(runnerID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
// We discard the request body because an early write causes errors for some clients.
|
||||||
|
// See https://github.com/openHPI/poseidon/issues/54
|
||||||
|
_, readErr := io.ReadAll(request.Body)
|
||||||
|
if readErr != nil {
|
||||||
|
log.WithError(readErr).Warn("Failed to discard the request body")
|
||||||
|
}
|
||||||
writeNotFound(writer, err)
|
writeNotFound(writer, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@@ -17,6 +17,8 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const invalidID = "some-invalid-runner-id"
|
||||||
|
|
||||||
type MiddlewareTestSuite struct {
|
type MiddlewareTestSuite struct {
|
||||||
suite.Suite
|
suite.Suite
|
||||||
manager *runner.ManagerMock
|
manager *runner.ManagerMock
|
||||||
@@ -67,7 +69,6 @@ func (s *MiddlewareTestSuite) TestFindRunnerMiddlewareIfRunnerExists() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s *MiddlewareTestSuite) TestFindRunnerMiddlewareIfRunnerDoesNotExist() {
|
func (s *MiddlewareTestSuite) TestFindRunnerMiddlewareIfRunnerDoesNotExist() {
|
||||||
invalidID := "some-invalid-runner-id"
|
|
||||||
s.manager.On("Get", invalidID).Return(nil, runner.ErrRunnerNotFound)
|
s.manager.On("Get", invalidID).Return(nil, runner.ErrRunnerNotFound)
|
||||||
|
|
||||||
recorder := httptest.NewRecorder()
|
recorder := httptest.NewRecorder()
|
||||||
@@ -76,6 +77,22 @@ func (s *MiddlewareTestSuite) TestFindRunnerMiddlewareIfRunnerDoesNotExist() {
|
|||||||
s.Equal(http.StatusNotFound, recorder.Code)
|
s.Equal(http.StatusNotFound, recorder.Code)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *MiddlewareTestSuite) TestFindRunnerMiddlewareDoesNotEarlyRespond() {
|
||||||
|
body := strings.NewReader(strings.Repeat("A", 798968))
|
||||||
|
|
||||||
|
path, err := s.router.Get("test-runner-id").URL(RunnerIDKey, invalidID)
|
||||||
|
s.Require().NoError(err)
|
||||||
|
request, err := http.NewRequest(http.MethodPost, path.String(), body)
|
||||||
|
s.Require().NoError(err)
|
||||||
|
|
||||||
|
s.manager.On("Get", mock.AnythingOfType("string")).Return(nil, runner.ErrRunnerNotFound)
|
||||||
|
recorder := httptest.NewRecorder()
|
||||||
|
s.router.ServeHTTP(recorder, request)
|
||||||
|
|
||||||
|
s.Equal(http.StatusNotFound, recorder.Code)
|
||||||
|
s.Equal(0, body.Len()) // No data should be unread
|
||||||
|
}
|
||||||
|
|
||||||
func TestRunnerRouteTestSuite(t *testing.T) {
|
func TestRunnerRouteTestSuite(t *testing.T) {
|
||||||
suite.Run(t, new(RunnerRouteTestSuite))
|
suite.Run(t, new(RunnerRouteTestSuite))
|
||||||
}
|
}
|
||||||
@@ -261,7 +278,6 @@ func (s *UpdateFileSystemRouteTestSuite) TestUpdateFileSystemReturnsBadRequestOn
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s *UpdateFileSystemRouteTestSuite) TestUpdateFileSystemToNonExistingRunnerReturnsNotFound() {
|
func (s *UpdateFileSystemRouteTestSuite) TestUpdateFileSystemToNonExistingRunnerReturnsNotFound() {
|
||||||
invalidID := "some-invalid-runner-id"
|
|
||||||
s.runnerManager.On("Get", invalidID).Return(nil, runner.ErrRunnerNotFound)
|
s.runnerManager.On("Get", invalidID).Return(nil, runner.ErrRunnerNotFound)
|
||||||
path, err := s.router.Get(UpdateFileSystemPath).URL(RunnerIDKey, invalidID)
|
path, err := s.router.Get(UpdateFileSystemPath).URL(RunnerIDKey, invalidID)
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
|
Reference in New Issue
Block a user