Skip to content
Snippets Groups Projects
browser.go 1.12 KiB
Newer Older
ale's avatar
ale committed
package reportscollector

import (
	"encoding/json"
	"net/http"
	"time"
)

// Generic browser report as per https://www.w3.org/TR/reporting/.
type report struct {
	Type      string                 `json:"type"`
	Age       int                    `json:"age"`
	URL       string                 `json:"url"`
	UserAgent string                 `json:"user_agent"`
	Body      map[string]interface{} `json:"body"`
}

type ReportHandler struct{}

func (h *ReportHandler) Parse(contentType string, req *http.Request) ([]Event, error) {
	if contentType != "application/reports+json" {
		return nil, ErrNoMatch
	}

	var reports []*report
	if err := json.NewDecoder(req.Body).Decode(&reports); err != nil {
		return nil, err
	}

	var events []Event
	for _, r := range reports {
		events = append(events, h.eventFromReport(r))
	}
	return events, nil
}

func (h *ReportHandler) eventFromReport(report *report) Event {
	ts := time.Now().Add(time.Duration(-report.Age) * time.Second)

	e := make(Event)
	e.Set("type", report.Type)
	e.Set("event_timestamp", ts)
	e.Set("url", report.URL)
	e.Set("user_agent", report.UserAgent)
	e.Set("body", report.Body)
	return e
}