mirror of https://github.com/hashicorp/consul
68 lines
1.4 KiB
Go
68 lines
1.4 KiB
Go
package frame
|
|
|
|
import "io"
|
|
|
|
const (
|
|
rstBodySize = 4
|
|
rstFrameSize = headerSize + rstBodySize
|
|
)
|
|
|
|
// RsStreamRst is a STREAM_RST frame that is read from a transport
|
|
type RStreamRst struct {
|
|
Header
|
|
body [rstBodySize]byte
|
|
}
|
|
|
|
func (f *RStreamRst) readFrom(d deserializer) (err error) {
|
|
if f.Length() != rstBodySize {
|
|
return protoError("STREAM_RST length must be %d, got %d", rstBodySize, f.Length())
|
|
}
|
|
|
|
if _, err = io.ReadFull(d, f.body[:]); err != nil {
|
|
return
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func (f *RStreamRst) ErrorCode() ErrorCode {
|
|
return ErrorCode(order.Uint32(f.body[0:]))
|
|
}
|
|
|
|
// WStreamRst is a STREAM_RST frame that can be written, it terminate a stream ungracefully
|
|
type WStreamRst struct {
|
|
Header
|
|
all [rstFrameSize]byte
|
|
}
|
|
|
|
func NewWStreamRst() (f *WStreamRst) {
|
|
f = new(WStreamRst)
|
|
f.Header = Header(f.all[:headerSize])
|
|
return
|
|
}
|
|
|
|
func (f *WStreamRst) writeTo(s serializer) (err error) {
|
|
_, err = s.Write(f.all[:])
|
|
return
|
|
}
|
|
|
|
func (f *WStreamRst) Set(streamId StreamId, errorCode ErrorCode) (err error) {
|
|
if err = f.Header.SetAll(TypeStreamRst, rstBodySize, streamId, 0); err != nil {
|
|
return
|
|
}
|
|
|
|
if err = validRstErrorCode(errorCode); err != nil {
|
|
return
|
|
}
|
|
|
|
order.PutUint32(f.all[headerSize:], uint32(errorCode))
|
|
return
|
|
}
|
|
|
|
func validRstErrorCode(errorCode ErrorCode) error {
|
|
if errorCode >= NoSuchError {
|
|
return protoError("Invalid error code %d for STREAM_RST", errorCode)
|
|
}
|
|
return nil
|
|
}
|