// Get an s3.Object with a ReadCloser for the body. func (self *Bucket) GetKey(id cryptools.NamedSigner, key string) (obj *Object, err os.Error) { hreq, err := NewQueryRequest(id, self.Endpoint, "GET", self.Name, key, "", "", nil, nil) if err != nil { return } cc, err := self.Endpoint.NewHTTPClientConn("tcp", "", nil) if err != nil { return } defer cc.Close() resp, err := awsconn.SendRequest(cc, hreq) if err != nil { return } switch resp.StatusCode { case 403: err = ErrorAccessDenied case 404: err = ErrorKeyNotFound case 200: obj = &Object{Key: key, Body: resp.Body} default: err = os.NewError("Unhandled response code: " + resp.Status) } return }
// Returns true if a key exists in the bucket. // Note(1): This is not a "cheap" operation. Cheaper than get-object, yes, // but it still does a full remote operation to test. // Note(2): Due to amazons eventual consistancy, you should not rely solely // on the result of this function as deterministic that a key has not been // set. It is quite possible that a key will be set and an immediate check // of the same will fail, so retry logic should be built into the caller // (stack) func (self *Bucket) Exists(id cryptools.NamedSigner, key string) (exists bool, err os.Error) { hreq, err := NewQueryRequest(id, self.Endpoint, "HEAD", self.Name, key, "", "", nil, nil) if err != nil { return } cc, err := self.Endpoint.NewHTTPClientConn("tcp", "", nil) if err != nil { return } defer cc.Close() resp, err := awsconn.SendRequest(cc, hreq) if err != nil { return } switch resp.StatusCode { case 404: exists = false case 200: exists = true default: err = os.NewError("Unexpected response: " + resp.Status) } return }