// GetResource opens the resource (metadata/blob), if it exists, via // the HTTP API and returns it. If it does not exist or hasn't been // uploaded yet then errors.NotFound is returned. func (c *UnitFacadeClient) GetResource(resourceName string) (resource.Resource, io.ReadCloser, error) { var response *http.Response req, err := api.NewHTTPDownloadRequest(resourceName) if err != nil { return resource.Resource{}, nil, errors.Annotate(err, "failed to build API request") } if err := c.Do(req, nil, &response); err != nil { return resource.Resource{}, nil, errors.Annotate(err, "HTTP request failed") } // HACK(katco): Combine this into one request? resourceInfo, err := c.getResourceInfo(resourceName) if err != nil { return resource.Resource{}, nil, errors.Trace(err) } // TODO(katco): Check headers against resource info // TODO(katco): Check in on all the response headers return resourceInfo, response.Body, nil }
func (s *LegacyHTTPHandlerSuite) TestIntegration(c *gc.C) { opened := resourcetesting.NewResource(c, s.stub, "spam", "a-service", "some data") s.store.ReturnOpenResource = opened s.deps.ReturnConnect = s.store h := server.NewLegacyHTTPHandler(s.deps.Connect) req, err := api.NewHTTPDownloadRequest("spam") c.Assert(err, jc.ErrorIsNil) req.URL, err = url.ParseRequestURI("https://api:17017/units/eggs/1/resources/spam?:resource=spam") c.Assert(err, jc.ErrorIsNil) resp := &fakeResponseWriter{ stubResponseWriter: s.resp, } h.ServeHTTP(resp, req) resp.checkWritten(c, "some data", http.Header{ "Content-Type": []string{api.ContentTypeRaw}, "Content-Length": []string{"9"}, // len("some data") "Content-Sha384": []string{opened.Fingerprint.String()}, }) }