github.com/qiniu/go-sdk/v7@v7.27.0/types.go (about)

     1  package api
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"io"
     7  	"net/http"
     8  
     9  	internal_io "github.com/qiniu/go-sdk/v7/internal/io"
    10  )
    11  
    12  // BytesFromRequest 读取 http.Request.Body 的内容到 slice 中
    13  func BytesFromRequest(r *http.Request) ([]byte, error) {
    14  	if bytesNopCloser, ok := r.Body.(*internal_io.BytesNopCloser); ok {
    15  		return bytesNopCloser.Bytes(), nil
    16  	}
    17  
    18  	// 不能大于10G
    19  	if r.ContentLength > 1024*1024*1024*10 {
    20  		return nil, fmt.Errorf("content length too large:%d", r.ContentLength)
    21  	}
    22  
    23  	contentLength := int(r.ContentLength) + 1024
    24  	buf := bytes.NewBuffer(make([]byte, 0, contentLength))
    25  	_, err := io.Copy(buf, r.Body)
    26  	if err != nil {
    27  		return nil, err
    28  	}
    29  	return buf.Bytes(), nil
    30  }
    31  
    32  // SeekerLen 通过 io.Seeker 获取数据大小
    33  func SeekerLen(s io.Seeker) (int64, error) {
    34  	curOffset, err := s.Seek(0, io.SeekCurrent)
    35  	if err != nil {
    36  		return 0, err
    37  	}
    38  
    39  	endOffset, err := s.Seek(0, io.SeekEnd)
    40  	if err != nil {
    41  		return 0, err
    42  	}
    43  
    44  	_, err = s.Seek(curOffset, io.SeekStart)
    45  	if err != nil {
    46  		return 0, err
    47  	}
    48  
    49  	return endOffset - curOffset, nil
    50  }