Log additional HTTP request headers when tracing by chrisd8088 · Pull Request #6195 · git-lfs/git-lfs · GitHub
Skip to content

Log additional HTTP request headers when tracing - #6195

Merged
chrisd8088 merged 2 commits into
git-lfs:mainfrom
chrisd8088:increase-http-verbosity
Jan 24, 2026
Merged

chrisd8088 merged 2 commits into
git-lfs:mainfrom
chrisd8088:increase-http-verbosity

Conversation

@chrisd8088

Copy link
Copy Markdown
Member

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's net/http/httputil package with the DumpRequestOut() function, our trace logs will now capture request headers such as the Accept-Encoding header that are automatically added by Go's net/http library 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_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 #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 #1226. That package was later removed in PR #1846 after a new lfsapi package was added in PR #1794 with a version of the traceRequest() method very similar to the current one. Finally, in PR #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.

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."

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-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.

/cc @mzr as reporter in #6193

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.

@larsxschneider larsxschneider left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

😍

@chrisd8088
chrisd8088 merged commit bb65882 into git-lfs:main Jan 24, 2026
19 of 20 checks passed
@chrisd8088
chrisd8088 deleted the increase-http-verbosity branch January 24, 2026 19:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants