mirror of
https://github.com/cedar2025/hysteria.git
synced 2025-07-20 01:48:01 +00:00
hysteria 2 prototype first public release
This commit is contained in:
62
core/internal/utils/qstream.go
Normal file
62
core/internal/utils/qstream.go
Normal file
@@ -0,0 +1,62 @@
|
||||
package utils
|
||||
|
||||
import (
|
||||
"context"
|
||||
"time"
|
||||
|
||||
"github.com/quic-go/quic-go"
|
||||
)
|
||||
|
||||
// QStream is a wrapper of quic.Stream that handles Close() in a way that
|
||||
// makes more sense to us. By default, quic.Stream's Close() only closes
|
||||
// the write side of the stream, not the read side. And if there is unread
|
||||
// data, the stream is not really considered closed until either the data
|
||||
// is drained or CancelRead() is called.
|
||||
// References:
|
||||
// - https://github.com/libp2p/go-libp2p/blob/master/p2p/transport/quic/stream.go
|
||||
// - https://github.com/quic-go/quic-go/issues/3558
|
||||
// - https://github.com/quic-go/quic-go/issues/1599
|
||||
type QStream struct {
|
||||
Stream quic.Stream
|
||||
}
|
||||
|
||||
func (s *QStream) StreamID() quic.StreamID {
|
||||
return s.Stream.StreamID()
|
||||
}
|
||||
|
||||
func (s *QStream) Read(p []byte) (n int, err error) {
|
||||
return s.Stream.Read(p)
|
||||
}
|
||||
|
||||
func (s *QStream) CancelRead(code quic.StreamErrorCode) {
|
||||
s.Stream.CancelRead(code)
|
||||
}
|
||||
|
||||
func (s *QStream) SetReadDeadline(t time.Time) error {
|
||||
return s.Stream.SetReadDeadline(t)
|
||||
}
|
||||
|
||||
func (s *QStream) Write(p []byte) (n int, err error) {
|
||||
return s.Stream.Write(p)
|
||||
}
|
||||
|
||||
func (s *QStream) Close() error {
|
||||
s.Stream.CancelRead(0)
|
||||
return s.Stream.Close()
|
||||
}
|
||||
|
||||
func (s *QStream) CancelWrite(code quic.StreamErrorCode) {
|
||||
s.Stream.CancelWrite(code)
|
||||
}
|
||||
|
||||
func (s *QStream) Context() context.Context {
|
||||
return s.Stream.Context()
|
||||
}
|
||||
|
||||
func (s *QStream) SetWriteDeadline(t time.Time) error {
|
||||
return s.Stream.SetWriteDeadline(t)
|
||||
}
|
||||
|
||||
func (s *QStream) SetDeadline(t time.Time) error {
|
||||
return s.Stream.SetDeadline(t)
|
||||
}
|
Reference in New Issue
Block a user