code: func (d *driver) Reader(ctx context.Context, path string, offset int64) (io.ReadCloser, error) {
  	headers := make(http.Header)
  	headers.Add("Range", "bytes="+strconv.FormatInt(offset, 10)+"-")
  
  	resp, err := d.Bucket.GetResponseWithHeaders(d.ossPath(path), headers)
  	if err != nil {
  		return nil, parseError(path, err)
  	}
  
  	// Due to Aliyun OSS API, status 200 and whole object will be return instead of an
  	// InvalidRange error when range is invalid.
  	//
  	// OSS sever will always return http.StatusPartialContent if range is acceptable.
  	if resp.StatusCode != http.StatusPartialContent {
  		resp.Body.Close()
  		return ioutil.NopCloser(bytes.NewReader(nil)), nil
  	}
  
  	return resp.Body, nil
  }
docs: // Reader retrieves an io.ReadCloser for the content stored at "path" with a
  // given byte offset.