func (wr FrameWriteRequest) String() string {
	var des string
	if s, ok := wr.write.(fmt.Stringer); ok {
		des = s.String()
	} else {
		des = fmt.Sprintf("%T", wr.write)
	}
	return fmt.Sprintf("[FrameWriteRequest stream=%d, ch=%v, writer=%v]", wr.StreamID(), wr.done != nil, des)
}
String is for debugging only.
package http2
import "fmt"
type WriteScheduler interface {
	OpenStream(streamID uint32, options OpenStreamOptions)
	CloseStream(streamID uint32)
	AdjustStream(streamID uint32, priority PriorityParam)
	Push(wr FrameWriteRequest)
	Pop() (wr FrameWriteRequest, ok bool)
}
type OpenStreamOptions struct {
	PusherID uint32
}
type FrameWriteRequest struct {
	write writeFramer
	stream *stream
	done chan error
}
func (wr FrameWriteRequest) StreamID() uint32 {
	if wr.stream == nil {
		if se, ok := wr.write.(StreamError); ok {
			return se.StreamID
		}
		return 0
	}
	return wr.stream.id
}
func (wr FrameWriteRequest) isControl() bool {
	return wr.stream == nil
}
func (wr FrameWriteRequest) DataSize() int {
	if wd, ok := wr.write.(*writeData); ok {
		return len(wd.p)
	}
	return 0
}
func (wr FrameWriteRequest) Consume(n int32) (FrameWriteRequest, FrameWriteRequest, int) {
	var empty FrameWriteRequest
	wd, ok := wr.write.(*writeData)
	if !ok || len(wd.p) == 0 {
		return wr, empty, 1
	}
	allowed := wr.stream.flow.available()
	if n < allowed {
		allowed = n
	}
	if wr.stream.sc.maxFrameSize < allowed {
		allowed = wr.stream.sc.maxFrameSize
	}
	if allowed <= 0 {
		return empty, empty, 0
	}
	if len(wd.p) > int(allowed) {
		wr.stream.flow.take(allowed)
		consumed := FrameWriteRequest{
			stream: wr.stream,
			write: &writeData{
				streamID: wd.streamID,
				p:        wd.p[:allowed],
				endStream: false,
			},
			done: nil,
		}
		rest := FrameWriteRequest{
			stream: wr.stream,
			write: &writeData{
				streamID:  wd.streamID,
				p:         wd.p[allowed:],
				endStream: wd.endStream,
			},
			done: wr.done,
		}
		return consumed, rest, 2
	}
	wr.stream.flow.take(int32(len(wd.p)))
	return wr, empty, 1
}