go/src/net
Paul Forgey 5f5a55679c net/http: refactor ResponseWriter.ReadFrom to permit splice on Linux
Rather than probe and guess if sendfile will work inside ResponseWriter.ReadFrom(src),
this change fixes the underlying issue of starting to respond before src is readable
We'll no longer send a status OK if a header has not yet been written and reading
from src is destined to fail. This small change implicitly takes care of the need for
the server to sniff the response body to determine the Content-Type.

This allows splice to work on Linux when src is a socket or any non-regular file that's spliceable.

The extra read of 512 bytes may raise an objection, and that's fair, but
we're already swapping some syscall prep work for another and a read of
512 probably will not impact the overall performance. For shorter
bodies, there's likely less setup time. A little initial slop is not too
unusual in zero copy network code, and sometimes actually helps.

Fixes #40888

Change-Id: I4a8e2ad0ace1318bae66dae5671d06ea6d4838ed
GitHub-Last-Rev: 097364ea86
GitHub-Pull-Request: golang/go#40903
Reviewed-on: https://go-review.googlesource.com/c/go/+/249238
Run-TryBot: Emmanuel Odeke <emm.odeke@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Emmanuel Odeke <emm.odeke@gmail.com>
2020-09-01 00:55:12 +00:00
..
http net/http: refactor ResponseWriter.ReadFrom to permit splice on Linux 2020-09-01 00:55:12 +00:00
internal/socktest all: remove the nacl port (part 1) 2019-10-09 06:14:44 +00:00
mail net/mail: return error on empty address list 2020-08-27 14:30:30 +00:00
rpc net/rpc: clarify documention of Call.Done field 2020-06-18 01:07:32 +00:00
smtp net/smtp: add missing error check in test 2019-11-11 21:56:37 +00:00
testdata net: use DNS over TCP when use-vc is set in resolv.conf 2019-04-18 18:51:13 +00:00
textproto net/textproto: correct documentation of empty line handling 2020-07-09 20:09:55 +00:00
url net/url: add URL.RawFragment, URL.EscapedFragment 2020-04-16 17:52:53 +00:00
addrselect.go net: add AIX operating system 2018-10-10 17:20:53 +00:00
addrselect_test.go
cgo_aix.go net: allow build on aix/ppc64 with cgo 2019-03-19 03:19:53 +00:00
cgo_android.go
cgo_bsd.go
cgo_linux.go
cgo_netbsd.go
cgo_openbsd.go
cgo_resnew.go
cgo_resold.go
cgo_socknew.go
cgo_sockold.go net: allow build on aix/ppc64 with cgo 2019-03-19 03:19:53 +00:00
cgo_solaris.go
cgo_stub.go net: remove non-cgo macOS resolver code 2019-06-06 19:56:56 +00:00
cgo_unix.go all: remove os.ErrTimeout 2019-08-02 17:57:18 +00:00
cgo_unix_test.go net: allow build on aix/ppc64 with cgo 2019-03-19 03:19:53 +00:00
cgo_windows.go
conf.go net: remove non-cgo macOS resolver code 2019-06-06 19:56:56 +00:00
conf_netcgo.go
conf_test.go
conn_test.go
dial.go os, net: define and use os.ErrDeadlineExceeded 2020-04-25 00:26:48 +00:00
dial_test.go os, net: define and use os.ErrDeadlineExceeded 2020-04-25 00:26:48 +00:00
dial_unix_test.go net: add AIX operating system 2018-10-10 17:20:53 +00:00
dnsclient.go all: move internal/x to vendor/golang.org/x and revendor using 'go mod vendor' 2019-03-11 20:28:54 +00:00
dnsclient_test.go all: avoid string(i) where i has type int 2020-02-26 04:38:19 +00:00
dnsclient_unix.go net: fix typo in unexported variable name 2020-02-27 05:56:21 +00:00
dnsclient_unix_test.go os, net: define and use os.ErrDeadlineExceeded 2020-04-25 00:26:48 +00:00
dnsconfig_unix.go net: use DNS over TCP when use-vc is set in resolv.conf 2019-04-18 18:51:13 +00:00
dnsconfig_unix_test.go net: use DNS over TCP when use-vc is set in resolv.conf 2019-04-18 18:51:13 +00:00
dnsname_test.go
error_plan9.go
error_plan9_test.go
error_posix.go all: remove the nacl port (part 1) 2019-10-09 06:14:44 +00:00
error_posix_test.go
error_test.go net: export ErrClosed 2020-08-26 22:48:00 +00:00
error_unix.go net: add AIX operating system 2018-10-10 17:20:53 +00:00
error_unix_test.go
error_windows.go
error_windows_test.go
example_test.go net: document concurrency safety and example for Dialer 2019-09-02 14:47:38 +00:00
external_test.go
fd_plan9.go
fd_posix.go net: merge common Unix/Windows methods 2020-03-20 00:49:34 +00:00
fd_unix.go net: merge common Unix/Windows methods 2020-03-20 00:49:34 +00:00
fd_windows.go net: merge common Unix/Windows methods 2020-03-20 00:49:34 +00:00
file.go all: remove the nacl port (part 1) 2019-10-09 06:14:44 +00:00
file_plan9.go net: add KeepAlive field to ListenConfig 2019-04-04 14:51:33 +00:00
file_stub.go all: remove the nacl port (part 1) 2019-10-09 06:14:44 +00:00
file_test.go all: remove the nacl port (part 1) 2019-10-09 06:14:44 +00:00
file_unix.go net: add KeepAlive field to ListenConfig 2019-04-04 14:51:33 +00:00
file_windows.go
hook.go net: enable TCP keepalives by default 2018-12-03 16:36:46 +00:00
hook_plan9.go
hook_unix.go all: remove the nacl port (part 1) 2019-10-09 06:14:44 +00:00
hook_windows.go
hosts.go
hosts_test.go
interface.go all: remove the nacl port (part 1) 2019-10-09 06:14:44 +00:00
interface_aix.go net: fix fd leak with interfaces on aix/ppc64 2019-03-05 15:11:20 +00:00
interface_bsd.go all: move internal/x to vendor/golang.org/x and revendor using 'go mod vendor' 2019-03-11 20:28:54 +00:00
interface_bsd_test.go net: update zoneCache on cache misses to cover appearing interfaces 2018-11-06 00:05:32 +00:00
interface_bsdvar.go all: move internal/x to vendor/golang.org/x and revendor using 'go mod vendor' 2019-03-11 20:28:54 +00:00
interface_darwin.go all: move internal/x to vendor/golang.org/x and revendor using 'go mod vendor' 2019-03-11 20:28:54 +00:00
interface_freebsd.go all: move internal/x to vendor/golang.org/x and revendor using 'go mod vendor' 2019-03-11 20:28:54 +00:00
interface_linux.go
interface_linux_test.go net: update zoneCache on cache misses to cover appearing interfaces 2018-11-06 00:05:32 +00:00
interface_plan9.go net: handle more interface types without a hardware address on Plan 9 2020-06-29 08:06:23 +00:00
interface_solaris.go all: move internal/x to vendor/golang.org/x and revendor using 'go mod vendor' 2019-03-11 20:28:54 +00:00
interface_stub.go all: remove the nacl port (part 1) 2019-10-09 06:14:44 +00:00
interface_test.go syscall: reenable sysctl on iOS 2019-10-23 15:12:15 +00:00
interface_unix_test.go all: fix typos 2019-09-08 17:28:20 +00:00
interface_windows.go syscall, internal/syscall/windows: remove utf16PtrToString parameter 2020-05-03 07:23:32 +00:00
ip.go net: update ParseIP doc to say IPv4-mapped-IPv6 is supported 2020-04-02 22:10:27 +00:00
ip_test.go Revert "net: halve the allocs in ParseCIDR by sharing slice backing" 2019-11-10 20:36:44 +00:00
iprawsock.go all: remove the nacl port (part 1) 2019-10-09 06:14:44 +00:00
iprawsock_plan9.go
iprawsock_posix.go all: remove the nacl port (part 1) 2019-10-09 06:14:44 +00:00
iprawsock_test.go
ipsock.go net: make cgo resolver work more accurately with network parameter 2018-10-25 03:14:03 +00:00
ipsock_plan9.go net: hangup TCP connection after Dial timeout in Plan 9 2020-07-10 11:32:36 +00:00
ipsock_plan9_test.go net: correct address when listening on IPv4zero tcp4/udp4 on Plan 9 2020-07-07 23:03:29 +00:00
ipsock_posix.go all: fix a bunch of misspellings 2019-11-15 21:04:43 +00:00
ipsock_test.go
listen_test.go all: remove the nacl port (part 1) 2019-10-09 06:14:44 +00:00
lookup.go net: add (*Resolver).LookupIP 2020-04-28 21:46:16 +00:00
lookup_fake.go all: remove the nacl port (part 1) 2019-10-09 06:14:44 +00:00
lookup_plan9.go net: fix lookupHost to return DNSError on Plan 9 2019-04-25 14:25:10 +00:00
lookup_test.go net: add (*Resolver).LookupIP 2020-04-28 21:46:16 +00:00
lookup_unix.go all: move internal/x to vendor/golang.org/x and revendor using 'go mod vendor' 2019-03-11 20:28:54 +00:00
lookup_windows.go syscall, internal/syscall/windows: remove utf16PtrToString parameter 2020-05-03 07:23:32 +00:00
lookup_windows_test.go net: fix resolving local windows machine ptr 2019-08-29 09:26:02 +00:00
mac.go net: use EUI-48/EUI-64 reserved address blocks for documentation 2019-02-27 02:36:14 +00:00
mac_test.go net: use EUI-48/EUI-64 reserved address blocks for documentation 2019-02-27 02:36:14 +00:00
main_cloexec_test.go
main_conf_test.go all: remove the nacl port (part 1) 2019-10-09 06:14:44 +00:00
main_noconf_test.go all: remove the nacl port (part 1) 2019-10-09 06:14:44 +00:00
main_plan9_test.go
main_posix_test.go
main_test.go
main_unix_test.go all: remove the nacl port (part 1) 2019-10-09 06:14:44 +00:00
main_windows_test.go
mockserver_test.go net: remove unixgram test sockets 2019-02-26 23:33:36 +00:00
net.go net: export ErrClosed 2020-08-26 22:48:00 +00:00
net_fake.go
net_test.go net: convert many Close tests to use parallel subtests 2020-04-09 15:10:48 +00:00
net_windows_test.go
netgo_unix_test.go net: make cgo resolver work more accurately with network parameter 2018-10-25 03:14:03 +00:00
nss.go net: add AIX operating system 2018-10-10 17:20:53 +00:00
nss_test.go
packetconn_test.go
parse.go
parse_test.go
pipe.go os, net: define and use os.ErrDeadlineExceeded 2020-04-25 00:26:48 +00:00
pipe_test.go all: move internal/x to vendor/golang.org/x and revendor using 'go mod vendor' 2019-03-11 20:28:54 +00:00
platform_test.go all: remove scattered remnants of darwin/arm 2020-04-08 18:35:49 +00:00
port.go
port_test.go
port_unix.go all: remove the nacl port (part 1) 2019-10-09 06:14:44 +00:00
protoconn_test.go
rawconn.go all: remove the nacl port (part 1) 2019-10-09 06:14:44 +00:00
rawconn_stub_test.go all: remove the nacl port (part 1) 2019-10-09 06:14:44 +00:00
rawconn_test.go os, net: define and use os.ErrDeadlineExceeded 2020-04-25 00:26:48 +00:00
rawconn_unix_test.go net: simplify error return in *RawConn test helpers 2020-08-18 08:47:18 +00:00
rawconn_windows_test.go net: simplify error return in *RawConn test helpers 2020-08-18 08:47:18 +00:00
sendfile_linux.go net: return poll.SendFile error from sendFile 2019-03-01 22:15:57 +00:00
sendfile_stub.go all: remove the nacl port (part 1) 2019-10-09 06:14:44 +00:00
sendfile_test.go all: remove the nacl port (part 1) 2019-10-09 06:14:44 +00:00
sendfile_unix_alt.go net: return poll.SendFile error from sendFile 2019-03-01 22:15:57 +00:00
sendfile_windows.go internal/poll: make SendFile work with large files on Windows 2019-09-26 06:16:42 +00:00
server_test.go net: convert TestTCPServer to use subtests 2019-10-22 17:34:15 +00:00
sock_bsd.go
sock_cloexec.go
sock_linux.go
sock_plan9.go
sock_posix.go all: remove the nacl port (part 1) 2019-10-09 06:14:44 +00:00
sock_stub.go all: remove the nacl port (part 1) 2019-10-09 06:14:44 +00:00
sock_windows.go
sockaddr_posix.go all: remove the nacl port (part 1) 2019-10-09 06:14:44 +00:00
sockopt_aix.go net: only enable broadcast on sockets which support it 2020-05-09 00:33:27 +00:00
sockopt_bsd.go net: only enable broadcast on sockets which support it 2020-05-09 00:33:27 +00:00
sockopt_linux.go net: only enable broadcast on sockets which support it 2020-05-09 00:33:27 +00:00
sockopt_plan9.go
sockopt_posix.go net: add AIX operating system 2018-10-10 17:20:53 +00:00
sockopt_solaris.go net: only enable broadcast on sockets which support it 2020-05-09 00:33:27 +00:00
sockopt_stub.go all: remove the nacl port (part 1) 2019-10-09 06:14:44 +00:00
sockopt_windows.go net: only enable broadcast on sockets which support it 2020-05-09 00:33:27 +00:00
sockoptip_bsdvar.go net: add AIX operating system 2018-10-10 17:20:53 +00:00
sockoptip_linux.go
sockoptip_posix.go net: add AIX operating system 2018-10-10 17:20:53 +00:00
sockoptip_stub.go all: remove the nacl port (part 1) 2019-10-09 06:14:44 +00:00
sockoptip_windows.go
splice_linux.go
splice_stub.go
splice_test.go net: pass TMPDIR to test client process 2019-04-07 18:55:23 +00:00
sys_cloexec.go all: remove the nacl port (part 1) 2019-10-09 06:14:44 +00:00
tcpsock.go all: remove the nacl port (part 1) 2019-10-09 06:14:44 +00:00
tcpsock_plan9.go net: fix multicast and IPv6 related issues on Plan 9 2019-10-16 17:46:16 +00:00
tcpsock_posix.go all: remove the nacl port (part 1) 2019-10-09 06:14:44 +00:00
tcpsock_test.go all: remove the nacl port (part 1) 2019-10-09 06:14:44 +00:00
tcpsock_unix_test.go
tcpsockopt_darwin.go net: avoid transiting durations through floats 2019-09-17 16:25:15 +00:00
tcpsockopt_dragonfly.go net: avoid transiting durations through floats 2019-09-17 16:25:15 +00:00
tcpsockopt_openbsd.go
tcpsockopt_plan9.go
tcpsockopt_posix.go net: add AIX operating system 2018-10-10 17:20:53 +00:00
tcpsockopt_solaris.go net: avoid transiting durations through floats 2019-09-17 16:25:15 +00:00
tcpsockopt_stub.go all: remove the nacl port (part 1) 2019-10-09 06:14:44 +00:00
tcpsockopt_unix.go net: avoid transiting durations through floats 2019-09-17 16:25:15 +00:00
tcpsockopt_windows.go net: avoid transiting durations through floats 2019-09-17 16:25:15 +00:00
timeout_test.go os, net: define and use os.ErrDeadlineExceeded 2020-04-25 00:26:48 +00:00
udpsock.go all: remove the nacl port (part 1) 2019-10-09 06:14:44 +00:00
udpsock_plan9.go net: fix multicast and IPv6 related issues on Plan 9 2019-10-16 17:46:16 +00:00
udpsock_plan9_test.go net: fix multicast and IPv6 related issues on Plan 9 2019-10-16 17:46:16 +00:00
udpsock_posix.go all: remove the nacl port (part 1) 2019-10-09 06:14:44 +00:00
udpsock_test.go all: remove the nacl port (part 1) 2019-10-09 06:14:44 +00:00
unixsock.go all: remove the nacl port (part 1) 2019-10-09 06:14:44 +00:00
unixsock_linux_test.go
unixsock_plan9.go
unixsock_posix.go all: remove the nacl port (part 1) 2019-10-09 06:14:44 +00:00
unixsock_test.go os, net: define and use os.ErrDeadlineExceeded 2020-04-25 00:26:48 +00:00
unixsock_windows_test.go net: skip TestUnixConnLocalWindows on windows/arm 2018-10-08 04:13:54 +00:00
write_unix_test.go
writev_test.go
writev_unix.go