first to commit project
This commit is contained in:
85
helper.go
Normal file
85
helper.go
Normal file
@@ -0,0 +1,85 @@
|
||||
package cos
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"crypto/md5"
|
||||
"crypto/sha1"
|
||||
"fmt"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
// 计算 md5 或 sha1 时的分块大小
|
||||
const calDigestBlockSize = 1024 * 1024 * 10
|
||||
|
||||
func calMD5Digest(msg []byte) []byte {
|
||||
// TODO: 分块计算,减少内存消耗
|
||||
m := md5.New()
|
||||
m.Write(msg)
|
||||
return m.Sum(nil)
|
||||
}
|
||||
|
||||
func calSHA1Digest(msg []byte) []byte {
|
||||
// TODO: 分块计算,减少内存消耗
|
||||
m := sha1.New()
|
||||
m.Write(msg)
|
||||
return m.Sum(nil)
|
||||
}
|
||||
|
||||
// cloneRequest returns a clone of the provided *http.Request. The clone is a
|
||||
// shallow copy of the struct and its Header map.
|
||||
func cloneRequest(r *http.Request) *http.Request {
|
||||
// shallow copy of the struct
|
||||
r2 := new(http.Request)
|
||||
*r2 = *r
|
||||
// deep copy of the Header
|
||||
r2.Header = make(http.Header, len(r.Header))
|
||||
for k, s := range r.Header {
|
||||
r2.Header[k] = append([]string(nil), s...)
|
||||
}
|
||||
return r2
|
||||
}
|
||||
|
||||
// encodeURIComponent like same function in javascript
|
||||
//
|
||||
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent
|
||||
//
|
||||
// http://www.ecma-international.org/ecma-262/6.0/#sec-uri-syntax-and-semantics
|
||||
func encodeURIComponent(s string) string {
|
||||
var b bytes.Buffer
|
||||
written := 0
|
||||
|
||||
for i, n := 0, len(s); i < n; i++ {
|
||||
c := s[i]
|
||||
|
||||
switch c {
|
||||
case '-', '_', '.', '!', '~', '*', '\'', '(', ')':
|
||||
continue
|
||||
default:
|
||||
// Unreserved according to RFC 3986 sec 2.3
|
||||
if 'a' <= c && c <= 'z' {
|
||||
|
||||
continue
|
||||
|
||||
}
|
||||
if 'A' <= c && c <= 'Z' {
|
||||
|
||||
continue
|
||||
|
||||
}
|
||||
if '0' <= c && c <= '9' {
|
||||
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
b.WriteString(s[written:i])
|
||||
fmt.Fprintf(&b, "%%%02x", c)
|
||||
written = i + 1
|
||||
}
|
||||
|
||||
if written == 0 {
|
||||
return s
|
||||
}
|
||||
b.WriteString(s[written:])
|
||||
return b.String()
|
||||
}
|
||||
Reference in New Issue
Block a user