func call(ctx context.Context, method string, req proto.Message, resp proto.Message) error { payload, err := proto.Marshal(req) if err != nil { return err } url := baseUrl(ctx) + internal.ProjID(ctx) + "/" + method r, err := internal.HTTPClient(ctx).Post(url, "application/x-protobuf", bytes.NewReader(payload)) if err != nil { return err } defer r.Body.Close() all, err := ioutil.ReadAll(r.Body) if r.StatusCode != http.StatusOK { e := &errHTTP{ StatusCode: r.StatusCode, err: err, } if err == nil { e.Body = string(all) } return e } if err != nil { return err } if err = proto.Unmarshal(all, resp); err != nil { return err } return nil }
// NewReader creates a new io.ReadCloser to read the contents // of the object. func NewReader(ctx context.Context, bucket, name string) (io.ReadCloser, error) { hc := internal.HTTPClient(ctx) res, err := hc.Get(fmt.Sprintf("https://storage.googleapis.com/%s/%s", bucket, name)) if err != nil { return nil, err } if res.StatusCode == http.StatusNotFound { res.Body.Close() return nil, ErrObjectNotExist } if res.StatusCode < 200 || res.StatusCode > 299 { res.Body.Close() return res.Body, fmt.Errorf("storage: can't read object %v/%v, status code: %v", bucket, name, res.Status) } return res.Body, nil }