mirror of
https://github.com/foomo/sesamy-go.git
synced 2025-10-16 12:35:43 +00:00
123 lines
3.3 KiB
Go
123 lines
3.3 KiB
Go
package client
|
|
|
|
import (
|
|
"net/http"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/foomo/sesamy-go/pkg/encoding/mpv2"
|
|
"github.com/foomo/sesamy-go/pkg/session"
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
func MPv2MiddlewarSessionID(measurementID string) MPv2Middleware {
|
|
measurementID = strings.Split(measurementID, "-")[1]
|
|
return func(next MPv2Handler) MPv2Handler {
|
|
return func(r *http.Request, payload *mpv2.Payload[any]) error {
|
|
if payload.SessionID == "" {
|
|
value, err := session.ParseGASessionID(r, measurementID)
|
|
if err != nil && !errors.Is(err, http.ErrNoCookie) {
|
|
return errors.Wrap(err, "failed to parse client cookie")
|
|
}
|
|
payload.SessionID = value
|
|
}
|
|
return next(r, payload)
|
|
}
|
|
}
|
|
}
|
|
|
|
func MPv2MiddlewarClientID(next MPv2Handler) MPv2Handler {
|
|
return func(r *http.Request, payload *mpv2.Payload[any]) error {
|
|
if payload.ClientID == "" {
|
|
value, err := session.ParseGAClientID(r)
|
|
if err != nil && !errors.Is(err, http.ErrNoCookie) {
|
|
return errors.Wrap(err, "failed to parse client cookie")
|
|
}
|
|
payload.ClientID = value
|
|
}
|
|
return next(r, payload)
|
|
}
|
|
}
|
|
|
|
func MPv2MiddlewarDebugMode(next MPv2Handler) MPv2Handler {
|
|
return func(r *http.Request, payload *mpv2.Payload[any]) error {
|
|
if !payload.DebugMode {
|
|
payload.DebugMode = session.IsGTMDebug(r)
|
|
}
|
|
return next(r, payload)
|
|
}
|
|
}
|
|
|
|
func MPv2MiddlewareUserID(cookieName string) MPv2Middleware {
|
|
return func(next MPv2Handler) MPv2Handler {
|
|
return func(r *http.Request, payload *mpv2.Payload[any]) error {
|
|
if payload.UserID == "" {
|
|
value, err := r.Cookie(cookieName)
|
|
if err != nil && !errors.Is(err, http.ErrNoCookie) {
|
|
return err
|
|
}
|
|
payload.UserID = value.Value
|
|
}
|
|
return next(r, payload)
|
|
}
|
|
}
|
|
}
|
|
|
|
func MPv2MiddlewareTimestamp(next MPv2Handler) MPv2Handler {
|
|
return func(r *http.Request, payload *mpv2.Payload[any]) error {
|
|
if payload.TimestampMicros == 0 {
|
|
payload.TimestampMicros = time.Now().UnixMicro()
|
|
}
|
|
return next(r, payload)
|
|
}
|
|
}
|
|
|
|
func MiddlewareUserAgent(next MPv2Handler) MPv2Handler {
|
|
return func(r *http.Request, payload *mpv2.Payload[any]) error {
|
|
if userAgent := r.Header.Get("User-Agent"); userAgent != "" {
|
|
for i, event := range payload.Events {
|
|
if value, ok := event.Params.(map[string]any); ok {
|
|
value["user_agent"] = userAgent
|
|
}
|
|
payload.Events[i] = event
|
|
}
|
|
}
|
|
return next(r, payload)
|
|
}
|
|
}
|
|
|
|
func MiddlewareIPOverride(next MPv2Handler) MPv2Handler {
|
|
return func(r *http.Request, payload *mpv2.Payload[any]) error {
|
|
var ipOverride string
|
|
for _, key := range []string{"X-Original-Forwarded-For", "X-Forwarded-For", "X-Real-Ip"} {
|
|
if value := r.Header.Get(key); value != "" {
|
|
ipOverride = value
|
|
break
|
|
}
|
|
}
|
|
if ipOverride != "" {
|
|
for i, event := range payload.Events {
|
|
if value, ok := event.Params.(map[string]any); ok {
|
|
value["ip_override"] = ipOverride
|
|
}
|
|
payload.Events[i] = event
|
|
}
|
|
}
|
|
return next(r, payload)
|
|
}
|
|
}
|
|
|
|
func MiddlewarePageLocation(next MPv2Handler) MPv2Handler {
|
|
return func(r *http.Request, payload *mpv2.Payload[any]) error {
|
|
if referrer := r.Header.Get("Referer"); referrer != "" {
|
|
for i, event := range payload.Events {
|
|
if value, ok := event.Params.(map[string]any); ok {
|
|
value["page_location"] = referrer
|
|
}
|
|
payload.Events[i] = event
|
|
}
|
|
}
|
|
return next(r, payload)
|
|
}
|
|
}
|