dns-api/api.go
2022-06-11 14:38:03 +02:00

64 lines
1.5 KiB
Go

package dns_api
import (
"crypto/ed25519"
"net/http"
"net/url"
"time"
)
type Client struct {
privateKey ed25519.PrivateKey
client *http.Client
RequestExpirationTime time.Duration
}
//NewClient Creates an API client with either a specified http Client, or nil
func NewClient(privateKey ed25519.PrivateKey, client *http.Client) *Client {
if client == nil {
client = http.DefaultClient
}
return &Client{
privateKey: privateKey,
client: client,
}
}
func (c *Client) Do(req *http.Request) (*http.Response, error) {
requestUrl, err := url.Parse(req.URL.String())
if err != nil {
return nil, err
}
requestUrl.Host = req.Host
var expirationTime time.Time
if c.RequestExpirationTime != 0 {
expirationTime = time.Now().Add(c.RequestExpirationTime)
}
newUrl, err := CreateSignatureMessage(req.Method, requestUrl, c.privateKey, expirationTime)
if err != nil {
return nil, err
}
//TODO: WithContext?
return c.client.Do(&http.Request{
Method: req.Method,
URL: newUrl,
Header: req.Header,
Body: req.Body,
GetBody: req.GetBody,
ContentLength: req.ContentLength,
TransferEncoding: req.TransferEncoding,
Close: req.Close,
Host: req.Host,
Form: req.Form,
PostForm: req.PostForm,
MultipartForm: req.MultipartForm,
Trailer: req.Trailer,
Response: req.Response,
})
}
//TODO: server call methods