Endpoint fixes for GET requests and error handling
This commit is contained in:
parent
f67889c2ca
commit
fcccda2761
26
api/api.go
26
api/api.go
|
@ -27,6 +27,9 @@ func New() *Request {
|
||||||
// Inspired by gin.H, same concept.
|
// Inspired by gin.H, same concept.
|
||||||
type D map[string]interface{}
|
type D map[string]interface{}
|
||||||
|
|
||||||
|
// Same concept as D, but a map of strings, used for querying GET requests.
|
||||||
|
type Q map[string]string
|
||||||
|
|
||||||
// A custom API requester struct for Wings.
|
// A custom API requester struct for Wings.
|
||||||
type Request struct{}
|
type Request struct{}
|
||||||
|
|
||||||
|
@ -63,7 +66,7 @@ func (r *Request) Endpoint(endpoint string) string {
|
||||||
|
|
||||||
// Makes a HTTP request to the given endpoint, attaching the necessary request headers from
|
// Makes a HTTP request to the given endpoint, attaching the necessary request headers from
|
||||||
// Wings to ensure that the request is properly handled by the Panel.
|
// Wings to ensure that the request is properly handled by the Panel.
|
||||||
func (r *Request) Make(method, url string, body io.Reader) (*Response, error) {
|
func (r *Request) Make(method, url string, body io.Reader, opts ...func(r *http.Request)) (*Response, error) {
|
||||||
req, err := http.NewRequest(method, url, body)
|
req, err := http.NewRequest(method, url, body)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.WithStack(err)
|
return nil, errors.WithStack(err)
|
||||||
|
@ -74,6 +77,12 @@ func (r *Request) Make(method, url string, body io.Reader) (*Response, error) {
|
||||||
req.Header.Set("Content-Type", "application/json")
|
req.Header.Set("Content-Type", "application/json")
|
||||||
req.Header.Set("Authorization", fmt.Sprintf("Bearer %s.%s", config.Get().AuthenticationTokenId, config.Get().AuthenticationToken))
|
req.Header.Set("Authorization", fmt.Sprintf("Bearer %s.%s", config.Get().AuthenticationTokenId, config.Get().AuthenticationToken))
|
||||||
|
|
||||||
|
// Make any options calls that will allow us to make modifications to the request
|
||||||
|
// before it is sent off.
|
||||||
|
for _, cb := range opts {
|
||||||
|
cb(req)
|
||||||
|
}
|
||||||
|
|
||||||
r.debug(req)
|
r.debug(req)
|
||||||
|
|
||||||
res, err := r.Client().Do(req)
|
res, err := r.Client().Do(req)
|
||||||
|
@ -103,13 +112,12 @@ func (r *Request) debug(req *http.Request) {
|
||||||
|
|
||||||
// Makes a GET request to the given Panel API endpoint. If any data is passed as the
|
// Makes a GET request to the given Panel API endpoint. If any data is passed as the
|
||||||
// second argument it will be passed through on the request as URL parameters.
|
// second argument it will be passed through on the request as URL parameters.
|
||||||
func (r *Request) Get(url string, data interface{}) (*Response, error) {
|
func (r *Request) Get(url string, data Q) (*Response, error) {
|
||||||
b, err := json.Marshal(data)
|
return r.Make(http.MethodGet, r.Endpoint(url), nil, func(r *http.Request) {
|
||||||
if err != nil {
|
for k, v := range data {
|
||||||
return nil, errors.WithStack(err)
|
r.URL.Query().Set(k, v)
|
||||||
}
|
}
|
||||||
|
})
|
||||||
return r.Make(http.MethodGet, r.Endpoint(url), bytes.NewBuffer(b))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Makes a POST request to the given Panel API endpoint.
|
// Makes a POST request to the given Panel API endpoint.
|
||||||
|
@ -166,7 +174,7 @@ func (r *Response) Bind(v interface{}) error {
|
||||||
// similar to the below example:
|
// similar to the below example:
|
||||||
//
|
//
|
||||||
// HttpNotFoundException: The requested resource does not exist. (HTTP/404)
|
// HttpNotFoundException: The requested resource does not exist. (HTTP/404)
|
||||||
func (r *Response) Error() *RequestError {
|
func (r *Response) Error() error {
|
||||||
if !r.HasError() {
|
if !r.HasError() {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package api
|
package api
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
)
|
)
|
||||||
|
@ -16,12 +15,7 @@ type BackupRequest struct {
|
||||||
// Notifies the panel that a specific backup has been completed and is now
|
// Notifies the panel that a specific backup has been completed and is now
|
||||||
// available for a user to view and download.
|
// available for a user to view and download.
|
||||||
func (r *Request) SendBackupStatus(backup string, data BackupRequest) error {
|
func (r *Request) SendBackupStatus(backup string, data BackupRequest) error {
|
||||||
b, err := json.Marshal(data)
|
resp, err := r.Post(fmt.Sprintf("/backups/%s", backup), data)
|
||||||
if err != nil {
|
|
||||||
return errors.WithStack(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
resp, err := r.Post(fmt.Sprintf("/backups/%s", backup), b)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.WithStack(err)
|
return errors.WithStack(err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,5 +24,10 @@ func IsRequestError(err error) bool {
|
||||||
|
|
||||||
// Returns the error response in a string form that can be more easily consumed.
|
// Returns the error response in a string form that can be more easily consumed.
|
||||||
func (re *RequestError) Error() string {
|
func (re *RequestError) Error() string {
|
||||||
return fmt.Sprintf("Error response from Panel: %s: %s (HTTP/%d)", re.Code, re.Detail, re.response.StatusCode)
|
c := 0
|
||||||
|
if re.response != nil {
|
||||||
|
c = re.response.StatusCode
|
||||||
|
}
|
||||||
|
|
||||||
|
return fmt.Sprintf("Error response from Panel: %s: %s (HTTP/%d)", re.Code, re.Detail, c)
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,6 +8,7 @@ import (
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
"github.com/pterodactyl/wings/config"
|
"github.com/pterodactyl/wings/config"
|
||||||
"golang.org/x/sync/errgroup"
|
"golang.org/x/sync/errgroup"
|
||||||
|
"strconv"
|
||||||
"sync"
|
"sync"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -54,7 +55,7 @@ type RawServerData struct {
|
||||||
// be loaded. If so, those requests are spun-up in additional routines and the final resulting
|
// be loaded. If so, those requests are spun-up in additional routines and the final resulting
|
||||||
// slice of all servers will be returned.
|
// slice of all servers will be returned.
|
||||||
func (r *Request) GetServers() ([]RawServerData, error) {
|
func (r *Request) GetServers() ([]RawServerData, error) {
|
||||||
resp, err := r.Get("/servers", D{"per_page": config.Get().RemoteQuery.BootServersPerPage})
|
resp, err := r.Get("/servers", Q{"per_page": strconv.Itoa(int(config.Get().RemoteQuery.BootServersPerPage))})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.WithStack(err)
|
return nil, errors.WithStack(err)
|
||||||
}
|
}
|
||||||
|
@ -82,7 +83,7 @@ func (r *Request) GetServers() ([]RawServerData, error) {
|
||||||
|
|
||||||
g, ctx := errgroup.WithContext(context.Background())
|
g, ctx := errgroup.WithContext(context.Background())
|
||||||
for i := res.Meta.CurrentPage + 1; i <= res.Meta.LastPage; i++ {
|
for i := res.Meta.CurrentPage + 1; i <= res.Meta.LastPage; i++ {
|
||||||
page := i
|
page := strconv.Itoa(int(i))
|
||||||
|
|
||||||
g.Go(func() error {
|
g.Go(func() error {
|
||||||
select {
|
select {
|
||||||
|
@ -90,7 +91,7 @@ func (r *Request) GetServers() ([]RawServerData, error) {
|
||||||
return ctx.Err()
|
return ctx.Err()
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
resp, err := r.Get("/servers", D{"page": page, "per_page": pp})
|
resp, err := r.Get("/servers", Q{"page": page, "per_page": strconv.Itoa(int(pp))})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user