Prechádzať zdrojové kódy

Use regular []byte in bufreader

Viktor Sokolov 1 mesiac pred
rodič
commit
5e352db7ab

+ 12 - 15
bufreader/bufreader.go

@@ -3,7 +3,6 @@
 package bufreader
 
 import (
-	"bytes"
 	"io"
 )
 
@@ -16,7 +15,7 @@ type ReadPeeker interface {
 // Reader is a buffered reader that reads from an io.Reader and caches the data.
 type Reader struct {
 	r   io.Reader
-	buf *bytes.Buffer
+	buf []byte
 	pos int
 }
 
@@ -24,7 +23,7 @@ type Reader struct {
 func New(r io.Reader) *Reader {
 	br := Reader{
 		r:   r,
-		buf: bytes.NewBuffer(make([]byte, 0)),
+		buf: nil,
 	}
 	return &br
 }
@@ -35,26 +34,25 @@ func (br *Reader) Read(p []byte) (int, error) {
 		return 0, err
 	}
 
-	n := copy(p, br.buf.Bytes()[br.pos:])
+	n := copy(p, br.buf[br.pos:])
 	br.pos += n
 	return n, nil
 }
 
 // Peek returns the next n bytes from the buffered reader without advancing the position.
 func (br *Reader) Peek(n int) ([]byte, error) {
-	need := br.pos + n
-	err := br.fetch(need)
+	err := br.fetch(br.pos + n)
 	if err != nil && err != io.EOF {
 		return nil, err
 	}
 
 	// Return slice of buffered data without advancing position
-	available := br.buf.Bytes()[br.pos:]
+	available := br.buf[br.pos:]
 	if len(available) == 0 && err == io.EOF {
 		return nil, io.EOF
 	}
 
-	return available[:n], nil
+	return available[:min(len(available), n)], nil
 }
 
 // Rewind seeks buffer to the beginning
@@ -64,19 +62,18 @@ func (br *Reader) Rewind() {
 
 // fetch ensures the buffer contains at least 'need' bytes
 func (br *Reader) fetch(need int) error {
-	n := need - br.buf.Len()
-	if n <= 0 {
+	if need-len(br.buf) <= 0 {
 		return nil
 	}
 
-	bytesRead, err := br.buf.ReadFrom(io.LimitReader(br.r, int64(n)))
-	if err != nil {
+	b := make([]byte, need)
+	n, err := io.ReadFull(br.r, b)
+	if err != nil && err != io.ErrUnexpectedEOF {
 		return err
 	}
 
-	if bytesRead == 0 {
-		return io.EOF
-	}
+	// append only those which we read in fact
+	br.buf = append(br.buf, b[:n]...)
 
 	return nil
 }

+ 2 - 2
bufreader/bufreader_test.go

@@ -84,8 +84,8 @@ func (s *BufferedReaderTestSuite) TestPeek() {
 	s.Equal("hello", string(p))
 	s.Equal(5, br.pos) // Position should now be updated
 
-	// Peek at the next 6 bytes
-	peeked2, err := br.Peek(6)
+	// Peek at the next 7 bytes (which are beyond the EOF)
+	peeked2, err := br.Peek(7)
 	s.Require().NoError(err)
 	s.Equal(" world", string(peeked2))
 	s.Equal(5, br.pos) // Position should still be 5

+ 1 - 1
imagetype_new/registry.go

@@ -61,7 +61,7 @@ func (r *Registry) RegisterType(desc *TypeDesc) Type {
 // GetTypeDesc returns the TypeDesc for the given Type.
 // Returns nil if the type is not registered.
 func (r *Registry) GetTypeDesc(t Type) *TypeDesc {
-	if t <= 0 {
+	if t <= 0 { // This would be "default" type
 		return nil
 	}
 

+ 1 - 1
imagetype_new/type.go

@@ -93,7 +93,7 @@ func (t Type) SupportsAnimationSave() bool {
 	return false
 }
 
-// SupportsColourProfile checks if the image type supports metadata.
+// SupportsColourProfile checks if the image type supports colour profiles.
 func (t Type) SupportsColourProfile() bool {
 	desc := GetTypeDesc(t)
 	if desc != nil {

+ 1 - 1
server.go

@@ -41,7 +41,7 @@ func buildRouter() *router.Router {
 func startServer(cancel context.CancelFunc) (*http.Server, error) {
 	l, err := reuseport.Listen(config.Network, config.Bind)
 	if err != nil {
-		return nil, fmt.Errorf("Can't start server: %s", err)
+		return nil, fmt.Errorf("can't start server: %s", err)
 	}
 
 	if config.MaxClients > 0 {