package yamuximport ()typeErrorstruct { msg string timeout, temporary bool}func ( *Error) () string {return .msg}func ( *Error) () bool {return .timeout}func ( *Error) () bool {return .temporary}typeGoAwayErrorstruct { ErrorCode uint32 Remote bool}func ( *GoAwayError) () string {if .Remote {returnfmt.Sprintf("remote sent go away, code: %d", .ErrorCode) }returnfmt.Sprintf("sent go away, code: %d", .ErrorCode)}func ( *GoAwayError) () bool {returnfalse}func ( *GoAwayError) () bool {returnfalse}func ( *GoAwayError) ( error) bool {// to maintain compatibility with errors returned by previous versionsif .Remote && == ErrRemoteGoAway {returntrue } elseif !.Remote && == ErrSessionShutdown {returntrue } elseif == ErrStreamReset {// A GoAway on a connection also resets all the streams.returntrue }if , := .(*GoAwayError); {return * == * }returnfalse}// A StreamError is used for errors returned from Read and Write calls after the stream is ResettypeStreamErrorstruct { ErrorCode uint32 Remote bool}func ( *StreamError) () string {if .Remote {returnfmt.Sprintf("stream reset by remote, error code: %d", .ErrorCode) }returnfmt.Sprintf("stream reset, error code: %d", .ErrorCode)}func ( *StreamError) ( error) bool {if == ErrStreamReset {returntrue } , := .(*StreamError)return && * == *}var (// ErrInvalidVersion means we received a frame with an // invalid versionErrInvalidVersion = &Error{msg: "invalid protocol version"}// ErrInvalidMsgType means we received a frame with an // invalid message typeErrInvalidMsgType = &Error{msg: "invalid msg type"}// ErrSessionShutdown is used if there is a shutdown during // an operationErrSessionShutdown = &GoAwayError{ErrorCode: goAwayNormal, Remote: false}// ErrStreamsExhausted is returned if we have no more // stream ids to issueErrStreamsExhausted = &Error{msg: "streams exhausted"}// ErrDuplicateStream is used if a duplicate stream is // opened inboundErrDuplicateStream = &Error{msg: "duplicate stream initiated"}// ErrReceiveWindowExceeded indicates the window was exceededErrRecvWindowExceeded = &Error{msg: "recv window exceeded"}// ErrTimeout is used when we reach an IO deadlineErrTimeout = &Error{msg: "i/o deadline reached", timeout: true, temporary: true}// ErrStreamClosed is returned when using a closed streamErrStreamClosed = &Error{msg: "stream closed"}// ErrUnexpectedFlag is set when we get an unexpected flagErrUnexpectedFlag = &Error{msg: "unexpected flag"}// ErrRemoteGoAway is used when we get a go away from the other side with error code // goAwayNormal(0).ErrRemoteGoAway = &GoAwayError{Remote: true, ErrorCode: goAwayNormal}// ErrStreamReset is sent if a stream is reset. This can happen // if the backlog is exceeded, or if there was a remote GoAway.ErrStreamReset = &Error{msg: "stream reset"}// ErrConnectionWriteTimeout indicates that we hit the "safety valve" // timeout writing to the underlying stream connection.ErrConnectionWriteTimeout = &Error{msg: "connection write timeout", timeout: true}// ErrKeepAliveTimeout is sent if a missed keepalive caused the stream closeErrKeepAliveTimeout = &Error{msg: "keepalive timeout", timeout: true} errSendLoopDone = errors.New("send loop done"))const (// protoVersion is the only version we support protoVersion uint8 = 0)const (// Data is used for data frames. They are followed // by length bytes worth of payload. typeData uint8 = iota// WindowUpdate is used to change the window of // a given stream. The length indicates the delta // update to the window. typeWindowUpdate// Ping is sent as a keep-alive or to measure // the RTT. The StreamID and Length value are echoed // back in the response. typePing// GoAway is sent to terminate a session. The StreamID // should be 0 and the length is an error code. typeGoAway)const (// SYN is sent to signal a new stream. May // be sent with a data payload flagSYN uint16 = 1 << iota// ACK is sent to acknowledge a new stream. May // be sent with a data payload flagACK// FIN is sent to half-close the given stream. // May be sent with a data payload. flagFIN// RST is used to hard close a given stream. flagRST)const (// initialStreamWindow is the initial stream window size. // It's not an implementation choice, the value defined in the specification. initialStreamWindow = 256 * 1024 maxStreamWindow = 16 * 1024 * 1024 goAwayWaitTime = 100 * time.Millisecond)const (// goAwayNormal is sent on a normal termination goAwayNormal uint32 = iota// goAwayProtoErr sent on a protocol error goAwayProtoErr// goAwayInternalErr sent on an internal error goAwayInternalErr)const ( sizeOfVersion = 1 sizeOfType = 1 sizeOfFlags = 2 sizeOfStreamID = 4 sizeOfLength = 4 headerSize = sizeOfVersion + sizeOfType + sizeOfFlags +sizeOfStreamID + sizeOfLength)type header [headerSize]bytefunc ( header) () uint8 {return [0]}func ( header) () uint8 {return [1]}func ( header) () uint16 {returnbinary.BigEndian.Uint16([2:4])}func ( header) () uint32 {returnbinary.BigEndian.Uint32([4:8])}func ( header) () uint32 {returnbinary.BigEndian.Uint32([8:12])}func ( header) () string {returnfmt.Sprintf("Vsn:%d Type:%d Flags:%d StreamID:%d Length:%d", .Version(), .MsgType(), .Flags(), .StreamID(), .Length())}func encode( uint8, uint16, uint32, uint32) header {varheader [0] = protoVersion [1] = binary.BigEndian.PutUint16([2:4], )binary.BigEndian.PutUint32([4:8], )binary.BigEndian.PutUint32([8:12], )return}
The pages are generated with Goldsv0.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.