/
githubmirror
/
GoFrame
Обзор
Документация
Войти
/
githubmirror
/
GoFrame
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
internal/utils/utils_io.go
66 строк
2 KB
John Guo
change errors wrapped by gerror.Wrap with error stack info for all packages
21 дек 2021, 17:59
21 дек 2021, 17:59
ce93b62
Код
Авторство
О чём код?
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved. // // This Source Code Form is subject to the terms of the MIT License. // If a copy of the MIT was not distributed with this file, // You can obtain one at https://github.com/gogf/gf. package utils import ( "io" "io/ioutil" "github.com/gogf/gf/v2/errors/gerror" ) // ReadCloser implements the io.ReadCloser interface // which is used for reading request body content multiple times. // // Note that it cannot be closed. type ReadCloser struct { index int // Current read position. content []byte // Content. repeatable bool } // NewReadCloser creates and returns a RepeatReadCloser object. func NewReadCloser(content []byte, repeatable bool) io.ReadCloser { return &ReadCloser{ content: content, repeatable: repeatable, } } // NewReadCloserWithReadCloser creates and returns a RepeatReadCloser object // with given io.ReadCloser. func NewReadCloserWithReadCloser(r io.ReadCloser, repeatable bool) (io.ReadCloser, error) { content, err := ioutil.ReadAll(r) if err != nil { err = gerror.Wrapf(err, `ioutil.ReadAll failed`) return nil, err } defer r.Close() return &ReadCloser{ content: content, repeatable: repeatable, }, nil } // Read implements the io.ReadCloser interface. func (b *ReadCloser) Read(p []byte) (n int, err error) { n = copy(p, b.content[b.index:]) b.index += n if b.index >= len(b.content) { // Make it repeatable reading. if b.repeatable { b.index = 0 } return n, io.EOF } return n, nil } // Close implements the io.ReadCloser interface. func (b *ReadCloser) Close() error { return nil }