woodpecker/vendor/github.com/jpillora/go-ogle-analytics/client.go
2017-07-12 14:04:21 -04:00

76 lines
1.3 KiB
Go

//go:generate go run generate/protocol.go
package ga
import (
"bytes"
"fmt"
"net/http"
"net/url"
"regexp"
)
var trackingIDMatcher = regexp.MustCompile(`^UA-\d+-\d+$`)
func NewClient(trackingID string) (*Client, error) {
if !trackingIDMatcher.MatchString(trackingID) {
return nil, fmt.Errorf("Invalid Tracking ID: %s", trackingID)
}
return &Client{
UseTLS: true,
HttpClient: http.DefaultClient,
protocolVersion: "1",
protocolVersionSet: true,
trackingID: trackingID,
clientID: "go-ga",
clientIDSet: true,
}, nil
}
type hitType interface {
addFields(url.Values) error
}
func (c *Client) Send(h hitType) error {
cpy := c.Copy()
v := url.Values{}
cpy.setType(h)
err := cpy.addFields(v)
if err != nil {
return err
}
err = h.addFields(v)
if err != nil {
return err
}
url := ""
if cpy.UseTLS {
url = "https://www.google-analytics.com/collect"
} else {
url = "http://ssl.google-analytics.com/collect"
}
str := v.Encode()
buf := bytes.NewBufferString(str)
resp, err := c.HttpClient.Post(url, "application/x-www-form-urlencoded", buf)
if err != nil {
return err
}
defer resp.Body.Close()
if resp.StatusCode/100 != 2 {
return fmt.Errorf("Rejected by Google with code %d", resp.StatusCode)
}
// fmt.Printf("POST %s => %d\n", str, resp.StatusCode)
return nil
}