@ -29,6 +29,7 @@ import (
"github.com/caddyserver/caddy/v2/modules/caddyhttp/reverseproxy"
"github.com/caddyserver/caddy/v2/modules/caddyhttp/reverseproxy"
"github.com/caddyserver/caddy/v2/modules/caddytls"
"github.com/caddyserver/caddy/v2/modules/caddytls"
"go.uber.org/zap"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"github.com/caddyserver/caddy/v2"
"github.com/caddyserver/caddy/v2"
)
)
@ -132,7 +133,7 @@ func (t Transport) RoundTrip(r *http.Request) (*http.Response, error) {
t . logger . Debug ( "roundtrip" ,
t . logger . Debug ( "roundtrip" ,
zap . Object ( "request" , caddyhttp . LoggableHTTPRequest { Request : r } ) ,
zap . Object ( "request" , caddyhttp . LoggableHTTPRequest { Request : r } ) ,
zap . String ( "dial" , address ) ,
zap . String ( "dial" , address ) ,
zap . Any ( "env" , env ) , // TODO: this uses reflection I think
zap . Object ( "env" , env ) ,
)
)
fcgiBackend , err := DialContext ( ctx , network , address )
fcgiBackend , err := DialContext ( ctx , network , address )
@ -171,10 +172,10 @@ func (t Transport) RoundTrip(r *http.Request) (*http.Response, error) {
}
}
// buildEnv returns a set of CGI environment variables for the request.
// buildEnv returns a set of CGI environment variables for the request.
func ( t Transport ) buildEnv ( r * http . Request ) ( map [ string ] string , error ) {
func ( t Transport ) buildEnv ( r * http . Request ) ( envVars , error ) {
repl := r . Context ( ) . Value ( caddy . ReplacerCtxKey ) . ( * caddy . Replacer )
repl := r . Context ( ) . Value ( caddy . ReplacerCtxKey ) . ( * caddy . Replacer )
var env map [ string ] string
var env envVars
// Separate remote IP and port; more lenient than net.SplitHostPort
// Separate remote IP and port; more lenient than net.SplitHostPort
var ip , port string
var ip , port string
@ -259,7 +260,7 @@ func (t Transport) buildEnv(r *http.Request) (map[string]string, error) {
// Some variables are unused but cleared explicitly to prevent
// Some variables are unused but cleared explicitly to prevent
// the parent environment from interfering.
// the parent environment from interfering.
env = map [ string ] string {
env = envVars {
// Variables defined in CGI 1.1 spec
// Variables defined in CGI 1.1 spec
"AUTH_TYPE" : "" , // Not used
"AUTH_TYPE" : "" , // Not used
"CONTENT_LENGTH" : r . Header . Get ( "Content-Length" ) ,
"CONTENT_LENGTH" : r . Header . Get ( "Content-Length" ) ,
@ -353,6 +354,16 @@ func (t Transport) splitPos(path string) int {
return - 1
return - 1
}
}
// envVars is a simple type to allow for speeding up zap log encoding.
type envVars map [ string ] string
func ( env envVars ) MarshalLogObject ( enc zapcore . ObjectEncoder ) error {
for k , v := range env {
enc . AddString ( k , v )
}
return nil
}
// Map of supported protocols to Apache ssl_mod format
// Map of supported protocols to Apache ssl_mod format
// Note that these are slightly different from SupportedProtocols in caddytls/config.go
// Note that these are slightly different from SupportedProtocols in caddytls/config.go
var tlsProtocolStrings = map [ uint16 ] string {
var tlsProtocolStrings = map [ uint16 ] string {
@ -366,6 +377,8 @@ var headerNameReplacer = strings.NewReplacer(" ", "_", "-", "_")
// Interface guards
// Interface guards
var (
var (
_ zapcore . ObjectMarshaler = ( * envVars ) ( nil )
_ caddy . Provisioner = ( * Transport ) ( nil )
_ caddy . Provisioner = ( * Transport ) ( nil )
_ http . RoundTripper = ( * Transport ) ( nil )
_ http . RoundTripper = ( * Transport ) ( nil )
)
)