71 lines
1.3 KiB
Go
71 lines
1.3 KiB
Go
package websocket
|
|
|
|
import (
|
|
"io"
|
|
"net"
|
|
"net/http"
|
|
"time"
|
|
)
|
|
|
|
var (
|
|
_ net.Conn = (*http2Stream)(nil)
|
|
)
|
|
|
|
// http2Stream is a wrapper for HTTP/2 extended CONNECT tunnel.
|
|
type http2Stream struct {
|
|
io.ReadCloser
|
|
io.Writer
|
|
rc *http.ResponseController
|
|
}
|
|
|
|
func (s *http2Stream) Read(p []byte) (int, error) {
|
|
return s.ReadCloser.Read(p)
|
|
}
|
|
|
|
func (s *http2Stream) Write(p []byte) (int, error) {
|
|
n, err := s.Writer.Write(p)
|
|
if err != nil {
|
|
return n, err
|
|
}
|
|
err = s.rc.Flush()
|
|
return n, err
|
|
}
|
|
|
|
func (s *http2Stream) Flush() error {
|
|
return s.rc.Flush()
|
|
}
|
|
|
|
func (s *http2Stream) Close() error {
|
|
return s.ReadCloser.Close()
|
|
}
|
|
|
|
// LocalAddr is not implemented for HTTP/2 streams.
|
|
// May be taken from request if needed.
|
|
func (s *http2Stream) LocalAddr() net.Addr {
|
|
return &net.TCPAddr{}
|
|
}
|
|
|
|
// RemoteAddr is not implemented for HTTP/2 streams.
|
|
// May be taken from request if needed.
|
|
func (s *http2Stream) RemoteAddr() net.Addr {
|
|
return &net.TCPAddr{}
|
|
}
|
|
|
|
// SetDeadline ...
|
|
func (s *http2Stream) SetDeadline(t time.Time) error {
|
|
if err := s.rc.SetWriteDeadline(t); err != nil {
|
|
return err
|
|
}
|
|
return s.rc.SetReadDeadline(t)
|
|
}
|
|
|
|
// SetReadDeadline ...
|
|
func (s *http2Stream) SetReadDeadline(t time.Time) error {
|
|
return s.rc.SetReadDeadline(t)
|
|
}
|
|
|
|
// SetWriteDeadline ...
|
|
func (s *http2Stream) SetWriteDeadline(t time.Time) error {
|
|
return s.rc.SetWriteDeadline(t)
|
|
}
|