You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
go-library/vendor/github.com/qiniu/go-sdk/v7/storage/region.go

269 lines
6.4 KiB

2 years ago
package storage
import (
"context"
"fmt"
"github.com/qiniu/go-sdk/v7/auth"
"github.com/qiniu/go-sdk/v7/client"
2 years ago
"strings"
2 years ago
)
// 存储所在的地区,例如华东,华南,华北
// 每个存储区域可能有多个机房信息,每个机房可能有多个上传入口
type Region struct {
// 上传入口
SrcUpHosts []string `json:"src_up,omitempty"`
// 加速上传入口
CdnUpHosts []string `json:"cdn_up,omitempty"`
// 获取文件信息入口
RsHost string `json:"rs,omitempty"`
// bucket列举入口
RsfHost string `json:"rsf,omitempty"`
ApiHost string `json:"api,omitempty"`
// 存储io 入口
IovipHost string `json:"io,omitempty"`
}
type RegionID string
// GetDefaultReion 根据RegionID获取对应的Region信息
func GetRegionByID(regionID RegionID) (Region, bool) {
if r, ok := regionMap[regionID]; ok {
return r, ok
}
return Region{}, false
}
func (r *Region) String() string {
str := ""
str += fmt.Sprintf("SrcUpHosts: %v\n", r.SrcUpHosts)
str += fmt.Sprintf("CdnUpHosts: %v\n", r.CdnUpHosts)
str += fmt.Sprintf("IovipHost: %s\n", r.IovipHost)
str += fmt.Sprintf("RsHost: %s\n", r.RsHost)
str += fmt.Sprintf("RsfHost: %s\n", r.RsfHost)
str += fmt.Sprintf("ApiHost: %s\n", r.ApiHost)
return str
}
func endpoint(useHttps bool, host string) string {
host = strings.TrimSpace(host)
host = strings.TrimLeft(host, "http://")
host = strings.TrimLeft(host, "https://")
if host == "" {
return ""
}
scheme := "http://"
if useHttps {
scheme = "https://"
}
return fmt.Sprintf("%s%s", scheme, host)
}
// 获取rsfHost
func (r *Region) GetRsfHost(useHttps bool) string {
return endpoint(useHttps, r.RsfHost)
}
// 获取io host
func (r *Region) GetIoHost(useHttps bool) string {
return endpoint(useHttps, r.IovipHost)
}
// 获取RsHost
func (r *Region) GetRsHost(useHttps bool) string {
return endpoint(useHttps, r.RsHost)
}
// 获取api host
func (r *Region) GetApiHost(useHttps bool) string {
return endpoint(useHttps, r.ApiHost)
}
var (
// regionHuadong 表示华东机房
regionHuadong = Region{
SrcUpHosts: []string{
"up.qiniup.com",
},
CdnUpHosts: []string{
"upload.qiniup.com",
},
RsHost: "rs.qbox.me",
RsfHost: "rsf.qbox.me",
ApiHost: "api.qiniu.com",
IovipHost: "iovip.qbox.me",
}
// regionHuadongZhejiang2 表示华东-浙江2
regionHuadongZhejiang2 = Region{
SrcUpHosts: []string{
"up-cn-east-2.qiniup.com",
},
CdnUpHosts: []string{
"upload-cn-east-2.qiniup.com",
},
RsHost: "rs-cn-east-2.qiniuapi.com",
2 years ago
RsfHost: "rsf-cn-east-2.qiniuapi.com",
2 years ago
ApiHost: "api-cn-east-2.qiniuapi.com",
IovipHost: "iovip-cn-east-2.qiniuio.com",
}
// regionHuabei 表示华北机房
regionHuabei = Region{
SrcUpHosts: []string{
"up-z1.qiniup.com",
},
CdnUpHosts: []string{
"upload-z1.qiniup.com",
},
RsHost: "rs-z1.qbox.me",
RsfHost: "rsf-z1.qbox.me",
ApiHost: "api-z1.qiniuapi.com",
IovipHost: "iovip-z1.qbox.me",
}
2 years ago
2 years ago
// regionHuanan 表示华南机房
regionHuanan = Region{
SrcUpHosts: []string{
"up-z2.qiniup.com",
},
CdnUpHosts: []string{
"upload-z2.qiniup.com",
},
RsHost: "rs-z2.qbox.me",
RsfHost: "rsf-z2.qbox.me",
ApiHost: "api-z2.qiniuapi.com",
IovipHost: "iovip-z2.qbox.me",
}
// regionNorthAmerica 表示北美机房
regionNorthAmerica = Region{
SrcUpHosts: []string{
"up-na0.qiniup.com",
},
CdnUpHosts: []string{
"upload-na0.qiniup.com",
},
RsHost: "rs-na0.qbox.me",
RsfHost: "rsf-na0.qbox.me",
ApiHost: "api-na0.qiniuapi.com",
IovipHost: "iovip-na0.qbox.me",
}
2 years ago
2 years ago
// regionSingapore 表示新加坡机房
regionSingapore = Region{
SrcUpHosts: []string{
"up-as0.qiniup.com",
},
CdnUpHosts: []string{
"upload-as0.qiniup.com",
},
RsHost: "rs-as0.qbox.me",
RsfHost: "rsf-as0.qbox.me",
ApiHost: "api-as0.qiniuapi.com",
IovipHost: "iovip-as0.qbox.me",
}
2 years ago
// regionApNortheast1 表示亚太-首尔机房
regionApNortheast1 = Region{
2 years ago
SrcUpHosts: []string{
2 years ago
"up-ap-northeast-1.qiniup.com",
2 years ago
},
CdnUpHosts: []string{
2 years ago
"upload-ap-northeast-1.qiniup.com",
2 years ago
},
2 years ago
RsHost: "rs-ap-northeast-1.qiniuapi.com",
RsfHost: "rsf-ap-northeast-1.qiniuapi.com",
ApiHost: "api-ap-northeast-1.qiniuapi.com",
IovipHost: "iovip-ap-northeast-1.qiniuio.com",
2 years ago
}
)
const (
// region code
RIDHuadong = RegionID("z0")
RIDHuadongZheJiang2 = RegionID("cn-east-2")
RIDHuabei = RegionID("z1")
RIDHuanan = RegionID("z2")
RIDNorthAmerica = RegionID("na0")
RIDSingapore = RegionID("as0")
2 years ago
RIDApNortheast1 = RegionID("ap-northeast-1")
2 years ago
)
// regionMap 是RegionID到具体的Region的映射
var regionMap = map[RegionID]Region{
RIDHuadong: regionHuadong,
RIDHuadongZheJiang2: regionHuadongZhejiang2,
RIDHuanan: regionHuanan,
RIDHuabei: regionHuabei,
RIDSingapore: regionSingapore,
RIDNorthAmerica: regionNorthAmerica,
2 years ago
RIDApNortheast1: regionApNortheast1,
2 years ago
}
/// UcHost 为查询空间相关域名的API服务地址
/// 设置 UcHost 时,如果不指定 scheme 默认会使用 https
/// UcHost 已废弃,建议使用 SetUcHost
//Deprecated
var UcHost = "https://uc.qbox.me"
var ucHost = ""
func SetUcHost(host string, useHttps bool) {
ucHost = endpoint(useHttps, host)
}
func getUcHostByDefaultProtocol() string {
return getUcHost(true)
}
func getUcHost(useHttps bool) string {
if ucHost != "" {
return ucHost
}
if strings.Contains(UcHost, "://") {
return UcHost
} else {
return endpoint(useHttps, UcHost)
}
}
// GetRegion 用来根据ak和bucket来获取空间相关的机房信息
2 years ago
// 延用 v2, v2 结构和 v4 结构不同且暂不可替代
2 years ago
func GetRegion(ak, bucket string) (*Region, error) {
2 years ago
return getRegionByV2(ak, bucket)
2 years ago
}
2 years ago
// 使用 v4
func getRegionGroup(ak, bucket string) (*RegionGroup, error) {
return getRegionByV4(ak, bucket)
2 years ago
}
type RegionInfo struct {
ID string `json:"id"`
Description string `json:"description"`
}
2 years ago
func SetRegionCachePath(newPath string) {
setRegionV2CachePath(newPath)
setRegionV4CachePath(newPath)
}
2 years ago
func GetRegionsInfo(mac *auth.Credentials) ([]RegionInfo, error) {
var regions struct {
Regions []RegionInfo `json:"regions"`
}
qErr := client.DefaultClient.CredentialedCallWithForm(context.Background(), mac, auth.TokenQiniu, &regions, "GET", getUcHostByDefaultProtocol()+"/regions", nil, nil)
if qErr != nil {
return nil, fmt.Errorf("query region error, %s", qErr.Error())
} else {
return regions.Regions, nil
}
}