gonextcloud/utils.go

59 lines
1.5 KiB
Go

package gonextcloud
import (
"encoding/json"
req "github.com/levigross/grequests"
"github.com/partitio/gonextcloud/types"
"net/http"
"net/url"
"path"
"strings"
)
func (c *Client) baseRequest(route *url.URL, name string, subroute string, ro *req.RequestOptions, method string) (*req.Response, error) {
if !c.loggedIn() {
return nil, errUnauthorized
}
u := c.baseURL.ResolveReference(route)
if name != "" {
u.Path = path.Join(u.Path, name)
}
if subroute != "" {
u.Path = path.Join(u.Path, subroute)
}
var (
res *req.Response
err error
)
if method == http.MethodGet {
res, err = c.session.Get(u.String(), ro)
} else if method == http.MethodPost {
res, err = c.session.Post(u.String(), ro)
} else if method == http.MethodPut {
res, err = c.session.Put(u.String(), ro)
} else if method == http.MethodDelete {
res, err = c.session.Delete(u.String(), ro)
}
if err != nil {
return nil, err
}
// As we cannot read the ReaderCloser twice, we use the string content
js := res.String()
var r types.BaseResponse
json.Unmarshal([]byte(js), &r)
if r.Ocs.Meta.Statuscode != 200 {
err := types.ErrorFromMeta(r.Ocs.Meta)
return nil, err
}
return res, nil
}
func reformatJSON(json string) string {
// Nextcloud encode boolean as string
json = strings.Replace(json, "\"true\"", "true", -1)
json = strings.Replace(json, "\"false\"", "false", -1)
// Nextcloud encode quota as an empty array for never connected users
json = strings.Replace(json, "\"quota\":[],", "", -1)
return json
}