[net] internal/http3: add Expect: 100-continue support to Server

3 views
Skip to first unread message

Nicholas Husin (Gerrit)

unread,
Feb 5, 2026, 5:45:20 PM (2 days ago) Feb 5
to Damien Neil, goph...@pubsubhelper.golang.org, golang-co...@googlegroups.com
Attention needed from Damien Neil

Nicholas Husin has uploaded the change for review

Nicholas Husin would like Damien Neil to review this change.

Commit message

internal/http3: add Expect: 100-continue support to Server

When serving a request containing the "Expect: 100-continue" header,
Server will now send an HTTP 100 status automatically if the request
body is read from within the server handler.

For golang/go#70914
Change-Id: Ib8185170deabf777a02487a1ded6671db720df51

Change diff

diff --git a/internal/http3/body.go b/internal/http3/body.go
index fc758bd..df06432 100644
--- a/internal/http3/body.go
+++ b/internal/http3/body.go
@@ -57,6 +57,10 @@
mu sync.Mutex
remain int64
err error
+ // If not nil, the body contains an "Expect: 100-continue" header, and
+ // send100Continue should be called when Read is invoked for the first
+ // time.
+ send100Continue func()
}

func (r *bodyReader) Read(p []byte) (n int, err error) {
@@ -65,6 +69,10 @@
// Use a mutex here to provide the same behavior.
r.mu.Lock()
defer r.mu.Unlock()
+ if r.send100Continue != nil {
+ r.send100Continue()
+ r.send100Continue = nil
+ }
if r.err != nil {
return 0, r.err
}
diff --git a/internal/http3/server.go b/internal/http3/server.go
index a6976c0..2818811 100644
--- a/internal/http3/server.go
+++ b/internal/http3/server.go
@@ -220,6 +220,15 @@
}
defer rw.close()

+ has100Continue := httpguts.HeaderValuesContainsToken(req.Header["Expect"], "100-continue")
+ if has100Continue {
+ delete(req.Header, "Expect")
+ req.Body.(*bodyReader).send100Continue = func() {
+ rw.WriteHeader(http.StatusContinue)
+ rw.Flush()
+ }
+ }
+
// TODO: handle panic coming from the HTTP handler.
sc.handler.ServeHTTP(rw, req)
return nil
@@ -238,11 +247,10 @@
}

type responseWriter struct {
- st *stream
- bw *bodyWriter
- mu sync.Mutex
- headers http.Header
- // TODO: support 1xx status
+ st *stream
+ bw *bodyWriter
+ mu sync.Mutex
+ headers http.Header
wroteHeader bool // Non-1xx header has been (logically) written.
isHeadResp bool // response is for a HEAD request.
}
@@ -278,7 +286,9 @@
rw.st.writeVarint(int64(frameTypeHeaders))
rw.st.writeVarint(int64(len(encHeaders)))
rw.st.Write(encHeaders)
- rw.wroteHeader = true
+ if statusCode >= http.StatusOK {
+ rw.wroteHeader = true
+ }
}

func (rw *responseWriter) WriteHeader(statusCode int) {
diff --git a/internal/http3/server_test.go b/internal/http3/server_test.go
index b7f195d..9b34709 100644
--- a/internal/http3/server_test.go
+++ b/internal/http3/server_test.go
@@ -263,6 +263,73 @@
})
}

+func TestServerExpect100Continue(t *testing.T) {
+ synctest.Test(t, func(t *testing.T) {
+ ts := newTestServer(t, http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ // Expect: 100-continue header should not be acceesible from the
+ // server handler.
+ if len(r.Header) > 0 {
+ t.Errorf("want request header to be empty, got %v", r.Header)
+ }
+ // Reading the body will cause the server to call w.WriteHeader(100).
+ body, err := io.ReadAll(r.Body)
+ if err != nil {
+ t.Fatal(err)
+ }
+ // Implicitly calls w.WriteHeader(200) since non-1XX status code
+ // has been sent yet so far.
+ w.Write(body)
+ }))
+ tc := ts.connect()
+ tc.greet()
+
+ // Client sends an Expect: 100-continue request.
+ reqStream := tc.newStream(streamTypeRequest)
+ reqStream.writeHeaders(http.Header{
+ ":method": {http.MethodGet},
+ "Expect": {"100-continue"},
+ })
+
+ // Wait until server responds with HTTP status 100 before sending the
+ // body.
+ synctest.Wait()
+ reqStream.wantHeaders(http.Header{":status": {"100"}})
+ body := []byte("body that will be echoed back if we get status 100")
+ reqStream.writeData(body)
+ reqStream.stream.stream.CloseWrite()
+
+ // Receive the server's response after sending the body.
+ reqStream.wantHeaders(http.Header{":status": {"200"}})
+ reqStream.wantData(body)
+ reqStream.wantClosed("request is complete")
+ })
+}
+
+func TestServerExpect100ContinueRejected(t *testing.T) {
+ synctest.Test(t, func(t *testing.T) {
+ rejectBody := []byte("not allowed")
+ ts := newTestServer(t, http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ w.WriteHeader(403)
+ w.Write(rejectBody)
+ }))
+ tc := ts.connect()
+ tc.greet()
+
+ // Client sends an Expect: 100-continue request.
+ reqStream := tc.newStream(streamTypeRequest)
+ reqStream.writeHeaders(http.Header{
+ ":method": {http.MethodGet},
+ "Expect": {"100-continue"},
+ })
+
+ // Server rejects it.
+ synctest.Wait()
+ reqStream.wantHeaders(http.Header{":status": {"403"}})
+ reqStream.wantData(rejectBody)
+ reqStream.wantClosed("request is complete")
+ })
+}
+
type testServer struct {
t testing.TB
s *Server

Change information

Files:
  • M internal/http3/body.go
  • M internal/http3/server.go
  • M internal/http3/server_test.go
Change size: M
Delta: 3 files changed, 91 insertions(+), 6 deletions(-)
Open in Gerrit

Related details

Attention is currently required from:
  • Damien Neil
Submit Requirements:
  • requirement is not satisfiedCode-Review
  • requirement satisfiedNo-Unresolved-Comments
  • requirement is not satisfiedReview-Enforcement
  • requirement is not satisfiedTryBots-Pass
Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
Gerrit-MessageType: newchange
Gerrit-Project: net
Gerrit-Branch: master
Gerrit-Change-Id: Ib8185170deabf777a02487a1ded6671db720df51
Gerrit-Change-Number: 742520
Gerrit-PatchSet: 1
Gerrit-Owner: Nicholas Husin <n...@golang.org>
Gerrit-Reviewer: Damien Neil <dn...@google.com>
Gerrit-Reviewer: Nicholas Husin <n...@golang.org>
Gerrit-Attention: Damien Neil <dn...@google.com>
unsatisfied_requirement
satisfied_requirement
open
diffy

Damien Neil (Gerrit)

unread,
Feb 6, 2026, 2:47:02 PM (11 hours ago) Feb 6
to Nicholas Husin, goph...@pubsubhelper.golang.org, Go LUCI, golang-co...@googlegroups.com
Attention needed from Nicholas Husin

Damien Neil added 5 comments

File internal/http3/server.go
Line 223, Patchset 2 (Latest): has100Continue := httpguts.HeaderValuesContainsToken(req.Header["Expect"], "100-continue")
Damien Neil . unresolved

I believe we can use x/net/internal/httpcommon.NewServerRequest here (or maybe in `parseRequest`), which will handle detection of 100-continue headers and a variety of other things which should be identical in the http/2 and http/3 cases.

Line 225, Patchset 2 (Latest): delete(req.Header, "Expect")
Damien Neil . resolved

Looks like we delete this header for HTTP/2 but not HTTP/1? Weird inconsistency, we should probably fix that someday. Matching HTTP/2 behavior seems fine here.

Line 230, Patchset 2 (Latest): }
Damien Neil . resolved

The HTTP/1 server sends a 417 Expectation Failed result for any unrecognized Expect header, but the HTTP/2 server seems not to. Another weird inconsistency, and again matching HTTP/2 behavior for now seems fine.

File internal/http3/server_test.go
Line 269, Patchset 2 (Latest): // Expect: 100-continue header should not be acceesible from the
Damien Neil . unresolved

typo: accessible

Line 296, Patchset 2 (Latest): reqStream.wantHeaders(http.Header{":status": {"100"}})
Damien Neil . unresolved

Let's also verify that the server does not send a 100 Continue before reading from the body.

We can do this by making the server handler block before the ReadAll and unblocking it after we check that the conn is idle. Alternatively, we could add something like `serverTester.nextHandlerCall` from x/net/http2. I think we're going to want something like nextHandlerCall in the future; it's a useful piece of infrastructure. It doesn't help all that much in this particular case, however, so up to you whether you want to take a diversion to implement it now.

Open in Gerrit

Related details

Attention is currently required from:
  • Nicholas Husin
Submit Requirements:
    • requirement is not satisfiedCode-Review
    • requirement is not satisfiedNo-Unresolved-Comments
    • requirement is not satisfiedReview-Enforcement
    • requirement satisfiedTryBots-Pass
    Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
    Gerrit-MessageType: comment
    Gerrit-Project: net
    Gerrit-Branch: master
    Gerrit-Change-Id: Ib8185170deabf777a02487a1ded6671db720df51
    Gerrit-Change-Number: 742520
    Gerrit-PatchSet: 2
    Gerrit-Owner: Nicholas Husin <n...@golang.org>
    Gerrit-Reviewer: Damien Neil <dn...@google.com>
    Gerrit-Reviewer: Nicholas Husin <n...@golang.org>
    Gerrit-Attention: Nicholas Husin <n...@golang.org>
    Gerrit-Comment-Date: Fri, 06 Feb 2026 19:46:58 +0000
    Gerrit-HasComments: Yes
    Gerrit-Has-Labels: No
    unsatisfied_requirement
    satisfied_requirement
    open
    diffy

    Nicholas Husin (Gerrit)

    unread,
    Feb 6, 2026, 6:33:39 PM (8 hours ago) Feb 6
    to goph...@pubsubhelper.golang.org, golang-co...@googlegroups.com
    Attention needed from Nicholas Husin

    Nicholas Husin uploaded new patchset

    Nicholas Husin uploaded patch set #3 to this change.
    Following approvals got outdated and were removed:
    • TryBots-Pass: LUCI-TryBot-Result+1 by Go LUCI
    Open in Gerrit

    Related details

    Attention is currently required from:
    • Nicholas Husin
    Submit Requirements:
      • requirement is not satisfiedCode-Review
      • requirement is not satisfiedNo-Unresolved-Comments
      • requirement is not satisfiedReview-Enforcement
      • requirement is not satisfiedTryBots-Pass
      Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
      Gerrit-MessageType: newpatchset
      Gerrit-Project: net
      Gerrit-Branch: master
      Gerrit-Change-Id: Ib8185170deabf777a02487a1ded6671db720df51
      Gerrit-Change-Number: 742520
      Gerrit-PatchSet: 3
      unsatisfied_requirement
      open
      diffy

      Nicholas Husin (Gerrit)

      unread,
      Feb 6, 2026, 6:36:35 PM (7 hours ago) Feb 6
      to goph...@pubsubhelper.golang.org, Go LUCI, Damien Neil, golang-co...@googlegroups.com
      Attention needed from Damien Neil

      Nicholas Husin added 4 comments

      File internal/http3/server.go
      Line 223, Patchset 2: has100Continue := httpguts.HeaderValuesContainsToken(req.Header["Expect"], "100-continue")
      Damien Neil . resolved

      I believe we can use x/net/internal/httpcommon.NewServerRequest here (or maybe in `parseRequest`), which will handle detection of 100-continue headers and a variety of other things which should be identical in the http/2 and http/3 cases.

      Nicholas Husin

      Thanks! NewServerRequest makes this a lot easier.

      Line 225, Patchset 2: delete(req.Header, "Expect")
      Damien Neil . resolved

      Looks like we delete this header for HTTP/2 but not HTTP/1? Weird inconsistency, we should probably fix that someday. Matching HTTP/2 behavior seems fine here.

      Nicholas Husin

      Huh, thanks for noting that. I'll add it to my TODO to fix these inconsistencies (and refer to both HTTP/1 and HTTP/2 for future changes).

      File internal/http3/server_test.go
      Line 269, Patchset 2: // Expect: 100-continue header should not be acceesible from the
      Damien Neil . resolved

      typo: accessible

      Nicholas Husin

      Oops, fixed.

      Line 296, Patchset 2: reqStream.wantHeaders(http.Header{":status": {"100"}})
      Damien Neil . resolved

      Let's also verify that the server does not send a 100 Continue before reading from the body.

      We can do this by making the server handler block before the ReadAll and unblocking it after we check that the conn is idle. Alternatively, we could add something like `serverTester.nextHandlerCall` from x/net/http2. I think we're going to want something like nextHandlerCall in the future; it's a useful piece of infrastructure. It doesn't help all that much in this particular case, however, so up to you whether you want to take a diversion to implement it now.

      Nicholas Husin

      Sounds good, done!

      I have `nextHandlerCall` implemented but didn't find it that useful here. I'll just stash it for now or send it as a separate change later.

      Open in Gerrit

      Related details

      Attention is currently required from:
      • Damien Neil
      Submit Requirements:
        • requirement is not satisfiedCode-Review
        • requirement satisfiedNo-Unresolved-Comments
        • requirement is not satisfiedReview-Enforcement
        • requirement is not satisfiedTryBots-Pass
        Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
        Gerrit-MessageType: comment
        Gerrit-Project: net
        Gerrit-Branch: master
        Gerrit-Change-Id: Ib8185170deabf777a02487a1ded6671db720df51
        Gerrit-Change-Number: 742520
        Gerrit-PatchSet: 3
        Gerrit-Owner: Nicholas Husin <n...@golang.org>
        Gerrit-Reviewer: Damien Neil <dn...@google.com>
        Gerrit-Reviewer: Nicholas Husin <n...@golang.org>
        Gerrit-Attention: Damien Neil <dn...@google.com>
        Gerrit-Comment-Date: Fri, 06 Feb 2026 23:36:31 +0000
        Gerrit-HasComments: Yes
        Gerrit-Has-Labels: No
        Comment-In-Reply-To: Damien Neil <dn...@google.com>
        unsatisfied_requirement
        satisfied_requirement
        open
        diffy

        Damien Neil (Gerrit)

        unread,
        Feb 6, 2026, 6:44:05 PM (7 hours ago) Feb 6
        to Nicholas Husin, goph...@pubsubhelper.golang.org, Go LUCI, golang-co...@googlegroups.com
        Attention needed from Nicholas Husin

        Damien Neil added 3 comments

        File internal/http3/server.go
        Line 167, Patchset 3 (Latest):func (sc *serverConn) parseHeader(st *stream) (http.Header, *pseudoHeader, error) {
        Damien Neil . unresolved

        Escape analysis and/or inlining might figure out that the *pseudoHeader return doesn't need to be allocated, but let's make this a non-pointer return to make it clear.

        File internal/http3/server_test.go
        Line 101, Patchset 3 (Latest): t.Errorf("want request header to be empty, got %v", r.Header)
        Damien Neil . unresolved

        Minor, but: Standard style is got, then want. (here and below)

        Line 107, Patchset 3 (Latest): t.Errorf("want 0.0.0.0:8080 host, got %v", r.Host)
        Damien Neil . unresolved

        want fake.tld:1234, not 0.0.0.0:8080

        Open in Gerrit

        Related details

        Attention is currently required from:
        • Nicholas Husin
        Submit Requirements:
          • requirement is not satisfiedCode-Review
          • requirement is not satisfiedNo-Unresolved-Comments
          • requirement is not satisfiedReview-Enforcement
          • requirement is not satisfiedTryBots-Pass
          Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
          Gerrit-MessageType: comment
          Gerrit-Project: net
          Gerrit-Branch: master
          Gerrit-Change-Id: Ib8185170deabf777a02487a1ded6671db720df51
          Gerrit-Change-Number: 742520
          Gerrit-PatchSet: 3
          Gerrit-Owner: Nicholas Husin <n...@golang.org>
          Gerrit-Reviewer: Damien Neil <dn...@google.com>
          Gerrit-Reviewer: Nicholas Husin <n...@golang.org>
          Gerrit-Attention: Nicholas Husin <n...@golang.org>
          Gerrit-Comment-Date: Fri, 06 Feb 2026 23:44:02 +0000
          Gerrit-HasComments: Yes
          Gerrit-Has-Labels: No
          unsatisfied_requirement
          open
          diffy

          Nicholas Husin (Gerrit)

          unread,
          Feb 6, 2026, 6:52:34 PM (7 hours ago) Feb 6
          to goph...@pubsubhelper.golang.org, golang-co...@googlegroups.com
          Attention needed from Nicholas Husin

          Nicholas Husin uploaded new patchset

          Nicholas Husin uploaded patch set #4 to this change.
          Open in Gerrit

          Related details

          Attention is currently required from:
          • Nicholas Husin
          Submit Requirements:
          • requirement is not satisfiedCode-Review
          • requirement is not satisfiedNo-Unresolved-Comments
          • requirement is not satisfiedReview-Enforcement
          • requirement is not satisfiedTryBots-Pass
          Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
          Gerrit-MessageType: newpatchset
          Gerrit-Project: net
          Gerrit-Branch: master
          Gerrit-Change-Id: Ib8185170deabf777a02487a1ded6671db720df51
          Gerrit-Change-Number: 742520
          Gerrit-PatchSet: 4
          unsatisfied_requirement
          open
          diffy

          Nicholas Husin (Gerrit)

          unread,
          Feb 6, 2026, 6:53:20 PM (7 hours ago) Feb 6
          to goph...@pubsubhelper.golang.org, Go LUCI, Damien Neil, golang-co...@googlegroups.com
          Attention needed from Damien Neil

          Nicholas Husin added 3 comments

          File internal/http3/server.go
          Line 167, Patchset 3:func (sc *serverConn) parseHeader(st *stream) (http.Header, *pseudoHeader, error) {
          Damien Neil . resolved

          Escape analysis and/or inlining might figure out that the *pseudoHeader return doesn't need to be allocated, but let's make this a non-pointer return to make it clear.

          Nicholas Husin

          Good point, done.

          File internal/http3/server_test.go
          Line 101, Patchset 3: t.Errorf("want request header to be empty, got %v", r.Header)
          Damien Neil . resolved

          Minor, but: Standard style is got, then want. (here and below)

          Nicholas Husin

          Oops, thanks. I seem to have remembered it as the other way around for a while now, ouch. Let me change it for all instances in this file for now...

          Line 107, Patchset 3: t.Errorf("want 0.0.0.0:8080 host, got %v", r.Host)
          Damien Neil . resolved

          want fake.tld:1234, not 0.0.0.0:8080

          Nicholas Husin

          Fixed, thanks.

          Open in Gerrit

          Related details

          Attention is currently required from:
          • Damien Neil
          Submit Requirements:
            • requirement is not satisfiedCode-Review
            • requirement satisfiedNo-Unresolved-Comments
            • requirement is not satisfiedReview-Enforcement
            • requirement is not satisfiedTryBots-Pass
            Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
            Gerrit-MessageType: comment
            Gerrit-Project: net
            Gerrit-Branch: master
            Gerrit-Change-Id: Ib8185170deabf777a02487a1ded6671db720df51
            Gerrit-Change-Number: 742520
            Gerrit-PatchSet: 4
            Gerrit-Owner: Nicholas Husin <n...@golang.org>
            Gerrit-Reviewer: Damien Neil <dn...@google.com>
            Gerrit-Reviewer: Nicholas Husin <n...@golang.org>
            Gerrit-Attention: Damien Neil <dn...@google.com>
            Gerrit-Comment-Date: Fri, 06 Feb 2026 23:53:16 +0000
            Gerrit-HasComments: Yes
            Gerrit-Has-Labels: No
            Comment-In-Reply-To: Damien Neil <dn...@google.com>
            unsatisfied_requirement
            satisfied_requirement
            open
            diffy

            Damien Neil (Gerrit)

            unread,
            Feb 6, 2026, 7:12:25 PM (7 hours ago) Feb 6
            to Nicholas Husin, goph...@pubsubhelper.golang.org, Go LUCI, golang-co...@googlegroups.com
            Attention needed from Nicholas Husin

            Damien Neil voted Code-Review+2

            Code-Review+2
            Open in Gerrit

            Related details

            Attention is currently required from:
            • Nicholas Husin
            Submit Requirements:
            • requirement satisfiedCode-Review
            • requirement satisfiedNo-Unresolved-Comments
            • requirement is not satisfiedReview-Enforcement
            • requirement satisfiedTryBots-Pass
            Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
            Gerrit-MessageType: comment
            Gerrit-Project: net
            Gerrit-Branch: master
            Gerrit-Change-Id: Ib8185170deabf777a02487a1ded6671db720df51
            Gerrit-Change-Number: 742520
            Gerrit-PatchSet: 4
            Gerrit-Owner: Nicholas Husin <n...@golang.org>
            Gerrit-Reviewer: Damien Neil <dn...@google.com>
            Gerrit-Reviewer: Nicholas Husin <n...@golang.org>
            Gerrit-Attention: Nicholas Husin <n...@golang.org>
            Gerrit-Comment-Date: Sat, 07 Feb 2026 00:12:21 +0000
            Gerrit-HasComments: No
            Gerrit-Has-Labels: Yes
            satisfied_requirement
            unsatisfied_requirement
            open
            diffy

            Nicholas Husin (Gerrit)

            unread,
            Feb 6, 2026, 7:19:51 PM (7 hours ago) Feb 6
            to Nicholas Husin, goph...@pubsubhelper.golang.org, Damien Neil, Go LUCI, golang-co...@googlegroups.com
            Attention needed from Nicholas Husin

            Nicholas Husin voted Code-Review+1

            Code-Review+1
            Open in Gerrit

            Related details

            Attention is currently required from:
            • Nicholas Husin
            Submit Requirements:
              • requirement satisfiedCode-Review
              • requirement satisfiedNo-Unresolved-Comments
              • requirement satisfiedReview-Enforcement
              • requirement satisfiedTryBots-Pass
              Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
              Gerrit-MessageType: comment
              Gerrit-Project: net
              Gerrit-Branch: master
              Gerrit-Change-Id: Ib8185170deabf777a02487a1ded6671db720df51
              Gerrit-Change-Number: 742520
              Gerrit-PatchSet: 4
              Gerrit-Owner: Nicholas Husin <n...@golang.org>
              Gerrit-Reviewer: Damien Neil <dn...@google.com>
              Gerrit-Reviewer: Nicholas Husin <hu...@google.com>
              Gerrit-Reviewer: Nicholas Husin <n...@golang.org>
              Gerrit-Attention: Nicholas Husin <n...@golang.org>
              Gerrit-Comment-Date: Sat, 07 Feb 2026 00:19:46 +0000
              Gerrit-HasComments: No
              Gerrit-Has-Labels: Yes
              satisfied_requirement
              open
              diffy

              Nicholas Husin (Gerrit)

              unread,
              Feb 6, 2026, 7:20:00 PM (7 hours ago) Feb 6
              to goph...@pubsubhelper.golang.org, golang-...@googlegroups.com, Nicholas Husin, Damien Neil, Go LUCI, golang-co...@googlegroups.com

              Nicholas Husin submitted the change

              Change information

              Commit message:
              internal/http3: add Expect: 100-continue support to Server

              When serving a request containing the "Expect: 100-continue" header,
              Server will now send an HTTP 100 status automatically if the request
              body is read from within the server handler.

              For golang/go#70914
              Change-Id: Ib8185170deabf777a02487a1ded6671db720df51
              Reviewed-by: Damien Neil <dn...@google.com>
              Reviewed-by: Nicholas Husin <hu...@google.com>
              Files:
                • M internal/http3/body.go
                • M internal/http3/server.go
                • M internal/http3/server_test.go
                • M internal/http3/transport_test.go
                Change size: L
                Delta: 4 files changed, 211 insertions(+), 46 deletions(-)
                Branch: refs/heads/master
                Submit Requirements:
                • requirement satisfiedCode-Review: +2 by Damien Neil, +1 by Nicholas Husin
                • requirement satisfiedTryBots-Pass: LUCI-TryBot-Result+1 by Go LUCI
                Open in Gerrit
                Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
                Gerrit-MessageType: merged
                Gerrit-Project: net
                Gerrit-Branch: master
                Gerrit-Change-Id: Ib8185170deabf777a02487a1ded6671db720df51
                Gerrit-Change-Number: 742520
                Gerrit-PatchSet: 5
                open
                diffy
                satisfied_requirement
                Reply all
                Reply to author
                Forward
                0 new messages