Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Set project-specific user agent, offer override #143

Merged
merged 1 commit into from
Feb 8, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
8 changes: 8 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ A package to send messages to Microsoft Teams (channels)
- [How to create a webhook URL (Connector)](#how-to-create-a-webhook-url-connector)
- [Examples](#examples)
- [Basic](#basic)
- [Set custom user agent](#set-custom-user-agent)
- [Add an Action](#add-an-action)
- [Disable webhook URL prefix validation](#disable-webhook-url-prefix-validation)
- [Enable custom patterns' validation](#enable-custom-patterns-validation)
Expand Down Expand Up @@ -70,6 +71,7 @@ information.
- Configurable timeouts
- Configurable retry support
- Support for overriding the default `http.Client`
- Support for overriding default project-specific user agent

## Project Status

Expand Down Expand Up @@ -185,6 +187,12 @@ This is an example of a simple client application which uses this library.

File: [basic](./examples/basic/main.go)

#### Set custom user agent

This example illustrates setting a custom user agent.

File: [custom-user-agent](./examples/custom-user-agent/main.go)

#### Add an Action

This example illustrates adding an [`OpenUri Action`][msgcard-ref-actions] to
Expand Down
2 changes: 2 additions & 0 deletions doc.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ FEATURES

• Support for overriding the default http.Client

• Support for overriding the default project-specific user agent


USAGE

Expand Down
52 changes: 52 additions & 0 deletions examples/custom-user-agent/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
// Copyright 2021 Adam Chalkley
//
// https://github.com/atc0005/go-teams-notify
//
// Licensed under the MIT License. See LICENSE file in the project root for
// full license information.

/*

This is an example of a simple client application which uses this library.

Of note:

- default timeout
- custom user agent
- package-level logging is disabled by default
- validation of known webhook URL prefixes is *enabled*
- simple message submitted to Microsoft Teams consisting of formatted body and
title

*/

package main

import (
goteamsnotify "github.com/atc0005/go-teams-notify/v2"
)

func main() {
_ = sendTheMessage()
}

func sendTheMessage() error {
// init the client
mstClient := goteamsnotify.NewClient()

// override the project-specific default user agent
mstClient.SetUserAgent("go-teams-notify-example/1.0")

// setup webhook url
webhookUrl := "https://outlook.office.com/webhook/YOUR_WEBHOOK_URL_OF_TEAMS_CHANNEL"

// setup message card
msgCard := goteamsnotify.NewMessageCard()
msgCard.Title = "Hello world"
msgCard.Text = "Here are some examples of formatted stuff like " +
"<br> * this list itself <br> * **bold** <br> * *italic* <br> * ***bolditalic***"
msgCard.ThemeColor = "#DF813D"

// send
return mstClient.Send(webhookUrl, msgCard)
}
26 changes: 26 additions & 0 deletions send.go
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,14 @@ const ExpectedWebhookURLResponseText string = "1"
// before it times out and is cancelled.
const DefaultWebhookSendTimeout = 5 * time.Second

// DefaultUserAgent is the project-specific user agent used when submitting
// messages unless overridden by client code. This replaces the Go default
// user agent value of "Go-http-client/1.1".
//
// The major.minor numbers reflect when this project first diverged from the
// "upstream" or parent project.
const DefaultUserAgent string = "go-teams-notify/2.2"

// ErrWebhookURLUnexpected is returned when a provided webhook URL does
// not match a set of confirmed webhook URL patterns.
var ErrWebhookURLUnexpected = errors.New("webhook URL does not match one of expected patterns")
Expand All @@ -90,13 +98,15 @@ type API interface {
SendWithContext(ctx context.Context, webhookURL string, webhookMessage MessageCard) error
SendWithRetry(ctx context.Context, webhookURL string, webhookMessage MessageCard, retries int, retriesDelay int) error
SetHTTPClient(httpClient *http.Client) API
SetUserAgent(userAgent string) API
SkipWebhookURLValidationOnSend(skip bool) API
AddWebhookURLValidationPatterns(patterns ...string) API
ValidateWebhook(webhookURL string) error
}

type teamsClient struct {
httpClient *http.Client
userAgent string
webhookURLValidationPatterns []string
skipWebhookURLValidation bool
}
Expand Down Expand Up @@ -142,6 +152,14 @@ func (c *teamsClient) SetHTTPClient(httpClient *http.Client) API {
return c
}

// SetUserAgent accepts a custom user agent string. This custom user agent is
// used when submitting messages to Microsoft Teams.
func (c *teamsClient) SetUserAgent(userAgent string) API {
c.userAgent = userAgent

return c
}

func (c *teamsClient) AddWebhookURLValidationPatterns(patterns ...string) API {
c.webhookURLValidationPatterns = append(c.webhookURLValidationPatterns, patterns...)
return c
Expand Down Expand Up @@ -190,6 +208,14 @@ func (c teamsClient) SendWithContext(ctx context.Context, webhookURL string, web
req, _ := http.NewRequestWithContext(ctx, http.MethodPost, webhookURL, webhookMessageBuffer)
req.Header.Add("Content-Type", "application/json;charset=utf-8")

// If provided, override the project-specific user agent with custom value.
switch {
case c.userAgent != "":
req.Header.Set("User-Agent", c.userAgent)
default:
req.Header.Set("User-Agent", DefaultUserAgent)
}

// do the request
res, err := c.httpClient.Do(req)
if err != nil {
Expand Down