func Process(value string) Option {
	return addParam("x-oss-process", value)
}
Process is an option to set x-oss-process param
package oss
import (
	"fmt"
	"net/http"
	"strconv"
	"strings"
	"time"
)
type optionType string
const (
	optionParam optionType = "HTTPParameter"  
	optionHTTP  optionType = "HTTPHeader"     
	optionArg   optionType = "FuncArgument"   
)
const (
	deleteObjectsQuiet = "delete-objects-quiet"
	routineNum         = "x-routine-num"
	checkpointConfig   = "x-cp-config"
	initCRC64          = "init-crc64"
	progressListener   = "x-progress-listener"
	storageClass       = "storage-class"
)
type (
	optionValue struct {
		Value interface{}
		Type  optionType
	}
	Option func(map[string]optionValue) error
)
func ACL(acl ACLType) Option {
	return setHeader(HTTPHeaderOssACL, string(acl))
}
func ContentType(value string) Option {
	return setHeader(HTTPHeaderContentType, value)
}
func ContentLength(length int64) Option {
	return setHeader(HTTPHeaderContentLength, strconv.FormatInt(length, 10))
}
func CacheControl(value string) Option {
	return setHeader(HTTPHeaderCacheControl, value)
}
func ContentDisposition(value string) Option {
	return setHeader(HTTPHeaderContentDisposition, value)
}
func ContentEncoding(value string) Option {
	return setHeader(HTTPHeaderContentEncoding, value)
}
func ContentMD5(value string) Option {
	return setHeader(HTTPHeaderContentMD5, value)
}
func Expires(t time.Time) Option {
	return setHeader(HTTPHeaderExpires, t.Format(http.TimeFormat))
}
func Meta(key, value string) Option {
	return setHeader(HTTPHeaderOssMetaPrefix+key, value)
}
func Range(start, end int64) Option {
	return setHeader(HTTPHeaderRange, fmt.Sprintf("bytes=%d-%d", start, end))
}
func NormalizedRange(nr string) Option {
	return setHeader(HTTPHeaderRange, fmt.Sprintf("bytes=%s", strings.TrimSpace(nr)))
}
func AcceptEncoding(value string) Option {
	return setHeader(HTTPHeaderAcceptEncoding, value)
}
func IfModifiedSince(t time.Time) Option {
	return setHeader(HTTPHeaderIfModifiedSince, t.Format(http.TimeFormat))
}
func IfUnmodifiedSince(t time.Time) Option {
	return setHeader(HTTPHeaderIfUnmodifiedSince, t.Format(http.TimeFormat))
}
func IfMatch(value string) Option {
	return setHeader(HTTPHeaderIfMatch, value)
}
func IfNoneMatch(value string) Option {
	return setHeader(HTTPHeaderIfNoneMatch, value)
}
func CopySource(sourceBucket, sourceObject string) Option {
	return setHeader(HTTPHeaderOssCopySource, "/"+sourceBucket+"/"+sourceObject)
}
func CopySourceRange(startPosition, partSize int64) Option {
	val := "bytes=" + strconv.FormatInt(startPosition, 10) + "-" +
		strconv.FormatInt((startPosition+partSize-1), 10)
	return setHeader(HTTPHeaderOssCopySourceRange, val)
}
func CopySourceIfMatch(value string) Option {
	return setHeader(HTTPHeaderOssCopySourceIfMatch, value)
}
func CopySourceIfNoneMatch(value string) Option {
	return setHeader(HTTPHeaderOssCopySourceIfNoneMatch, value)
}
func CopySourceIfModifiedSince(t time.Time) Option {
	return setHeader(HTTPHeaderOssCopySourceIfModifiedSince, t.Format(http.TimeFormat))
}
func CopySourceIfUnmodifiedSince(t time.Time) Option {
	return setHeader(HTTPHeaderOssCopySourceIfUnmodifiedSince, t.Format(http.TimeFormat))
}
func MetadataDirective(directive MetadataDirectiveType) Option {
	return setHeader(HTTPHeaderOssMetadataDirective, string(directive))
}
func ServerSideEncryption(value string) Option {
	return setHeader(HTTPHeaderOssServerSideEncryption, value)
}
func ObjectACL(acl ACLType) Option {
	return setHeader(HTTPHeaderOssObjectACL, string(acl))
}
func symlinkTarget(targetObjectKey string) Option {
	return setHeader(HTTPHeaderOssSymlinkTarget, targetObjectKey)
}
func Origin(value string) Option {
	return setHeader(HTTPHeaderOrigin, value)
}
func ObjectStorageClass(storageClass StorageClassType) Option {
	return setHeader(HTTPHeaderOssStorageClass, string(storageClass))
}
func Callback(callback string) Option {
	return setHeader(HTTPHeaderOssCallback, callback)
}
func CallbackVar(callbackVar string) Option {
	return setHeader(HTTPHeaderOssCallbackVar, callbackVar)
}
func RequestPayer(payerType PayerType) Option {
	return setHeader(HTTPHeaderOSSRequester, string(payerType))
}
func Delimiter(value string) Option {
	return addParam("delimiter", value)
}
func Marker(value string) Option {
	return addParam("marker", value)
}
func MaxKeys(value int) Option {
	return addParam("max-keys", strconv.Itoa(value))
}
func Prefix(value string) Option {
	return addParam("prefix", value)
}
func EncodingType(value string) Option {
	return addParam("encoding-type", value)
}
func MaxUploads(value int) Option {
	return addParam("max-uploads", strconv.Itoa(value))
}
func KeyMarker(value string) Option {
	return addParam("key-marker", value)
}
func UploadIDMarker(value string) Option {
	return addParam("upload-id-marker", value)
}
func MaxParts(value int) Option {
	return addParam("max-parts", strconv.Itoa(value))
}
func PartNumberMarker(value int) Option {
	return addParam("part-number-marker", strconv.Itoa(value))
}
func DeleteObjectsQuiet(isQuiet bool) Option {
	return addArg(deleteObjectsQuiet, isQuiet)
}
func StorageClass(value StorageClassType) Option {
	return addArg(storageClass, value)
}
type cpConfig struct {
	IsEnable bool
	FilePath string
	DirPath  string
}
func Checkpoint(isEnable bool, filePath string) Option {
	return addArg(checkpointConfig, &cpConfig{IsEnable: isEnable, FilePath: filePath})
}
func CheckpointDir(isEnable bool, dirPath string) Option {
	return addArg(checkpointConfig, &cpConfig{IsEnable: isEnable, DirPath: dirPath})
}
func Routines(n int) Option {
	return addArg(routineNum, n)
}
func InitCRC(initCRC uint64) Option {
	return addArg(initCRC64, initCRC)
}
func Progress(listener ProgressListener) Option {
	return addArg(progressListener, listener)
}
func ResponseContentType(value string) Option {
	return addParam("response-content-type", value)
}
func ResponseContentLanguage(value string) Option {
	return addParam("response-content-language", value)
}
func ResponseExpires(value string) Option {
	return addParam("response-expires", value)
}
func ResponseCacheControl(value string) Option {
	return addParam("response-cache-control", value)
}
func ResponseContentDisposition(value string) Option {
	return addParam("response-content-disposition", value)
}
func ResponseContentEncoding(value string) Option {
	return addParam("response-content-encoding", value)
}