{{ message }}
Repository navigation
Log additional HTTP request headers when tracing - #6195
Merged
Merged
Conversation
At present, when the GIT_CURL_VERBOSE environment variable is set to a value such as "1" or "true", the Git LFS client outputs some of the details of each HTTP request and response it makes to its standard error stream. We gather the HTTP request headers to be logged in the traceRequest() method of the Client structure from our "lfshttp" package. To gather the headers, the traceRequest() method uses the DumpRequest() function from the from the "net/http/httputil" package in the Go standard library. Our use of the DumpRequest() function for this purpose dates back to commit 6fafade of PR git-lfs#366 in 2015, when it was first introduced into what was then the traceHttpRequest() function in our "lfs" package. This function gradually evolved into the current traceRequest() method through a series of PRs. First, portions of the "lfs" package were migrated into a new "httputil" package in PR git-lfs#1226. That package was later removed in PR git-lfs#1846 after a new "lfsapi" package was added in PR git-lfs#1794 with a version of the traceRequest() method very similar to the current one. Finally, in PR git-lfs#3244 we moved the method into the current "lfshttp" package. Throughout these changes, however, our use of the DumpRequest() function has remained the same. However, since the Git LFS client only acts as an HTTP client and not an HTTP server, we should instead be using the DumpRequestOut() function from the standard "httputil" package to gather the headers of an HTTP request for logging purposes. Replacing our use of the DumpRequest() function with the DumpRequestOut() function would allow us to output a number of request headers that we currently fail to log, as was noted with respect to the Accept-Encoding header in issue git-lfs#6193. Since Go version 1.6, the "httputil" package's documentation has stated that the DumpRequest() function "should only be used by servers to debug client requests", and that the DumpRequestOut() function "is like DumpRequest but for outgoing client requests": https://pkg.go.dev/net/http/httputil@go1.6#DumpRequest https://pkg.go.dev/net/http/httputil@go1.6#DumpRequestOut However, at the time we first adopted the use of the DumpRequest() function, the Go documentation did not include these directives, and merely noted that "DumpRequest returns the as-received wire representation of req, optionally including the request body, for debugging" and that "DumpRequestOut is like DumpRequest but includes headers that the standard http.Transport adds, such as User-Agent": https://pkg.go.dev/net/http/httputil@go1.4#DumpRequest https://pkg.go.dev/net/http/httputil@go1.4#DumpRequestOut It is reasonable to assume, therefore, that when PR git-lfs#366 was written its authors simply assumed that the DumpRequest() function was sufficient, given the state of the Go documentation at that time. As we would prefer to log a more complete set of client HTTP request headers, though, particularly the Accept-Encoding header which the Go "net/http" package automatically adds to outgoing requests, we now update our traceRequest() method to use the DumpRequestOut() function. We then also update some of our Go language TestVerbose*() test functions to confirm that the Accept-Encoding request header is now captured and reported when verbose logging is enabled. Note that without the change in this PR to the use of the DumpRequestOut() function, these revised tests would fail, since the Accept-Encoding header would not appear in headers returned by the DumpRequest() function.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.

This PR updates our trace logging so that we capture and report additional HTTP request headers, beyond the limited set we currently log.
Specifically, by replacing our use of the
DumpRequest()function from Go'snet/http/httputilpackage with theDumpRequestOut()function, our trace logs will now capture request headers such as theAccept-Encodingheader that are automatically added by Go'snet/httplibrary to all of our HTTP client requests. The absence of this header from our trace logs was noted recently in #6193.Background
At present, when the
GIT_CURL_VERBOSEenvironment variable is set to a value such as1ortrue, the Git LFS client outputs some of the details of each HTTP request and response it makes to its standard error stream.We gather the HTTP request headers to be logged in the
traceRequest()method of the Client structure from ourlfshttppackage. To gather the headers, thetraceRequest()method uses theDumpRequest()function from the from thenet/http/httputilpackage in the Go standard library.Our use of the
DumpRequest()function for this purpose dates back to commit 6fafade of PR #366 in 2015, when it was first introduced into what was then thetraceHttpRequest()function in ourlfspackage. This function gradually evolved into the currenttraceRequest()method through a series of PRs. First, portions of thelfspackage were migrated into a newhttputilpackage in PR #1226. That package was later removed in PR #1846 after a newlfsapipackage was added in PR #1794 with a version of thetraceRequest()method very similar to the current one. Finally, in PR #3244 we moved the method into the currentlfshttppackage.Throughout these changes, however, our use of the
DumpRequest()function has remained the same. However, since the Git LFS client only acts as an HTTP client and not an HTTP server, we should instead be using theDumpRequestOut()function from the standardhttputilpackage to gather the headers of an HTTP request for logging purposes.Since Go version 1.6, the
httputilpackage's documentation has stated that theDumpRequest()function "should only be used by servers to debug client requests", and that theDumpRequestOut()function "is like DumpRequest but for outgoing client requests."However, at the time we first adopted the use of the
DumpRequest()function, the Go documentation did not include these directives, and merely noted that "DumpRequest returns the as-received wire representation of req, optionally including the request body, for debugging" and that "DumpRequestOut is like DumpRequest but includes headers that the standard http.Transport adds, such as User-Agent."It is reasonable to assume, therefore, that when PR #366 was written its authors simply assumed that the
DumpRequest()function was sufficient, given the state of the Go documentation at that time.Change Details
As we would prefer to log a more complete set of client HTTP request headers, though, particularly the
Accept-Encodingheader which the Gonet/httppackage automatically adds to outgoing requests, we now update ourtraceRequest()method to use theDumpRequestOut()function.We then also update some of our Go language
TestVerbose*()test functions to confirm that theAccept-Encodingrequest header is now captured and reported when verbose logging is enabled. Note that without the change in this PR to the use of theDumpRequestOut()function, these revised tests would fail, since theAccept-Encodingheader would not appear in headers returned by theDumpRequest()function./cc @mzr as reporter in #6193