github.com/gogf/gf/v2@v2.7.4/internal/utils/utils_io.go (about) 1 // Copyright GoFrame Author(https://goframe.org). All Rights Reserved. 2 // 3 // This Source Code Form is subject to the terms of the MIT License. 4 // If a copy of the MIT was not distributed with this file, 5 // You can obtain one at https://github.com/gogf/gf. 6 7 package utils 8 9 import ( 10 "io" 11 ) 12 13 // ReadCloser implements the io.ReadCloser interface 14 // which is used for reading request body content multiple times. 15 // 16 // Note that it cannot be closed. 17 type ReadCloser struct { 18 index int // Current read position. 19 content []byte // Content. 20 repeatable bool // Mark the content can be repeatable read. 21 } 22 23 // NewReadCloser creates and returns a RepeatReadCloser object. 24 func NewReadCloser(content []byte, repeatable bool) io.ReadCloser { 25 return &ReadCloser{ 26 content: content, 27 repeatable: repeatable, 28 } 29 } 30 31 // Read implements the io.ReadCloser interface. 32 func (b *ReadCloser) Read(p []byte) (n int, err error) { 33 // Make it repeatable reading. 34 if b.index >= len(b.content) && b.repeatable { 35 b.index = 0 36 } 37 n = copy(p, b.content[b.index:]) 38 b.index += n 39 if b.index >= len(b.content) { 40 return n, io.EOF 41 } 42 return n, nil 43 } 44 45 // Close implements the io.ReadCloser interface. 46 func (b *ReadCloser) Close() error { 47 return nil 48 }