mirror of
https://github.com/tailscale/tailscale.git
synced 2025-12-13 10:31:57 +00:00
control/controlhttp: add AcceptHTTP hook to add coalesced Server->Client write
New plan for #5972. Instead of sending the public key in the clear
(from earlier unreleased 246274b8e9) where the client might have to
worry about it being dropped or tampered with and retrying, we'll
instead send it post-Noise handshake but before the HTTP/2 connection
begins.
This replaces the earlier extraHeaders hook with a different sort of
hook that allows us to combine two writes on the wire in one packet.
Updates #5972
Change-Id: I42cdf7c1859b53ca4dfa5610bd1b840c6986e09c
Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
This commit is contained in:
committed by
Brad Fitzpatrick
parent
c21a3c4733
commit
5e9e57ecf5
@@ -37,6 +37,8 @@ type httpTestParam struct {
|
||||
// makeHTTPHangAfterUpgrade makes the HTTP response hang after sending a
|
||||
// 101 switching protocols.
|
||||
makeHTTPHangAfterUpgrade bool
|
||||
|
||||
doEarlyWrite bool
|
||||
}
|
||||
|
||||
func TestControlHTTP(t *testing.T) {
|
||||
@@ -111,6 +113,11 @@ func TestControlHTTP(t *testing.T) {
|
||||
allowHTTP: true,
|
||||
},
|
||||
},
|
||||
// Early write
|
||||
{
|
||||
name: "early_write",
|
||||
doEarlyWrite: true,
|
||||
},
|
||||
}
|
||||
|
||||
for _, test := range tests {
|
||||
@@ -125,9 +132,21 @@ func testControlHTTP(t *testing.T, param httpTestParam) {
|
||||
client, server := key.NewMachine(), key.NewMachine()
|
||||
|
||||
const testProtocolVersion = 1
|
||||
const earlyWriteMsg = "Hello, world!"
|
||||
sch := make(chan serverResult, 1)
|
||||
handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
conn, err := AcceptHTTP(context.Background(), w, r, server, nil)
|
||||
var earlyWriteFn func(protocolVersion int, w io.Writer) error
|
||||
if param.doEarlyWrite {
|
||||
earlyWriteFn = func(protocolVersion int, w io.Writer) error {
|
||||
if protocolVersion != testProtocolVersion {
|
||||
t.Errorf("unexpected protocol version %d; want %d", protocolVersion, testProtocolVersion)
|
||||
return fmt.Errorf("unexpected protocol version %d; want %d", protocolVersion, testProtocolVersion)
|
||||
}
|
||||
_, err := io.WriteString(w, earlyWriteMsg)
|
||||
return err
|
||||
}
|
||||
}
|
||||
conn, err := AcceptHTTP(context.Background(), w, r, server, earlyWriteFn)
|
||||
if err != nil {
|
||||
log.Print(err)
|
||||
}
|
||||
@@ -228,6 +247,15 @@ func testControlHTTP(t *testing.T, param httpTestParam) {
|
||||
if proxy != nil && !proxy.ConnIsFromProxy(si.clientAddr) {
|
||||
t.Fatalf("client connected from %s, which isn't the proxy", si.clientAddr)
|
||||
}
|
||||
if param.doEarlyWrite {
|
||||
buf := make([]byte, len(earlyWriteMsg))
|
||||
if _, err := io.ReadFull(conn, buf); err != nil {
|
||||
t.Fatalf("reading early write: %v", err)
|
||||
}
|
||||
if string(buf) != earlyWriteMsg {
|
||||
t.Errorf("early write = %q; want %q", buf, earlyWriteMsg)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
type serverResult struct {
|
||||
|
||||
Reference in New Issue
Block a user