2018-11-14 12:18:03 +03:00
package accesslog
import (
"net/http"
"time"
"github.com/vulcand/oxy/utils"
)
// FieldApply function hook to add data in accesslog
type FieldApply func ( rw http . ResponseWriter , r * http . Request , next http . Handler , data * LogData )
// FieldHandler sends a new field to the logger.
type FieldHandler struct {
next http . Handler
name string
value string
applyFn FieldApply
}
// NewFieldHandler creates a Field handler.
func NewFieldHandler ( next http . Handler , name string , value string , applyFn FieldApply ) http . Handler {
return & FieldHandler { next : next , name : name , value : value , applyFn : applyFn }
}
func ( f * FieldHandler ) ServeHTTP ( rw http . ResponseWriter , req * http . Request ) {
table := GetLogData ( req )
if table == nil {
f . next . ServeHTTP ( rw , req )
return
}
table . Core [ f . name ] = f . value
if f . applyFn != nil {
f . applyFn ( rw , req , f . next , table )
} else {
f . next . ServeHTTP ( rw , req )
}
}
// AddServiceFields add service fields
func AddServiceFields ( rw http . ResponseWriter , req * http . Request , next http . Handler , data * LogData ) {
data . Core [ ServiceURL ] = req . URL // note that this is *not* the original incoming URL
data . Core [ ServiceAddr ] = req . URL . Host
2019-01-18 17:18:04 +03:00
next . ServeHTTP ( rw , req )
}
// AddOriginFields add origin fields
func AddOriginFields ( rw http . ResponseWriter , req * http . Request , next http . Handler , data * LogData ) {
2018-11-14 12:18:03 +03:00
crw := & captureResponseWriter { rw : rw }
start := time . Now ( ) . UTC ( )
next . ServeHTTP ( crw , req )
// use UTC to handle switchover of daylight saving correctly
data . Core [ OriginDuration ] = time . Now ( ) . UTC ( ) . Sub ( start )
data . Core [ OriginStatus ] = crw . Status ( )
// make copy of headers so we can ensure there is no subsequent mutation during response processing
data . OriginResponse = make ( http . Header )
utils . CopyHeaders ( data . OriginResponse , crw . Header ( ) )
data . Core [ OriginContentSize ] = crw . Size ( )
}