mirror of
https://github.com/foomo/sesamy-go.git
synced 2025-10-16 12:35:43 +00:00
commit
19235dbc52
2
.github/workflows/test.yml
vendored
2
.github/workflows/test.yml
vendored
@ -29,7 +29,7 @@ jobs:
|
|||||||
version: latest
|
version: latest
|
||||||
args: --timeout=5m
|
args: --timeout=5m
|
||||||
|
|
||||||
- run: make test
|
- run: GO_TEST_TAGS=-skip go test -coverprofile=coverage.out -race -json ./... | gotestfmt
|
||||||
|
|
||||||
- uses: coverallsapp/github-action@v2
|
- uses: coverallsapp/github-action@v2
|
||||||
with:
|
with:
|
||||||
|
|||||||
@ -2,7 +2,7 @@ package mpv2
|
|||||||
|
|
||||||
// UserData https://developers.google.com/analytics/devguides/collection/ga4/uid-data
|
// UserData https://developers.google.com/analytics/devguides/collection/ga4/uid-data
|
||||||
type UserData struct {
|
type UserData struct {
|
||||||
SHA256EmailAddress []SHA256Hash `json:"sha256_email_address,omitempty"`
|
SHA256EmailAddress SHA256Hash `json:"sha256_email_address,omitempty"`
|
||||||
SHA256PhoneNumber []SHA256Hash `json:"sha256_phone_number,omitempty"`
|
SHA256PhoneNumber SHA256Hash `json:"sha256_phone_number,omitempty"`
|
||||||
Address []UserDataAddress `json:"address,omitempty"`
|
Address UserDataAddress `json:"address,omitempty"`
|
||||||
}
|
}
|
||||||
|
|||||||
@ -38,11 +38,25 @@ func MiddlewareSessionID(measurementID string) Middleware {
|
|||||||
return func(next MiddlewareHandler) MiddlewareHandler {
|
return func(next MiddlewareHandler) MiddlewareHandler {
|
||||||
return func(l *zap.Logger, w http.ResponseWriter, r *http.Request, payload *mpv2.Payload[any]) error {
|
return func(l *zap.Logger, w http.ResponseWriter, r *http.Request, payload *mpv2.Payload[any]) error {
|
||||||
if payload.SessionID == "" {
|
if payload.SessionID == "" {
|
||||||
value, err := session.ParseGASessionID(r, measurementID)
|
id, err := session.ParseGASessionID(r, measurementID)
|
||||||
if err != nil && !errors.Is(err, http.ErrNoCookie) {
|
if err != nil && !errors.Is(err, http.ErrNoCookie) {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
payload.SessionID = value
|
|
||||||
|
number, err := session.ParseGASessionNumber(r, measurementID)
|
||||||
|
if err != nil && !errors.Is(err, http.ErrNoCookie) {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
payload.SessionID = id
|
||||||
|
for i, event := range payload.Events {
|
||||||
|
if value, ok := event.Params.(map[string]any); ok {
|
||||||
|
value["ga_session_id"] = id
|
||||||
|
value["ga_session_number"] = number
|
||||||
|
event.Params = value
|
||||||
|
}
|
||||||
|
payload.Events[i] = event
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return next(l, w, r, payload)
|
return next(l, w, r, payload)
|
||||||
}
|
}
|
||||||
@ -100,9 +114,12 @@ func MiddlewareUserAgent(next MiddlewareHandler) MiddlewareHandler {
|
|||||||
if userAgent := r.Header.Get("User-Agent"); userAgent != "" {
|
if userAgent := r.Header.Get("User-Agent"); userAgent != "" {
|
||||||
for i, event := range payload.Events {
|
for i, event := range payload.Events {
|
||||||
if value, ok := event.Params.(map[string]any); ok {
|
if value, ok := event.Params.(map[string]any); ok {
|
||||||
|
if value["user_agent"] == nil {
|
||||||
value["user_agent"] = userAgent
|
value["user_agent"] = userAgent
|
||||||
payload.Events[i] = event
|
|
||||||
}
|
}
|
||||||
|
event.Params = value
|
||||||
|
}
|
||||||
|
payload.Events[i] = event
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return next(l, w, r, payload)
|
return next(l, w, r, payload)
|
||||||
@ -121,24 +138,51 @@ func MiddlewareIPOverride(next MiddlewareHandler) MiddlewareHandler {
|
|||||||
if ipOverride != "" {
|
if ipOverride != "" {
|
||||||
for i, event := range payload.Events {
|
for i, event := range payload.Events {
|
||||||
if value, ok := event.Params.(map[string]any); ok {
|
if value, ok := event.Params.(map[string]any); ok {
|
||||||
|
if value["ip_override"] == nil {
|
||||||
value["ip_override"] = ipOverride
|
value["ip_override"] = ipOverride
|
||||||
payload.Events[i] = event
|
|
||||||
}
|
}
|
||||||
|
event.Params = value
|
||||||
|
}
|
||||||
|
payload.Events[i] = event
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return next(l, w, r, payload)
|
return next(l, w, r, payload)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func MiddlewarePageLocation(next MiddlewareHandler) MiddlewareHandler {
|
func MiddlewareEngagementTime(next MiddlewareHandler) MiddlewareHandler {
|
||||||
return func(l *zap.Logger, w http.ResponseWriter, r *http.Request, payload *mpv2.Payload[any]) error {
|
return func(l *zap.Logger, w http.ResponseWriter, r *http.Request, payload *mpv2.Payload[any]) error {
|
||||||
if referrer := r.Header.Get("Referer"); referrer != "" {
|
|
||||||
for i, event := range payload.Events {
|
for i, event := range payload.Events {
|
||||||
if value, ok := event.Params.(map[string]any); ok {
|
if value, ok := event.Params.(map[string]any); ok {
|
||||||
value["page_location"] = referrer
|
if value["engagement_time_msec"] == nil {
|
||||||
|
value["engagement_time_msec"] = 100
|
||||||
|
}
|
||||||
|
event.Params = value
|
||||||
|
}
|
||||||
payload.Events[i] = event
|
payload.Events[i] = event
|
||||||
}
|
}
|
||||||
|
return next(l, w, r, payload)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
func MiddlewarePageLocation(next MiddlewareHandler) MiddlewareHandler {
|
||||||
|
return func(l *zap.Logger, w http.ResponseWriter, r *http.Request, payload *mpv2.Payload[any]) error {
|
||||||
|
pageTitle := r.Header.Get("X-Page-Title")
|
||||||
|
pageLocation := r.Header.Get("Referer")
|
||||||
|
pageReferrer := r.Header.Get("X-Page-Referrer")
|
||||||
|
for i, event := range payload.Events {
|
||||||
|
if value, ok := event.Params.(map[string]any); ok {
|
||||||
|
if value["page_title"] == nil && pageTitle != "" {
|
||||||
|
value["page_title"] = pageTitle
|
||||||
|
}
|
||||||
|
if value["page_referrer"] == nil && pageReferrer != "" {
|
||||||
|
value["page_referrer"] = pageReferrer
|
||||||
|
}
|
||||||
|
if value["page_location"] == nil && pageLocation != "" {
|
||||||
|
value["page_location"] = pageLocation
|
||||||
|
}
|
||||||
|
event.Params = value
|
||||||
|
}
|
||||||
|
payload.Events[i] = event
|
||||||
}
|
}
|
||||||
return next(l, w, r, payload)
|
return next(l, w, r, payload)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -6,7 +6,6 @@ import (
|
|||||||
"net/url"
|
"net/url"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/davecgh/go-spew/spew"
|
|
||||||
"github.com/foomo/sesamy-go/pkg/client"
|
"github.com/foomo/sesamy-go/pkg/client"
|
||||||
"github.com/foomo/sesamy-go/pkg/encoding/mpv2"
|
"github.com/foomo/sesamy-go/pkg/encoding/mpv2"
|
||||||
"github.com/foomo/sesamy-go/pkg/provider/cookiebot"
|
"github.com/foomo/sesamy-go/pkg/provider/cookiebot"
|
||||||
@ -39,7 +38,6 @@ func MPv2MiddlewarConsent(l *zap.Logger) client.MPv2Middleware {
|
|||||||
l.With(zap.Error(err), zap.String("value", data)).Warn("failed to unmarshal cookie bot cookie")
|
l.With(zap.Error(err), zap.String("value", data)).Warn("failed to unmarshal cookie bot cookie")
|
||||||
return next(r, payload)
|
return next(r, payload)
|
||||||
}
|
}
|
||||||
spew.Dump(value)
|
|
||||||
|
|
||||||
consent := func(b bool) *mpv2.Consent {
|
consent := func(b bool) *mpv2.Consent {
|
||||||
ret := mpv2.ConsentDenied
|
ret := mpv2.ConsentDenied
|
||||||
@ -58,7 +56,6 @@ func MPv2MiddlewarConsent(l *zap.Logger) client.MPv2Middleware {
|
|||||||
FunctionalityStorage: consent(value.Necessary),
|
FunctionalityStorage: consent(value.Necessary),
|
||||||
SecurityStorage: consent(value.Necessary),
|
SecurityStorage: consent(value.Necessary),
|
||||||
}
|
}
|
||||||
spew.Dump(payload)
|
|
||||||
|
|
||||||
return next(r, payload)
|
return next(r, payload)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -38,3 +38,19 @@ func ParseGASessionID(r *http.Request, id string) (string, error) {
|
|||||||
|
|
||||||
return parts[2], nil
|
return parts[2], nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ParseGASessionNumber(r *http.Request, id string) (string, error) {
|
||||||
|
cookie, err := r.Cookie("_ga_" + id)
|
||||||
|
if err != nil {
|
||||||
|
return "", errors.Wrap(err, "failed to retrieve _ga cookie")
|
||||||
|
}
|
||||||
|
|
||||||
|
parts := strings.Split(cookie.Value, ".")
|
||||||
|
|
||||||
|
// validate
|
||||||
|
if !strings.HasPrefix(cookie.Value, "GS1.1") || len(parts) < 4 {
|
||||||
|
return "", errors.New("invalid _ga cookie value")
|
||||||
|
}
|
||||||
|
|
||||||
|
return parts[3], nil
|
||||||
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user