code: func (d *driver) Reader(ctx context.Context, path string, offset int64) (io.ReadCloser, error) {
  	headers := make(swift.Headers)
  	headers["Range"] = "bytes=" + strconv.FormatInt(offset, 10) + "-"
  
  	waitingTime := readAfterWriteWait
  	endTime := time.Now().Add(readAfterWriteTimeout)
  
  	for {
  		file, headers, err := d.Conn.ObjectOpen(d.Container, d.swiftPath(path), false, headers)
  		if err != nil {
  			if err == swift.ObjectNotFound {
  				return nil, storagedriver.PathNotFoundError{Path: path}
  			}
  			if swiftErr, ok := err.(*swift.Error); ok && swiftErr.StatusCode == http.StatusRequestedRangeNotSatisfiable {
  				return ioutil.NopCloser(bytes.NewReader(nil)), nil
  			}
  			return file, err
  		}
  
  		//if this is a DLO and it is clear that segments are still missing,
  		//wait until they show up
  		_, isDLO := headers["X-Object-Manifest"]
  		size, err := file.Length()
  		if err != nil {
  			return file, err
  		}
  		if isDLO && size == 0 {
  			if time.Now().Add(waitingTime).After(endTime) {
  				return nil, fmt.Errorf("timeout expired while waiting for segments of %s to show up", path)
  			}
  			time.Sleep(waitingTime)
  			waitingTime *= 2
  			continue
  		}
  
  		//if not, then this reader will be fine
  		return file, nil
  	}
  }
docs: // Reader retrieves an io.ReadCloser for the content stored at "path" with a
  // given byte offset.