feat: use new properties to override values from headers
This commit is contained in:
parent
a978d4921d
commit
07ef234cac
4 changed files with 69 additions and 136 deletions
|
|
@ -4,67 +4,42 @@ import (
|
|||
"context"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"time"
|
||||
)
|
||||
|
||||
type SendPayload struct {
|
||||
Website string `json:"website"`
|
||||
Hostname string `json:"hostname"`
|
||||
Language string `json:"language,omitempty"`
|
||||
Referrer string `json:"referrer,omitempty"`
|
||||
Url string `json:"url"`
|
||||
//Ip string `json:"ip,omitempty"`
|
||||
//Data map[string]interface{} `json:"data,omitempty"` // Additional data for the event
|
||||
//Name string `json:"name,omitempty"` // Event name (for custom events)
|
||||
type UmamiEvent struct {
|
||||
Website string `json:"website"` // Website ID
|
||||
Hostname string `json:"hostname"` // Name of host
|
||||
Language string `json:"language,omitempty"` // Language of visitor (ex. "en-US")
|
||||
Referrer string `json:"referrer,omitempty"` // Referrer URL
|
||||
Url string `json:"url"` // Page URL
|
||||
Ip string `json:"ip,omitempty"` // IP address
|
||||
UserAgent string `json:"userAgent,omitempty"` // User agent
|
||||
Timestamp int64 `json:"timestamp,omitempty"` // UNIX timestamp in seconds
|
||||
//Data map[string]interface{} `json:"data,omitempty"` // Additional data for the event
|
||||
//Name string `json:"name,omitempty"` // Event name (for custom events)
|
||||
//Screen string `json:"screen,omitempty"` // Screen resolution (ex. "1920x1080")
|
||||
//Tag string `json:"tag,omitempty"`
|
||||
//Title string `json:"title,omitempty"` // Page title
|
||||
//Title string `json:"title,omitempty"` // Page title
|
||||
}
|
||||
|
||||
type SendBody struct {
|
||||
Payload SendPayload `json:"payload"`
|
||||
Payload *UmamiEvent `json:"payload"`
|
||||
Type string `json:"type"`
|
||||
}
|
||||
|
||||
type UmamiPayload struct {
|
||||
body SendBody
|
||||
headers http.Header
|
||||
}
|
||||
|
||||
var headersToCopy = []string{
|
||||
"User-Agent",
|
||||
"X-Real-Op",
|
||||
"X-Forwarded-For",
|
||||
"cf-ipcountry",
|
||||
"cf-region-code",
|
||||
"cf-ipcity",
|
||||
"cf-connecting-ip",
|
||||
"x-vercel-ip-country",
|
||||
"x-vercel-ip-country-region",
|
||||
"x-vercel-ip-city",
|
||||
}
|
||||
|
||||
// Copied and adapted from https://github.com/safing/plausiblefeeder/blob/master/event.go
|
||||
// Licensed as MIT license
|
||||
|
||||
func (h *UmamiFeeder) submitToFeed(req *http.Request, code int) {
|
||||
body := SendBody{
|
||||
Payload: SendPayload{
|
||||
Hostname: parseDomainFromHost(req.Host),
|
||||
Language: parseAcceptLanguage(req.Header.Get("Accept-Language")),
|
||||
Referrer: req.Referer(),
|
||||
Url: req.URL.String(),
|
||||
},
|
||||
Type: "event",
|
||||
event := &UmamiEvent{
|
||||
Hostname: parseDomainFromHost(req.Host),
|
||||
Language: parseAcceptLanguage(req.Header.Get("Accept-Language")),
|
||||
Referrer: req.Referer(),
|
||||
Url: req.URL.String(),
|
||||
Ip: extractRemoteIP(req),
|
||||
UserAgent: req.Header.Get("User-Agent"),
|
||||
Timestamp: time.Now().Unix(),
|
||||
}
|
||||
|
||||
var headers = make(http.Header)
|
||||
copyHeaders(headers, req.Header, headersToCopy)
|
||||
writeXForwardedHeaders(headers, req)
|
||||
|
||||
payload := &UmamiPayload{body: body, headers: headers}
|
||||
|
||||
select {
|
||||
case h.queue <- payload:
|
||||
case h.queue <- event:
|
||||
default:
|
||||
h.error("failed to submit event: queue full")
|
||||
}
|
||||
|
|
@ -103,8 +78,8 @@ func (h *UmamiFeeder) umamiEventFeeder(ctx context.Context) (err error) {
|
|||
}
|
||||
}
|
||||
|
||||
func (h *UmamiFeeder) reportEventToUmami(ctx context.Context, event *UmamiPayload) {
|
||||
hostname := event.body.Payload.Hostname
|
||||
func (h *UmamiFeeder) reportEventToUmami(ctx context.Context, event *UmamiEvent) {
|
||||
hostname := event.Hostname
|
||||
websiteId, ok := h.websites[hostname]
|
||||
if !ok {
|
||||
website, err := createWebsite(ctx, h.umamiHost, h.umamiToken, h.umamiTeamId, hostname)
|
||||
|
|
@ -121,10 +96,15 @@ func (h *UmamiFeeder) reportEventToUmami(ctx context.Context, event *UmamiPayloa
|
|||
h.error("skip tracking, websiteId is unknown: " + hostname)
|
||||
return
|
||||
}
|
||||
event.body.Payload.Website = websiteId
|
||||
event.Website = websiteId
|
||||
|
||||
h.debug("sending tracking request %v %v", event.body, event.headers)
|
||||
resp, err := sendRequest(ctx, h.umamiHost+"/api/send", event.body, event.headers)
|
||||
body := SendBody{
|
||||
Payload: event,
|
||||
Type: "event",
|
||||
}
|
||||
|
||||
h.debug("sending tracking request %v", event)
|
||||
resp, err := sendRequest(ctx, h.umamiHost+"/api/send", body, nil)
|
||||
if err != nil {
|
||||
h.error("failed to send tracking: " + err.Error())
|
||||
return
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue