diff --git a/network/client.go b/network/client.go index c5c2d6c205bdb3eb8ee05398b5f5e8540e2989c2..310288775713e0b8bdca9700d9a3b69a30724ecd 100644 --- a/network/client.go +++ b/network/client.go @@ -23,8 +23,8 @@ import ( "github.com/jpillora/backoff" "github.com/sirupsen/logrus" - "gitlab.com/gitlab-org/gitlab-runner/common" + "gitlab.com/gitlab-org/gitlab-runner/helpers" ) type requestCredentials interface { @@ -251,6 +251,9 @@ func (n *client) do(uri, method string, request io.Reader, requestType string, h return } + reqID, _ := helpers.GenerateRandomUUID(10) + dumpRequestBody(reqID, method, url, request) + req, err := http.NewRequest(method, url.String(), request) if err != nil { err = fmt.Errorf("failed to create NewRequest: %v", err) @@ -269,9 +272,58 @@ func (n *client) do(uri, method string, request io.Reader, requestType string, h n.ensureTLSConfig() res, err = n.doBackoffRequest(req) + + dumpResponseBody(reqID, method, url, res) + return } +func dumpRequestBody(reqID string, method string, url *url.URL, request io.Reader) { + if logrus.GetLevel() < logrus.DebugLevel || request == nil { + return + } + + req, ok := request.(*bytes.Reader) + if !ok { + return + } + + body, err := ioutil.ReadAll(req) + req.Reset(body) + + if err == nil { + logrus.WithFields(logrus.Fields{ + "reqID": reqID, + "Method": method, + "URI": url.String(), + }).Debugf("Sending request: %s", string(body)) + } else { + logrus.WithError(err).Debug("Error while LOGGING sent request.") + } +} + +func dumpResponseBody(reqID string, method string, url *url.URL, response *http.Response) { + if logrus.GetLevel() < logrus.DebugLevel || response == nil || response.Body == nil { + return + } + + body, err := ioutil.ReadAll(response.Body) + response.Body.Close() + response.Body = ioutil.NopCloser(bytes.NewReader(body)) + + if err == nil { + logrus.WithFields(logrus.Fields{ + "reqID": reqID, + "Method": method, + "URI": url.String(), + "StatusCode": response.StatusCode, + "Status": response.Status, + }).Debugf("Received response: %s", string(body)) + } else { + logrus.WithError(err).Debug("Error while LOGGING received response.") + } +} + func (n *client) doJSON(uri, method string, statusCode int, request interface{}, response interface{}) (int, string, ResponseTLSData, *http.Response) { var body io.Reader diff --git a/network/gitlab_test.go b/network/gitlab_test.go index ae6089c0a84929491977bcfbb4a58f24d1bca113..82aaf834d5003c5a0016111add4b1ddb4be0fe38 100644 --- a/network/gitlab_test.go +++ b/network/gitlab_test.go @@ -13,6 +13,7 @@ import ( "strings" "testing" + "github.com/sirupsen/logrus" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" @@ -118,7 +119,18 @@ func testRegisterRunnerHandler(w http.ResponseWriter, r *http.Request, t *testin w.Write(output) } +func setLogrusDebug() func() { + oldLevel := logrus.GetLevel() + logrus.SetLevel(logrus.DebugLevel) + + return func() { + logrus.SetLevel(oldLevel) + } +} + func TestRegisterRunner(t *testing.T) { + defer setLogrusDebug()() + s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { testRegisterRunnerHandler(w, r, t) })) @@ -188,6 +200,8 @@ func testUnregisterRunnerHandler(w http.ResponseWriter, r *http.Request, t *test } func TestUnregisterRunner(t *testing.T) { + defer setLogrusDebug()() + handler := func(w http.ResponseWriter, r *http.Request) { testUnregisterRunnerHandler(w, r, t) }