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)
 	}