Example #1
0
// 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
}
Example #2
0
// 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
}