// Read a single client record using a partial read from S3 using the given // headers, which should contain a "Range: bytes=M-N" header. func getClientRecord(bucket *s3.Bucket, o *MessageLocation, headers map[string][]string) ([]byte, error) { resp, err := bucket.GetResponseWithHeaders(o.Key, headers) if err != nil { return nil, err } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err == nil && len(body) != int(o.Length) { err = fmt.Errorf("Unexpected body length: %d != %d\n", len(body), o.Length) } return body, err }
// Callers must call Close() on rc. func getS3Reader(bucket *s3.Bucket, s3Key string, offset uint64) (rc io.ReadCloser, err error) { if offset == 0 { rc, err = bucket.GetReader(s3Key) return } headers := map[string][]string{ "Range": []string{fmt.Sprintf("bytes=%d-", offset)}, } resp, err := bucket.GetResponseWithHeaders(s3Key, headers) if resp != nil { rc = resp.Body } return }