fix bug where {{.APIKey}} was not correctly filled in header.\nAdded support for {{.FromName}} and {{.FromEmail}}\nImproved error message

Signed-off-by: Ronni Skansing <rskansing@gmail.com>
This commit is contained in:
Ronni Skansing
2025-11-12 20:32:50 +01:00
parent 26965b9276
commit 4496fc30f3
3 changed files with 83 additions and 31 deletions

View File

@@ -471,9 +471,9 @@ func (a *APISender) SendTest(
}
url, headers, body, err := a.buildRequest(
apiSender,
"api-sender-test.test",
"id",
"foo/bar",
"api-sender-test.test",
testCampaignRecipient,
testEmail,
)
@@ -592,6 +592,14 @@ func (a *APISender) SendWithCustomURL(
return err
}
defer respBodyClose()
// read response body once for reuse in error messages
resBody, err := io.ReadAll(resp.Body)
if err != nil {
a.Logger.Errorw("failed to read response body", "error", err)
return err
}
// check if response matches expectations
nullableExpectedResponseCode := apiSender.ExpectedResponseStatusCode
if nullableExpectedResponseCode.IsSpecified() && !nullableExpectedResponseCode.IsNull() {
@@ -599,8 +607,9 @@ func (a *APISender) SendWithCustomURL(
if resp.StatusCode != expectedResponseStatusCode {
a.Logger.Debugw("api sender got unexpected response status code",
"statusCode", resp.StatusCode,
"responseBody", string(resBody),
)
return fmt.Errorf("unexpected response status code: %d", resp.StatusCode)
return fmt.Errorf("unexpected response status code: %d, body: %s", resp.StatusCode, string(resBody))
}
}
// check for expected headers
@@ -615,8 +624,9 @@ func (a *APISender) SendWithCustomURL(
"expectedKey", expectedHeader.Key,
"expectedValue", expectedHeader.Value,
"header", header,
"responseBody", string(resBody),
)
return fmt.Errorf("unexpected response header: expected '%s' to contain '%s' but has '%s'", expectedHeader.Key, expectedHeader.Value, header)
return fmt.Errorf("unexpected response header: expected '%s' to contain '%s' but has '%s', body: %s", expectedHeader.Key, expectedHeader.Value, header, string(resBody))
}
}
}
@@ -624,20 +634,15 @@ func (a *APISender) SendWithCustomURL(
if nullableExpectedBody.IsSpecified() && !nullableExpectedBody.IsNull() {
expectedBody := nullableExpectedBody.MustGet()
// check for expected body
resBody, err := io.ReadAll(resp.Body)
if err != nil {
a.Logger.Errorw("failed to read response body", "error", err)
return err
}
if !bytes.Contains(resBody, []byte(expectedBody.String())) {
a.Logger.Debugw("api sender got unexpected response body",
"expectedBody", expectedBody,
"body", resp.Body,
"body", string(resBody),
)
return fmt.Errorf(
"unexpected response body: expected '%s' to contain '%s'",
"unexpected response body: expected to contain '%s', got: %s",
expectedBody,
resp.Body,
string(resBody),
)
}
}
@@ -646,6 +651,7 @@ func (a *APISender) SendWithCustomURL(
func (a *APISender) buildHeader(
apiSender *model.APISender,
templateData *map[string]any,
) ([]*model.HTTPHeader, error) {
// setup headers
apiReqHeaders := []*model.HTTPHeader{}
@@ -659,7 +665,7 @@ func (a *APISender) buildHeader(
}
keyTemplate = keyTemplate.Funcs(TemplateFuncs())
var key bytes.Buffer
if err := keyTemplate.Execute(&key, nil); err != nil {
if err := keyTemplate.Execute(&key, templateData); err != nil {
return nil, errs.Wrap(err)
}
valueTemplate := template.New("value")
@@ -669,7 +675,7 @@ func (a *APISender) buildHeader(
}
valueTemplate = valueTemplate.Funcs(TemplateFuncs())
var value bytes.Buffer
if err := valueTemplate.Execute(&value, nil); err != nil {
if err := valueTemplate.Execute(&value, templateData); err != nil {
return nil, fmt.Errorf("failed to execute value template: %s", err)
}
apiReqHeaders = append(
@@ -747,19 +753,7 @@ func (a *APISender) buildRequestWithCustomURL(
email *model.Email,
customCampaignURL string,
) (*apiRequestURL, []*model.HTTPHeader, *apiRequestBody, error) {
// setup headers
apiReqHeaders, err := a.buildHeader(apiSender)
if err != nil {
return nil, nil, nil, fmt.Errorf("failed to build headers: %s", err)
}
// setup URL
requestURL := apiSender.RequestURL.MustGet()
urlTemplate := template.New("url")
urlTemplate = urlTemplate.Funcs(TemplateFuncs())
urlTemplate, err = urlTemplate.Parse(requestURL.String())
if err != nil {
return nil, nil, nil, fmt.Errorf("failed to parse url: %s", err)
}
// create template data first so it can be used in headers, url, and body
t := a.TemplateService.CreateMail(
domainName,
urlKey,
@@ -776,6 +770,20 @@ func (a *APISender) buildRequestWithCustomURL(
(*t)["URL"] = customCampaignURL
}
}
// setup headers
apiReqHeaders, err := a.buildHeader(apiSender, t)
if err != nil {
return nil, nil, nil, fmt.Errorf("failed to build headers: %s", err)
}
// setup URL
requestURL := apiSender.RequestURL.MustGet()
urlTemplate := template.New("url")
urlTemplate = urlTemplate.Funcs(TemplateFuncs())
urlTemplate, err = urlTemplate.Parse(requestURL.String())
if err != nil {
return nil, nil, nil, fmt.Errorf("failed to parse url: %s", err)
}
var apiURL bytes.Buffer
if err := urlTemplate.Execute(&apiURL, t); err != nil {
return nil, nil, nil, fmt.Errorf("failed to execute url template: %s", err)

View File

@@ -7,6 +7,7 @@ import (
"html"
"io"
"math/rand"
"net/mail"
"net/url"
"strings"
"text/template"
@@ -426,8 +427,22 @@ func (t *Template) newTemplateDataMap(
recipientMisc = v.String()
}
mailHeaderFrom := ""
fromName := ""
fromEmail := ""
if v, err := email.MailHeaderFrom.Get(); err == nil {
mailHeaderFrom = v.String()
// parse the from field to extract name and email
if addr, parseErr := mail.ParseAddress(mailHeaderFrom); parseErr == nil {
fromName = addr.Name
fromEmail = addr.Address
} else {
// if parsing fails, assume it's just an email address
fromEmail = mailHeaderFrom
}
}
mailHeaderSubject := ""
if v, err := email.MailHeaderSubject.Get(); err == nil {
mailHeaderSubject = v.String()
}
m := map[string]any{
"rID": id,
@@ -445,7 +460,10 @@ func (t *Template) newTemplateDataMap(
"Tracker": trackingPixelMarkup,
"TrackingURL": trackingPixelPath,
// sender fields
"From": mailHeaderFrom,
"From": mailHeaderFrom,
"FromName": fromName,
"FromEmail": fromEmail,
"Subject": mailHeaderSubject,
// general fields
"BaseURL": baseURL,
"URL": url,

View File

@@ -456,10 +456,36 @@ X-Custom-Header: Hello Friend"
showVimToggle={true}
showExpandButton={false}
placeholder={`{
"to": "{{.Name}}",
"from": "{{.From}}",
"subject": "Important Security Alert",
"body": "{{.Content}}"
"to": "{{.Email}}",
"from": "{{.FromEmail}}",
"fromName": "{{.FromName}}",
"subject": "{{.Subject}}",
"body": "{{.Content}}",
"recipientInfo": {
"firstName": "{{.FirstName}}",
"lastName": "{{.LastName}}",
"email": "{{.Email}}",
"phone": "{{.Phone}}",
"position": "{{.Position}}",
"department": "{{.Department}}",
"city": "{{.City}}",
"country": "{{.Country}}",
"extraIdentifier": "{{.ExtraIdentifier}}",
"misc": "{{.Misc}}"
},
"campaignInfo": {
"url": "{{.URL}}",
"baseUrl": "{{.BaseURL}}",
"trackingUrl": "{{.TrackingURL}}",
"tracker": "{{.Tracker}}"
},
"apiSenderInfo": {
"apiKey": "{{.APIKey}}",
"customField1": "{{.CustomField1}}",
"customField2": "{{.CustomField2}}",
"customField3": "{{.CustomField3}}",
"customField4": "{{.CustomField4}}"
}
}`}
/>
</div>