msrcgo/http.go
2017-01-13 00:05:57 +01:00

92 lines
2.1 KiB
Go

package msrcgo
import (
"errors"
"io"
"io/ioutil"
"net/http"
)
const (
APIVersion = "?api-version=2016-08-01"
UpdatesURI = "/Updates"
CvrfURI = "/cvrf/"
URL = "https://api.msrc.microsoft.com"
APIKeyHeader = "api-key"
AcceptHeader = "Accept"
AcceptValue = "application/json"
GET = "GET"
)
// Client represents the API client
type Client struct {
key string
allUpdates *http.Request
}
// NewClient returns a new Client instance
func NewClient(key string) *Client {
all, _ := http.NewRequest(GET, URL+UpdatesURI+APIVersion, nil)
all.Header.Set(AcceptHeader, AcceptValue)
all.Header.Set(APIKeyHeader, key)
return &Client{key, all}
}
// GetAllUpdates returns the Update struct (a list of all bulletins)
func (c *Client) GetAllUpdates() (*Update, error) {
return c.getUpdate(c.allUpdates)
}
// GetUpdateID returns a Update struct of the given id
// Example id: "2016-Sep"
func (c *Client) GetUpdateID(id string) (*Update, error) {
req, _ := http.NewRequest(GET, URL+UpdatesURI+"('"+id+"')"+APIVersion, nil)
req.Header.Set(AcceptHeader, AcceptValue)
req.Header.Set(APIKeyHeader, c.key)
return c.getUpdate(req)
}
// GetCVRF returns the CVRF struct of the given id
// Example id: "2016-Sep"
func (c *Client) GetCVRF(id string) (*CVRF, error) {
req, _ := http.NewRequest(GET, URL+CvrfURI+id+APIVersion, nil)
req.Header.Set(AcceptHeader, AcceptValue)
req.Header.Set(APIKeyHeader, c.key)
return c.getCVRF(req)
}
func (c *Client) request(req *http.Request) (body io.ReadCloser, err error) {
resp, err := (&http.Client{}).Do(req)
if err != nil {
return
}
if resp.StatusCode != http.StatusOK {
b, e := ioutil.ReadAll(resp.Body)
defer resp.Body.Close()
if e == nil {
err = errors.New(string(b))
}
return
}
body = resp.Body
return
}
func (c *Client) getUpdate(req *http.Request) (u *Update, err error) {
body, err := c.request(req)
if err != nil {
return
}
defer body.Close()
return DecodeUpdate(body)
}
func (c *Client) getCVRF(req *http.Request) (u *CVRF, err error) {
body, err := c.request(req)
if err != nil {
return
}
defer body.Close()
return DecodeCVRF(body)
}