Skip to content

Commit

Permalink
feat(reverseproxy): add support for 1xx status codes
Browse files Browse the repository at this point in the history
  • Loading branch information
dunglas committed Aug 8, 2022
1 parent 7f6a328 commit 43aff0a
Showing 1 changed file with 25 additions and 0 deletions.
25 changes: 25 additions & 0 deletions modules/caddyhttp/reverseproxy/reverseproxy.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,11 @@ import (
"io"
"net"
"net/http"
"net/http/httptrace"
"net/textproto"
"net/url"
"regexp"
"runtime"
"strconv"
"strings"
"sync"
Expand All @@ -40,7 +42,11 @@ import (
"golang.org/x/net/http/httpguts"
)

var supports1xx bool

func init() {
supports1xx = !regexp.MustCompile(`^go1\.1(?:7|8)\.`).Match([]byte(runtime.Version()))

caddy.RegisterModule(Handler{})
}

Expand Down Expand Up @@ -732,6 +738,25 @@ func (h *Handler) reverseProxy(rw http.ResponseWriter, req *http.Request, origRe
server := req.Context().Value(caddyhttp.ServerCtxKey).(*caddyhttp.Server)
shouldLogCredentials := server.Logs != nil && server.Logs.ShouldLogCredentials

if supports1xx {
// Forward 1xx status codes, backported from https://github.com/golang/go/pull/53164
trace := &httptrace.ClientTrace{
Got1xxResponse: func(code int, header textproto.MIMEHeader) error {
h := rw.Header()
copyHeader(h, http.Header(header))
rw.WriteHeader(code)

// Clear headers, it's not automatically done by ResponseWriter.WriteHeader() for 1xx responses
for k := range h {
delete(h, k)
}

return nil
},
}
req = req.WithContext(httptrace.WithClientTrace(req.Context(), trace))
}

// do the round-trip; emit debug log with values we know are
// safe, or if there is no error, emit fuller log entry
start := time.Now()
Expand Down

0 comments on commit 43aff0a

Please sign in to comment.