package notif import ( "io" "net/http" "net/url" "strings" "github.com/yusing/go-proxy/internal/gperr" ) type ProviderBase struct { Name string `json:"name" validate:"required"` URL string `json:"url" validate:"url"` Token string `json:"token"` } var ( ErrMissingToken = gperr.New("token is required") ErrURLMissingScheme = gperr.New("url missing scheme, expect 'http://' or 'https://'") ) // Validate implements the utils.CustomValidator interface. func (base *ProviderBase) Validate() gperr.Error { if base.Token == "" { return ErrMissingToken } if !strings.HasPrefix(base.URL, "http://") && !strings.HasPrefix(base.URL, "https://") { return ErrURLMissingScheme } u, err := url.Parse(base.URL) if err != nil { return gperr.Wrap(err) } base.URL = u.String() return nil } func (base *ProviderBase) GetName() string { return base.Name } func (base *ProviderBase) GetURL() string { return base.URL } func (base *ProviderBase) GetToken() string { return base.Token } func (base *ProviderBase) GetMethod() string { return http.MethodPost } func (base *ProviderBase) GetMIMEType() string { return "application/json" } func (base *ProviderBase) SetHeaders(logMsg *LogMessage, headers http.Header) { // no-op by default } func (base *ProviderBase) makeRespError(resp *http.Response) error { body, err := io.ReadAll(resp.Body) if err == nil { return gperr.Errorf("%s status %d: %s", base.Name, resp.StatusCode, body) } return gperr.Errorf("%s status %d", base.Name, resp.StatusCode) }