GRUB has a bug where it waits a minimum of 400ms for every file it fetches over HTTP, unless the server serves it with Transfer-Encoding:chunked or the file just happens to be split into 20 TCP packets. When using pxeboot.img built with just pxe and http module (following instructions from
https://www.gnu.org/software/grub/manual/html_node/Network.html), this causes an initial text menu to take about 7 seconds to load with all the modules being dynamically fetched.
The SOB (statement of benefit?) of this patch is to fix this bug with the smallest change to existing data structures and logic.
GRUB specifically checks for existing connections that are attached to file objects when seeking and closes them. New file requests don't have any sockets attached, and so it always opens a new connection to fetch new files. Adding the Connection:close header does not reduce performance.
The alternate patch on that bug ticket is a larger change, involving changing a (module-internal) data structure. I was also less sure of the flow of logic in http_receive(), so I did not immediately suggest it. It seems that the GRUB project is understandably conservative about changes, so I first provided the change that would have the smallest side-effect.
I couched my phrasing with "I believe" and "I think" because I am not sure if I've fully understood the 3000+ lines of undocumented C code in net.c, netbuff.c, http.c, and tcp.c in only one week. I submitted this bug to bring a performance problem to your attention, and included a possible patch that fixes it for me, in the hope that someone on the project who is familiar with this code can review it and offer feedback.
If the suggestion is to instead implement a more complete implementation of Connection:keepalive, I can try that out and offer a rough patch to improve that. As a newcomer to this project, I would feel more comfortable contributing a small change to fix the problem immediately instead of a large possibly-breaking change.
Thank you!