Source File
buffer.go
Belonging Package
github.com/soheilhy/cmux
// Copyright 2016 The CMux Authors. All rights reserved.//// Licensed under the Apache License, Version 2.0 (the "License");// you may not use this file except in compliance with the License.// You may obtain a copy of the License at//// http://www.apache.org/licenses/LICENSE-2.0//// Unless required by applicable law or agreed to in writing, software// distributed under the License is distributed on an "AS IS" BASIS,// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or// implied. See the License for the specific language governing// permissions and limitations under the License.package cmuximport ()// bufferedReader is an optimized implementation of io.Reader that behaves like// ```// io.MultiReader(bytes.NewReader(buffer.Bytes()), io.TeeReader(source, buffer))// ```// without allocating.type bufferedReader struct {source io.Readerbuffer bytes.BufferbufferRead intbufferSize intsniffing boollastErr error}func ( *bufferedReader) ( []byte) (int, error) {if .bufferSize > .bufferRead {// If we have already read something from the buffer before, we return the// same data and the last error if any. We need to immediately return,// otherwise we may block for ever, if we try to be smart and call// source.Read() seeking a little bit of more data.:= copy(, .buffer.Bytes()[.bufferRead:.bufferSize]).bufferRead +=return , .lastErr} else if !.sniffing && .buffer.Cap() != 0 {// We don't need the buffer anymore.// Reset it to release the internal slice..buffer = bytes.Buffer{}}// If there is nothing more to return in the sniffed buffer, read from the// source., := .source.Read()if > 0 && .sniffing {.lastErr =if , := .buffer.Write([:]); != nil {return ,}}return ,}func ( *bufferedReader) ( bool) {.sniffing =.bufferRead = 0.bufferSize = .buffer.Len()}
![]() |
The pages are generated with Golds v0.8.2. (GOOS=linux GOARCH=amd64) Golds is a Go 101 project developed by Tapir Liu. PR and bug reports are welcome and can be submitted to the issue list. Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds. |