Browse Source

Merge pull request #61 from aliyun/fix-sign-url

Fix sign url
baiyubin 8 years ago
parent
commit
2d4691ac1a
8 changed files with 107 additions and 25 deletions
  1. 16 11
      CHANGELOG.md
  2. 1 1
      README-CN.md
  3. 1 1
      README.md
  4. 63 0
      oss/bucket_test.go
  5. 20 9
      oss/conn.go
  6. 1 1
      oss/const.go
  7. 3 1
      oss/download.go
  8. 2 1
      sample.go

+ 16 - 11
CHANGELOG.md

@@ -1,5 +1,10 @@
 # ChangeLog - Aliyun OSS SDK for Go
 
+## 版本号:1.5.1 日期:2017-08-04
+### 变更内容
+ - 修复:SignURL中Key编码的问题
+ - 修复:DownloadFile下载完成后rename失败的问题
+ 
 ## 版本号:1.5.0 日期:2017-07-25
 ### 变更内容
  - 增加:支持生成URL签名
@@ -34,20 +39,20 @@
 
 ## 版本号:1.2.0 日期:2016-10-18
 ### 变更内容
- - 支持CRC64校验
- - 修复计算MD5占用内存大的问题
- - 修复CopyObject时Object名称没有URL编码的问题
- - 支持指定Useragent
+ - 增加:支持CRC64校验
+ - 增加:支持指定Useragent
+ - 修复:计算MD5占用内存大的问题
+ - 修复:CopyObject时Object名称没有URL编码的问题
 
 ## 版本号:1.1.0 日期:2016-08-09
 ### 变更内容
- - 支持代理服务器
+ - 增加:支持代理服务器
 
 ## 版本号:1.0.0 日期:2016-06-24
 ### 变更内容
- - 增加断点分片复制接口Bucket.CopyFile
- - 增加Bucket间复制接口Bucket.CopyObjectTo、Bucket.CopyObjectFrom
- - 增加Client.GetBucketInfo接口
- - Bucket.UploadPartCopy支持Bucket间复制
- - 修复断点上传、断点下载出错后,协程不退出的Bug
- - 去除接口Bucket.CopyObjectToBucket
+ - 增加断点分片复制接口Bucket.CopyFile
+ - 增加Bucket间复制接口Bucket.CopyObjectTo、Bucket.CopyObjectFrom
+ - 增加Client.GetBucketInfo接口
+ - 增加:Bucket.UploadPartCopy支持Bucket间复制
+ - 修复断点上传、断点下载出错后,协程不退出的Bug
+ - 删除:接口Bucket.CopyObjectToBucket

+ 1 - 1
README-CN.md

@@ -13,7 +13,7 @@
 > - 使用此SDK,用户可以方便地在任何应用、任何时间、任何地点上传,下载和管理数据。
 
 ## 版本
-> - 当前版本:1.5.0
+> - 当前版本:1.5.1
 
 ## 运行环境
 > - 推荐使用Go 1.4及以上。

+ 1 - 1
README.md

@@ -13,7 +13,7 @@
 > - With this SDK, you can upload, download and manage data on any app anytime and anywhere conveniently. 
 
 ## Version
-> - Current version: 1.5.0. 
+> - Current version: 1.5.1. 
 
 ## Running Environment
 > - Go 1.4 or above is recommended. 

+ 63 - 0
oss/bucket_test.go

@@ -371,6 +371,69 @@ func (s *OssBucketSuite) TestSignURL(c *C) {
 	c.Assert(err, NotNil)
 }
 
+func (s *OssBucketSuite) TestSignURLWithEscapedKey(c *C) {
+	// key with '/'
+	objectName := "zyimg/86/e8/653b5dc97bb0022051a84c632bc4"
+	objectValue := "弃我去者,昨日之日不可留;乱我心者,今日之日多烦忧。长风万里送秋雁,对此可以酣高楼。蓬莱文章建安骨,中间小谢又清发。" +
+		"俱怀逸兴壮思飞,欲上青天揽明月。抽刀断水水更流,举杯销愁愁更愁。人生在世不称意,明朝散发弄扁舟。"
+
+	// sign url for put
+	str, err := s.bucket.SignURL(objectName, HTTPPut, 60)
+	c.Assert(err, IsNil)
+	c.Assert(strings.Contains(str, HTTPParamExpires+"="), Equals, true)
+	c.Assert(strings.Contains(str, HTTPParamAccessKeyID+"="), Equals, true)
+	c.Assert(strings.Contains(str, HTTPParamSignature+"="), Equals, true)
+
+	// put object with url
+	err = s.bucket.PutObjectWithURL(str, strings.NewReader(objectValue))
+	c.Assert(err, IsNil)
+
+	// sign url for get object
+	str, err = s.bucket.SignURL(objectName, HTTPGet, 60)
+	c.Assert(err, IsNil)
+	c.Assert(strings.Contains(str, HTTPParamExpires+"="), Equals, true)
+	c.Assert(strings.Contains(str, HTTPParamAccessKeyID+"="), Equals, true)
+	c.Assert(strings.Contains(str, HTTPParamSignature+"="), Equals, true)
+
+	// get object with url
+	body, err := s.bucket.GetObjectWithURL(str)
+	c.Assert(err, IsNil)
+	str, err = readBody(body)
+	c.Assert(err, IsNil)
+	c.Assert(str, Equals, objectValue)
+
+	// key with Chinese chars
+	objectName = "风吹柳花满店香,吴姬压酒劝客尝。金陵子弟来相送,欲行不行各尽觞。请君试问东流水,别意与之谁短长。"
+
+	// sign url for put
+	str, err = s.bucket.SignURL(objectName, HTTPPut, 60)
+	c.Assert(err, IsNil)
+	c.Assert(strings.Contains(str, HTTPParamExpires+"="), Equals, true)
+	c.Assert(strings.Contains(str, HTTPParamAccessKeyID+"="), Equals, true)
+	c.Assert(strings.Contains(str, HTTPParamSignature+"="), Equals, true)
+
+	// put object with url
+	err = s.bucket.PutObjectWithURL(str, strings.NewReader(objectValue))
+	c.Assert(err, IsNil)
+
+	// sign url for get object
+	str, err = s.bucket.SignURL(objectName, HTTPGet, 60)
+	c.Assert(err, IsNil)
+	c.Assert(strings.Contains(str, HTTPParamExpires+"="), Equals, true)
+	c.Assert(strings.Contains(str, HTTPParamAccessKeyID+"="), Equals, true)
+	c.Assert(strings.Contains(str, HTTPParamSignature+"="), Equals, true)
+
+	// get object with url
+	body, err = s.bucket.GetObjectWithURL(str)
+	c.Assert(err, IsNil)
+	str, err = readBody(body)
+	c.Assert(err, IsNil)
+	c.Assert(str, Equals, objectValue)
+
+	err = s.bucket.DeleteObject(objectName)
+	c.Assert(err, IsNil)
+}
+
 // TestPutObjectType
 func (s *OssBucketSuite) TestPutObjectType(c *C) {
 	objectName := objectNamePrefix + "tptt"

+ 20 - 9
oss/conn.go

@@ -295,7 +295,7 @@ func (conn Conn) signURL(method HTTPMethod, bucketName, objectName string, expir
 	}
 
 	urlParams := conn.getURLParams(params)
-	return conn.url.getURL(bucketName, objectName, urlParams).String()
+	return conn.url.getSignURL(bucketName, objectName, urlParams)
 }
 
 // handle request body
@@ -555,6 +555,24 @@ func (um *urlMaker) Init(endpoint string, isCname bool, isProxy bool) {
 
 // Build URL
 func (um urlMaker) getURL(bucket, object, params string) *url.URL {
+	host, path := um.buildURL(bucket, object)
+	uri := &url.URL{
+		Scheme:   um.Scheme,
+		Host:     host,
+		Path:     path,
+		RawQuery: params,
+	}
+	return uri
+}
+
+// Build Sign URL
+func (um urlMaker) getSignURL(bucket, object, params string) string {
+	host, path := um.buildURL(bucket, object)
+	return fmt.Sprintf("%s://%s%s?%s", um.Scheme, host, path, params)
+}
+
+// Build URL
+func (um urlMaker) buildURL(bucket, object string) (string, string) {
 	var host = ""
 	var path = ""
 
@@ -583,14 +601,7 @@ func (um urlMaker) getURL(bucket, object, params string) *url.URL {
 		}
 	}
 
-	uri := &url.URL{
-		Scheme:   um.Scheme,
-		Host:     host,
-		Path:     path,
-		RawQuery: params,
-	}
-
-	return uri
+	return host, path
 }
 
 // Canonicalized Resource

+ 1 - 1
oss/const.go

@@ -128,5 +128,5 @@ const (
 
 	CheckpointFileSuffix = ".cp" // Checkpoint文件后缀
 
-	Version = "1.5.0" // Go sdk版本
+	Version = "1.5.1" // Go sdk版本
 )

+ 3 - 1
oss/download.go

@@ -116,20 +116,22 @@ func downloadWorker(id int, arg downloadWorkerArg, jobs <-chan downloadPart, res
 			failed <- err
 			break
 		}
-		defer fd.Close()
 
 		_, err = fd.Seek(part.Start-part.Offset, os.SEEK_SET)
 		if err != nil {
+			fd.Close()
 			failed <- err
 			break
 		}
 
 		_, err = io.Copy(fd, rd)
 		if err != nil {
+			fd.Close()
 			failed <- err
 			break
 		}
 
+		fd.Close()
 		results <- part
 	}
 }

+ 2 - 1
sample.go

@@ -4,7 +4,8 @@ package main
 
 import (
 	"fmt"
-	"sample"
+    
+	"github.com/aliyun/aliyun-oss-go-sdk/sample"
 )
 
 func main() {