mirror of
https://github.com/eiblog/eiblog.git
synced 2026-02-15 10:52:26 +08:00
update vendor
This commit is contained in:
4
vendor/github.com/qiniu/x/bytes.v7/README.md
generated
vendored
Normal file
4
vendor/github.com/qiniu/x/bytes.v7/README.md
generated
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
qiniupkg.com/x/bytes.v7
|
||||
=====
|
||||
|
||||
Extension module of golang bytes processing
|
||||
177
vendor/github.com/qiniu/x/bytes.v7/bytes.go
generated
vendored
Normal file
177
vendor/github.com/qiniu/x/bytes.v7/bytes.go
generated
vendored
Normal file
@@ -0,0 +1,177 @@
|
||||
package bytes
|
||||
|
||||
import (
|
||||
"io"
|
||||
"syscall"
|
||||
)
|
||||
|
||||
// ---------------------------------------------------
|
||||
|
||||
type Reader struct {
|
||||
b []byte
|
||||
off int
|
||||
}
|
||||
|
||||
func NewReader(val []byte) *Reader {
|
||||
return &Reader{val, 0}
|
||||
}
|
||||
|
||||
func (r *Reader) Len() int {
|
||||
if r.off >= len(r.b) {
|
||||
return 0
|
||||
}
|
||||
return len(r.b) - r.off
|
||||
}
|
||||
|
||||
func (r *Reader) Bytes() []byte {
|
||||
return r.b[r.off:]
|
||||
}
|
||||
|
||||
func (r *Reader) SeekToBegin() (err error) {
|
||||
r.off = 0
|
||||
return
|
||||
}
|
||||
|
||||
func (r *Reader) Seek(offset int64, whence int) (ret int64, err error) {
|
||||
switch whence {
|
||||
case 0:
|
||||
case 1:
|
||||
offset += int64(r.off)
|
||||
case 2:
|
||||
offset += int64(len(r.b))
|
||||
default:
|
||||
err = syscall.EINVAL
|
||||
return
|
||||
}
|
||||
if offset < 0 {
|
||||
err = syscall.EINVAL
|
||||
return
|
||||
}
|
||||
if offset >= int64(len(r.b)) {
|
||||
r.off = len(r.b)
|
||||
} else {
|
||||
r.off = int(offset)
|
||||
}
|
||||
ret = int64(r.off)
|
||||
return
|
||||
}
|
||||
|
||||
func (r *Reader) Read(val []byte) (n int, err error) {
|
||||
n = copy(val, r.b[r.off:])
|
||||
if n == 0 && len(val) != 0 {
|
||||
err = io.EOF
|
||||
return
|
||||
}
|
||||
r.off += n
|
||||
return
|
||||
}
|
||||
|
||||
func (r *Reader) Close() (err error) {
|
||||
return
|
||||
}
|
||||
|
||||
// ---------------------------------------------------
|
||||
|
||||
type Writer struct {
|
||||
b []byte
|
||||
n int
|
||||
}
|
||||
|
||||
func NewWriter(buff []byte) *Writer {
|
||||
return &Writer{buff, 0}
|
||||
}
|
||||
|
||||
func (p *Writer) Write(val []byte) (n int, err error) {
|
||||
n = copy(p.b[p.n:], val)
|
||||
if n == 0 && len(val) > 0 {
|
||||
err = io.EOF
|
||||
return
|
||||
}
|
||||
p.n += n
|
||||
return
|
||||
}
|
||||
|
||||
func (p *Writer) Len() int {
|
||||
return p.n
|
||||
}
|
||||
|
||||
func (p *Writer) Bytes() []byte {
|
||||
return p.b[:p.n]
|
||||
}
|
||||
|
||||
func (p *Writer) Reset() {
|
||||
p.n = 0
|
||||
}
|
||||
|
||||
// ---------------------------------------------------
|
||||
|
||||
type Buffer struct {
|
||||
b []byte
|
||||
}
|
||||
|
||||
func NewBuffer() *Buffer {
|
||||
return new(Buffer)
|
||||
}
|
||||
|
||||
func (p *Buffer) ReadAt(buf []byte, off int64) (n int, err error) {
|
||||
ioff := int(off)
|
||||
if len(p.b) <= ioff {
|
||||
return 0, io.EOF
|
||||
}
|
||||
n = copy(buf, p.b[ioff:])
|
||||
if n != len(buf) {
|
||||
err = io.EOF
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func (p *Buffer) WriteAt(buf []byte, off int64) (n int, err error) {
|
||||
ioff := int(off)
|
||||
iend := ioff + len(buf)
|
||||
if len(p.b) < iend {
|
||||
if len(p.b) == ioff {
|
||||
p.b = append(p.b, buf...)
|
||||
return len(buf), nil
|
||||
}
|
||||
zero := make([]byte, iend-len(p.b))
|
||||
p.b = append(p.b, zero...)
|
||||
}
|
||||
copy(p.b[ioff:], buf)
|
||||
return len(buf), nil
|
||||
}
|
||||
|
||||
func (p *Buffer) WriteStringAt(buf string, off int64) (n int, err error) {
|
||||
ioff := int(off)
|
||||
iend := ioff + len(buf)
|
||||
if len(p.b) < iend {
|
||||
if len(p.b) == ioff {
|
||||
p.b = append(p.b, buf...)
|
||||
return len(buf), nil
|
||||
}
|
||||
zero := make([]byte, iend-len(p.b))
|
||||
p.b = append(p.b, zero...)
|
||||
}
|
||||
copy(p.b[ioff:], buf)
|
||||
return len(buf), nil
|
||||
}
|
||||
|
||||
func (p *Buffer) Truncate(fsize int64) (err error) {
|
||||
size := int(fsize)
|
||||
if len(p.b) < size {
|
||||
zero := make([]byte, size-len(p.b))
|
||||
p.b = append(p.b, zero...)
|
||||
} else {
|
||||
p.b = p.b[:size]
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *Buffer) Buffer() []byte {
|
||||
return p.b
|
||||
}
|
||||
|
||||
func (p *Buffer) Len() int {
|
||||
return len(p.b)
|
||||
}
|
||||
|
||||
// ---------------------------------------------------
|
||||
60
vendor/github.com/qiniu/x/bytes.v7/bytes_test.go
generated
vendored
Normal file
60
vendor/github.com/qiniu/x/bytes.v7/bytes_test.go
generated
vendored
Normal file
@@ -0,0 +1,60 @@
|
||||
package bytes
|
||||
|
||||
import (
|
||||
"io"
|
||||
"testing"
|
||||
)
|
||||
|
||||
// ---------------------------------------------------
|
||||
|
||||
func TestBuffer(t *testing.T) {
|
||||
|
||||
b := NewBuffer()
|
||||
n, err := b.WriteStringAt("Hello", 4)
|
||||
if n != 5 || err != nil {
|
||||
t.Fatal("WriteStringAt failed:", n, err)
|
||||
}
|
||||
if b.Len() != 9 {
|
||||
t.Fatal("Buffer.Len invalid (9 is required):", b.Len())
|
||||
}
|
||||
|
||||
buf := make([]byte, 10)
|
||||
n, err = b.ReadAt(buf, 50)
|
||||
if n != 0 || err != io.EOF {
|
||||
t.Fatal("ReadAt failed:", n, err)
|
||||
}
|
||||
|
||||
n, err = b.ReadAt(buf, 6)
|
||||
if n != 3 || err != io.EOF || string(buf[:n]) != "llo" {
|
||||
t.Fatal("ReadAt failed:", n, err, string(buf[:n]))
|
||||
}
|
||||
|
||||
n, err = b.WriteAt([]byte("Hi h"), 1)
|
||||
if n != 4 || err != nil {
|
||||
t.Fatal("WriteAt failed:", n, err)
|
||||
}
|
||||
if b.Len() != 9 {
|
||||
t.Fatal("Buffer.Len invalid (9 is required):", b.Len())
|
||||
}
|
||||
|
||||
n, err = b.ReadAt(buf, 0)
|
||||
if n != 9 || err != io.EOF || string(buf[:n]) != "\x00Hi hello" {
|
||||
t.Fatal("ReadAt failed:", n, err)
|
||||
}
|
||||
|
||||
n, err = b.WriteStringAt("LO world!", 7)
|
||||
if n != 9 || err != nil {
|
||||
t.Fatal("WriteStringAt failed:", n, err)
|
||||
}
|
||||
if b.Len() != 16 {
|
||||
t.Fatal("Buffer.Len invalid (16 is required):", b.Len())
|
||||
}
|
||||
|
||||
buf = make([]byte, 17)
|
||||
n, err = b.ReadAt(buf, 0)
|
||||
if n != 16 || err != io.EOF || string(buf[:n]) != "\x00Hi helLO world!" {
|
||||
t.Fatal("ReadAt failed:", n, err, string(buf[:n]))
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------------------------
|
||||
34
vendor/github.com/qiniu/x/bytes.v7/doc.go
generated
vendored
Normal file
34
vendor/github.com/qiniu/x/bytes.v7/doc.go
generated
vendored
Normal file
@@ -0,0 +1,34 @@
|
||||
/*
|
||||
包 qiniupkg.com/x/bytes.v7 提供了 byte slice 相关的功能扩展
|
||||
|
||||
NewReader 创建一个 byte slice 的只读流:
|
||||
|
||||
var slice []byte
|
||||
...
|
||||
r := bytes.NewReader(slice)
|
||||
...
|
||||
r.Seek(0, 0) // r.SeekToBegin()
|
||||
...
|
||||
|
||||
和标准库的 bytes.NewReader 不同的是,这里的 Reader 支持 Seek。
|
||||
|
||||
NewWriter 创建一个有上限容量的写流:
|
||||
|
||||
slice := make([]byte, 1024)
|
||||
w := bytes.NewWriter(slice)
|
||||
...
|
||||
writtenData := w.Bytes()
|
||||
|
||||
如果我们向 w 里面写入超过 1024 字节的数据,那么多余的数据会被丢弃。
|
||||
|
||||
NewBuffer 创建一个可随机读写的内存文件,支持 ReadAt/WriteAt 方法,而不是 Read/Write:
|
||||
|
||||
b := bytes.NewBuffer()
|
||||
b.Truncate(100)
|
||||
b.WriteAt([]byte("hello"), 100)
|
||||
slice := make([]byte, 105)
|
||||
n, err := b.ReadAt(slice, 0)
|
||||
...
|
||||
*/
|
||||
package bytes
|
||||
|
||||
54
vendor/github.com/qiniu/x/bytes.v7/replace.go
generated
vendored
Normal file
54
vendor/github.com/qiniu/x/bytes.v7/replace.go
generated
vendored
Normal file
@@ -0,0 +1,54 @@
|
||||
package bytes
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
)
|
||||
|
||||
// ---------------------------------------------------
|
||||
|
||||
func ReplaceAt(b []byte, off, nsrc int, dest []byte) []byte {
|
||||
|
||||
ndelta := len(dest) - nsrc
|
||||
if ndelta < 0 {
|
||||
left := b[off+nsrc:]
|
||||
off += copy(b[off:], dest)
|
||||
off += copy(b[off:], left)
|
||||
return b[:off]
|
||||
}
|
||||
|
||||
if ndelta > 0 {
|
||||
b = append(b, dest[:ndelta]...)
|
||||
copy(b[off+len(dest):], b[off+nsrc:])
|
||||
copy(b[off:], dest)
|
||||
} else {
|
||||
copy(b[off:], dest)
|
||||
}
|
||||
return b
|
||||
}
|
||||
|
||||
func ReplaceOne(b []byte, from int, src, dest []byte) ([]byte, int) {
|
||||
|
||||
pos := bytes.Index(b[from:], src)
|
||||
if pos < 0 {
|
||||
return b, -1
|
||||
}
|
||||
|
||||
from += pos
|
||||
return ReplaceAt(b, from, len(src), dest), from + len(dest)
|
||||
}
|
||||
|
||||
func Replace(b []byte, src, dest []byte, n int) []byte {
|
||||
|
||||
from := 0
|
||||
for n != 0 {
|
||||
b, from = ReplaceOne(b, from, src, dest)
|
||||
if from < 0 {
|
||||
break
|
||||
}
|
||||
n--
|
||||
}
|
||||
return b
|
||||
}
|
||||
|
||||
// ---------------------------------------------------
|
||||
|
||||
54
vendor/github.com/qiniu/x/bytes.v7/replace_test.go
generated
vendored
Normal file
54
vendor/github.com/qiniu/x/bytes.v7/replace_test.go
generated
vendored
Normal file
@@ -0,0 +1,54 @@
|
||||
package bytes
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
type replaceCase struct {
|
||||
s string
|
||||
src string
|
||||
dest string
|
||||
n int
|
||||
}
|
||||
|
||||
func stringReplace(b string, src, dest string, n int) string {
|
||||
|
||||
return string(Replace([]byte(b), []byte(src), []byte(dest), n))
|
||||
}
|
||||
|
||||
func TestReplace(t *testing.T) {
|
||||
|
||||
cases := []replaceCase{
|
||||
{"hello, world!", "world", "xsw", -1},
|
||||
{"hello, world world world", "world", "xsw", 1},
|
||||
{"hello, world world world", "world", "xsw", 2},
|
||||
{"hello, world world world", "world", "xsw", -1},
|
||||
{"hello, xsw!", "xsw", "world", -1},
|
||||
{"hello, xsw xsw xsw", "xsw", "world", 1},
|
||||
{"hello, xsw xsw xsw", "xsw", "world", 2},
|
||||
{"hello, xsw xsw xsw", "xsw", "world", -1},
|
||||
}
|
||||
|
||||
for _, c := range cases {
|
||||
ret := stringReplace(c.s, c.src, c.dest, c.n)
|
||||
expected := strings.Replace(c.s, c.src, c.dest, c.n)
|
||||
if ret != expected {
|
||||
t.Fatal("Replace failed:", c, "ret:", ret, "expected:", expected)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func stringInsertAt(b string, off int, text string) string {
|
||||
|
||||
return string(ReplaceAt([]byte(b), off, 0, []byte(text)))
|
||||
}
|
||||
|
||||
func TestInsertAt(t *testing.T) {
|
||||
|
||||
ret := stringInsertAt("helloworld", 5, ", ")
|
||||
if ret != "hello, world" {
|
||||
t.Fatal("InsertAt failed:", ret)
|
||||
}
|
||||
}
|
||||
|
||||
63
vendor/github.com/qiniu/x/bytes.v7/seekable/seekable.go
generated
vendored
Normal file
63
vendor/github.com/qiniu/x/bytes.v7/seekable/seekable.go
generated
vendored
Normal file
@@ -0,0 +1,63 @@
|
||||
// This package provide a method to read and replace http.Request's body.
|
||||
package seekable
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
|
||||
"qiniupkg.com/x/bytes.v7"
|
||||
)
|
||||
|
||||
// ---------------------------------------------------
|
||||
|
||||
type Seekabler interface {
|
||||
Bytes() []byte
|
||||
Read(val []byte) (n int, err error)
|
||||
SeekToBegin() error
|
||||
}
|
||||
|
||||
type SeekableCloser interface {
|
||||
Seekabler
|
||||
io.Closer
|
||||
}
|
||||
|
||||
// ---------------------------------------------------
|
||||
|
||||
type readCloser struct {
|
||||
Seekabler
|
||||
io.Closer
|
||||
}
|
||||
|
||||
var ErrNoBody = errors.New("no body")
|
||||
|
||||
func New(req *http.Request) (r SeekableCloser, err error) {
|
||||
if req.Body == nil {
|
||||
return nil, ErrNoBody
|
||||
}
|
||||
var ok bool
|
||||
if r, ok = req.Body.(SeekableCloser); ok {
|
||||
return
|
||||
}
|
||||
b, err2 := ReadAll(req)
|
||||
if err2 != nil {
|
||||
return nil, err2
|
||||
}
|
||||
r = bytes.NewReader(b)
|
||||
req.Body = readCloser{r, req.Body}
|
||||
return
|
||||
}
|
||||
|
||||
func ReadAll(req *http.Request) (b []byte, err error) {
|
||||
if req.ContentLength > 0 {
|
||||
b = make([]byte, int(req.ContentLength))
|
||||
_, err = io.ReadFull(req.Body, b)
|
||||
return
|
||||
} else if req.ContentLength == 0 {
|
||||
return nil, ErrNoBody
|
||||
}
|
||||
return ioutil.ReadAll(req.Body)
|
||||
}
|
||||
|
||||
// ---------------------------------------------------
|
||||
43
vendor/github.com/qiniu/x/bytes.v7/seekable/seekable_test.go
generated
vendored
Normal file
43
vendor/github.com/qiniu/x/bytes.v7/seekable/seekable_test.go
generated
vendored
Normal file
@@ -0,0 +1,43 @@
|
||||
package seekable
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"net/http"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestSeekable_EOFIfReqAlreadyParsed(t *testing.T) {
|
||||
body := "a=1"
|
||||
req, err := http.NewRequest("POST", "/a", bytes.NewBufferString(body))
|
||||
assert.NoError(t, err)
|
||||
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
|
||||
req.Header.Set("Content-Length", "3")
|
||||
req.ParseForm()
|
||||
_, err = New(req)
|
||||
assert.Equal(t, err.Error(), "EOF")
|
||||
}
|
||||
|
||||
func TestSeekable_WorkaroundForEOF(t *testing.T) {
|
||||
body := "a=1"
|
||||
req, err := http.NewRequest("POST", "/a", bytes.NewBufferString(body))
|
||||
assert.NoError(t, err)
|
||||
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
|
||||
req.Header.Set("Content-Length", "3")
|
||||
_, _ = New(req)
|
||||
req.ParseForm()
|
||||
assert.Equal(t, req.FormValue("a"), "1")
|
||||
_, err = New(req)
|
||||
assert.NoError(t, err)
|
||||
}
|
||||
|
||||
func TestSeekable(t *testing.T) {
|
||||
body := "a=1"
|
||||
req, err := http.NewRequest("POST", "/a", bytes.NewBufferString(body))
|
||||
assert.NoError(t, err)
|
||||
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
|
||||
req.Header.Set("Content-Length", "3")
|
||||
_, err = New(req)
|
||||
assert.NoError(t, err)
|
||||
}
|
||||
Reference in New Issue
Block a user